Signalr默認使用的是json形式傳遞數據,可是signalr提供了靈活的擴展,支持MessagePack形式序列化數據,以增長性能下降網絡傳輸的效果,極大的提升響應速度。html
先看一個MessagePack自定義序列化的例子,以一個自定義的實體對象爲例,可使用MessagepackObject標記爲序列化的對象,同時定義使用屬性名做爲key(區分大小寫),同時能夠定義忽略某個屬性等、以及自定義key等前端
[MessagePackObject(keyAsPropertyName: true)] public class OffLineData { /// <summary> /// 用戶Id /// </summary> public string UserId { set; get; } /// <summary> /// 鏈接Id /// </summary> public string ConnectionId { set; get; } /// <summary> /// 是否該用戶的最後一個鏈接 /// </summary> public bool IsLast { set; get; } [IgnoreMember] public string Test { set;get;} } // 好比對象,new OffLineData(){UserId="1000",ConnectionId="AZDEFASDFASDF",IsLast:true}經過MessagePack序列化後應該會是{UserId:"1000",ConnectionId:"AZDEFASDFASDF",IsLast:true},這個跟經常使用的json基本相同
同時MessagePack還能夠定義序列化成數組形式,代碼以下git
[MessagePackObject] public class OffLineData { /// <summary> /// 用戶Id /// </summary> [Key(0)] public string UserId { set; get; } /// <summary> /// 鏈接Id /// </summary> [Key(0)] public string ConnectionId { set; get; } /// <summary> /// 是否該用戶的最後一個鏈接 /// </summary> [Key(0)] public bool IsLast { set; get; } } // 好比對象,new OffLineData(){UserId="1000",ConnectionId="AZDEFASDFASDF",IsLast:true}經過MessagePack序列化後應該會是["10000","AZDEFASDFASDF",true]
更多MessagePack的內容能夠自行結尾的文檔,此處再也不過多介紹.github
Microsoft.AspNetCore.SignalR.Protocols.MessagePackweb
修改以前的ConfigureServicesredis
// 添加Signalr services.AddSignalR(config => { if (_webEnv.IsDevelopment()) { config.EnableDetailedErrors = true; } }) // 支持MessagePack .AddMessagePackProtocol();
因爲MessagePack傳輸是以二進制形式進行傳輸,下降了帶寬,可是同時也增長到了代碼的複雜度,本來直接獲取數據就能夠用的,如今須要先將二進制數據轉換成正常數據,好在官方提供了對應的js庫msgpack5、signalr-protocol-msgpack
能夠經過vs的包管理工具或者npm安裝,而後拷貝須要的文件到項目的lib文件夾,好比個人結構是npm
signalr-protocol-msgpack |-msgpack5.js |-msgpack5.min.js |-signalr-protocol-msgpack.js |-signalr-protocol-msgpack.min.js
前端頁面引入這兩個js(注意順序:signalr、msgpack五、signalr-protocol-msgpack)json
修改js鏈接對象,支持上MessagePack數組
new signalR.HubConnectionBuilder() .configureLogging(signalR.LogLevel.Error) // 前端控制檯的日誌級別,根據須要配置 .withUrl('http://localhost:50001/notify-hub') // 鏈接地址,這個地址是signalr項目的地址 .withHubProtocol(new signalR.protocols.msgpack.MessagePackHubProtocol()) // 使用Messagepack來解析推送的數據 .withAutomaticReconnect([0, 2000, 5000, 10000, 20000]) // 配置重連的時間 .build(); // 重連的時候觸發 connection.onreconnecting(function (info) { console.info('----------------------------------signalr-- onreconnecting', info); }); //鏈接關閉的回調 connection.onclose(function (err) { console.info('--------------------------------signalr-- onclose', err); }); connection.start().then(function (data) { console.log('已成功鏈接到signalr服務器') }).catch(function (error) { console.error(error.toString()); });
發現經過json.net序列化獲得的對象,直接傳遞給MessagePack序列化會報錯,沒找着解決方法,直接改爲字符串傳遞,而後在前端解析了,有遇到過的大佬歡迎指點下bash
至此,MessagePack介紹算結束了,更多內容請經過快速導航查看下一篇
標題 | 內容 |
---|---|
索引 | .net core 3.0 Signalr - 實現一個業務推送系統 |
上一篇 | .net core 3.0 Signalr - 02 使用強類型的Hub |
下一篇 | .net core 3.0 Signalr - 04 使用Redis作底板來支持橫向擴展 |
源碼地址 | 源碼 |
官方文檔 | 官方文檔 |
MessagePack-CSharp | MessagePack-CSharp |
MessagePack | MessagePack |