Asp.Net Core API 和 WinForm 的 SignalR 例子

时间:2022-03-22 01:05:18

标签:

什么是 SignalR?

ASP.NET Core SignalR 是一个开源库,它简化了向应用措施添加实时 web 成果的成果。 实时 Web 成果使处事器端代码能够即时将内容推送到客户端。
官方列举的SignalR适用场景:

需要从处事器进行高频率更新的应用。 示例包孕游戏、社交网络、投票、拍卖、舆图和 GPS 应用。

仪表板和监视应用。 示例包孕公司仪表板、即时发卖更新或旅行警报。

协作应用。 协作应用的示例包孕白板应用和团队会议软件。

需要通知的应用。 社交网络、电子邮件、聊天、游戏、旅行警报和很多其他应用都需使用通知。

创建SignalR处事端Asp.Net Core API 这参考了Blog系统的写法
引用SignalR序列化的包
Install-Package Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson -Version 3.1.3
Startup类ConfigureServices要领里注册SignalR处事
services.AddSignalR().AddNewtonsoftJsonProtocol();
创建SignalR的Hub界说动静,分袂是IChatClient和ChatHub
IChatClient

public interface IChatClient { /// <summary> /// SignalR接收信息 /// </summary> /// <param name="message">信息内容</param> /// <returns></returns> Task ReceiveMessage(object message); /// <summary> /// SignalR接收信息 /// </summary> /// <param name="user">指定接收客户端</param> /// <param name="message">信息内容</param> /// <returns></returns> Task ReceiveMessage(string user, string message); Task ReceiveUpdate(object message); }

ChatHub

public class ChatHub : Hub<IChatClient> { /// <summary> /// 向指定群组发送信息 /// </summary> /// <param name="groupName">组名</param> /// <param name="message">信息内容</param> /// <returns></returns> public async Task SendMessageToGroupAsync(string groupName, string message) { await Clients.Group(groupName).ReceiveMessage(message); } /// <summary> /// 插手指定组 /// </summary> /// <param name="groupName">组名</param> /// <returns></returns> public async Task AddToGroup(string groupName) { await Groups.AddToGroupAsync(Context.ConnectionId, groupName); } /// <summary> /// 退出指定组 /// </summary> /// <param name="groupName">组名</param> /// <returns></returns> public async Task RemoveFromGroup(string groupName) { await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName); } /// <summary> /// 向指定成员发送信息 /// </summary> /// <param name="user">成员名</param> /// <param name="message">信息内容</param> /// <returns></returns> public async Task SendPrivateMessage(string user, string message) { await Clients.User(user).ReceiveMessage(message); } /// <summary> /// 当连接成立时运行 /// </summary> /// <returns></returns> public override Task OnConnectedAsync() { //TODO.. return base.OnConnectedAsync(); } /// <summary> /// 当链接断开时运行 /// </summary> /// <param name="ex"></param> /// <returns></returns> public override Task OnDisconnectedAsync(System.Exception ex) { //TODO.. return base.OnDisconnectedAsync(ex); } public async Task SendMessage(string user, string message) { await Clients.All.ReceiveMessage(user, message); } //定于一个通讯管道,用来打点我们和客户真个连接 //1、客户端挪用 WinFormsApp,就像订阅 //2、处事端主动向客户端发送数据,,名字千万不能错 //3、客户端再通过 ReceiveUpdate ,来接收 public async Task WinFormsApp(string name, string msg) { await Clients.All.ReceiveUpdate($"接收到{name}的动静,动静内容:{msg}"); } }

创建中间件SignalRSendMildd和MiddlewareHelpers
SignalRSendMildd

/// <summary> /// 中间件 /// </summary> public class SignalRSendMildd { /// <summary> ///上下文 /// </summary> private readonly RequestDelegate _next; private readonly IHubContext<ChatHub> _hubContext; /// <summary> ///注入上下文 /// </summary> /// <param name="next"></param> /// <param name="hubContext"></param> public SignalRSendMildd(RequestDelegate next, IHubContext<ChatHub> hubContext) { _next = next; _hubContext = hubContext; } /// <summary> /// SignalR过滤 /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task InvokeAsync(HttpContext context) { await _next(context); } }

MiddlewareHelpers

public static class MiddlewareHelpers { /// <summary> /// SignalR中间件 /// </summary> /// <param name="app"></param> /// <returns></returns> public static IApplicationBuilder UseSignalRSendMildd(this IApplicationBuilder app) { return app.UseMiddleware<SignalRSendMildd>(); } }