.NET Core SignalR 和 .NET SignalR 区别
由于要转 .NET Core ,对于以前用到的一些进行迁移。
在迁移 SignalR 的时候发现 .NET Core 下的和 .NET 下的区别还是挺大的。
一、功能差异
自定重新连接
.NET 下的 SignalR 有重连的机制,在客户端断开连接,SignalR 会尝试重新连接到服务器。
.NET Core 下不支持自动重连机制,如果需要重连,需要客户端显示的启动新的连接。
协议支持
.NET Core 不仅支持JSON格式,还支持一种基于 MassagePack 的二进制协议,同时还可以自定义协议。
二、服务器上的差异
SignalR 映射到管道
.NET 下映射
public class Startup { public void Configuration(IAppBuilder app) { // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=316888 app.UseCors(CorsOptions.AllowAll); var hubConfig = new HubConfiguration() { EnableJavaScriptProxies = false }; app.MapSignalR(hubConfig); // 配置集群底板数据库 RedisConfiguration redisConfig = RedisSectionHandler.GetConfig(); GlobalHost.DependencyResolver.UseRedis(redisConfig.RedisHosts[0].Host, redisConfig.RedisHosts[0].Port, redisConfig.Password, "signalR_loginHub"); } }
.NET Core 下的映射和路由
public void ConfigureServices(IServiceCollection services) { // 添加到依赖关系注入系统 services.AddSignalR(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // 添加到中间件管道 app.UseSignalR(routes => { routes.MapHub<ChatHub>("/chatHub"); }); }
集线器的实现
.NET 下方法的实现:客户端的方法直接在 HubConnectionContext 下的对象直接"."出客户端的方法,客户端再注册
public void Send(string msg) { // 调用所有客户注册的本地JS方法 Clients.All.ReceiveMessage(msg);
}
.NET Core 下方法实现:客户端的方法是在 HubCallerClients 下的对象调用 “SendAsync”进行方法注册,方法名作为参数进行传入
public async Task SendMessage(string user, string message) { await Clients.All.SendAsync("ReceiveMessage", user, message); }
三、客户端的差异
.NET 下的 SignalR 客户端是依赖 JQuery 用 JS 写的
.NET Core SignalR 客户端是托管于 npm 用 TypeScript ,在使用的时候需要引用的 JS 文件较少
创建连接的不同
.NET 下使用 $.connection
$.connection.hub.url = "http://localhost:10110/signalr"; var chat = $.connection.chatHub;
.NET Core 下使用 HubConnectionBuilder
var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();
以及错误的捕获和处理上
connection.start().catch(function (err) { return console.error(err.toString()); });
对于客户端方法的注册,.NET Core 和 .NET 下的不使用代理的一致,具体可以看 “SignalR 初体验”
本文章参考微软官方文档:“比较 SignalR 和 SignalR Core”