所需材料:一个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();
结束
标签:聊天室,Task,string,await,SignalR,广告,推送,public From: https://www.cnblogs.com/tudou365/p/17064292.html