使用SignalR实现简单聊天室和推送广告
所需材料:一个SignalR处理程序、一个前端页面、一个后端推广告服务、配置。
1、SignalR继承自Hub,里面有一个群发消息的方法,可以控制访问权限。
/// <summary>
/// 演示用
/// </summary>
public class SRDemo : Hub
{
//[Authorize]//此属性可禁止没有token的用户使用websocket,因为Program中已经配置了相关限制
/// <summary>
///群发信息
/// </summary>
/// <returns></returns>
public async Task SendMessage(string user, string message)
{
string connId = this.Context?.ConnectionId ?? "";
string msg = $"{connId}:{user}:{DateTime.UtcNow}:{message}";
if (Clients != null)
{
await Clients.All.SendAsync("ReceiveMessage", user, msg);
}
}
}
2、前端页面、所需js文件用添加客户端库的方式添加。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<div class="container">
<div class="row"> </div>
<div class="row">
<div class="col-2">User</div>
<div class="col-4"><input type="text" id="userInput" /></div>
</div>
<div class="row">
<div class="col-2">Message</div>
<div class="col-4"><input type="text" id="messageInput" /></div>
</div>
<div class="row"> </div>
<div class="row">
<div class="col-6">
<input type="button" id="sendButton" value="Send Message" />
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<hr />
</div>
</div>
<div class="row">
<div class="col-6">
<ul id="messagesList"></ul>
</div>
</div>
<script src="js/signalr/dist/browser/signalr.min.js"></script>
<script src="js/chat.js"></script>
</body>
</html>
3、后端推广告服务,继承BackgroundService,每2秒推一条信息。
/// <summary>
/// 后台服务的demo
/// </summary>
public class HSDemo : BackgroundService
{
/// <summary>
/// demo 需要在program.cs中注册为sington
/// </summary>
/// <param name="stoppingToken"></param>
/// <returns></returns>
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
//连接Signal服务
var hubConnection = new HubConnectionBuilder().WithUrl("https://localhost:7289/Hubs/Demo").Build();
await hubConnection.StartAsync();
try
{
while (!stoppingToken.IsCancellationRequested)
{
await Task.Delay(2000);
try
{
await hubConnection.InvokeAsync("SendMessage", "server", Guid.NewGuid().ToString());
}
catch (Exception ex) { continue; }
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
4、配置Program.cs
//配置托管服务
void ConfigureHostedService()
{
builder.Services.AddHostedService<HSDemo>();//此为演示,定时向Signal聊天者推广告,默认应关闭
}
//映射SignalR
void MapSignalR()
{
app.MapHub<SRDemo>("/Hubs/Demo");
}
可能还需要跨域
app.UseCors();
结束
浙公网安备 33010602011771号