.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM