MessagePack基礎介紹
Signalr默認使用的是json形式傳遞數據,但是signalr提供了靈活的擴展,支持MessagePack形式序列化數據,以增加性能降低網絡傳輸的效果,極大的提高響應速度。
先看一個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還可以定義序列化成數組形式,代碼如下
[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的內容可以自行結尾的文檔,此處不再過多介紹.
為Signalr添加MessagePack支持
- 引入需要的Nuget包
Microsoft.AspNetCore.SignalR.Protocols.MessagePack - 修改之前的ConfigureServices
// 添加Signalr services.AddSignalR(config => { if (_webEnv.IsDevelopment()) { config.EnableDetailedErrors = true; } }) // 支持MessagePack .AddMessagePackProtocol();
- 前端引入messagepack解析庫
由於MessagePack傳輸是以二進制形式進行傳輸,降低了帶寬,但是同時也增加到了代碼的復雜度,原本直接獲取數據就可以用的,現在需要先將二進制數據轉換成正常數據,好在官方提供了對應的js庫msgpack5、signalr-protocol-msgpack
可以通過vs的包管理工具或者npm安裝,然后拷貝需要的文件到項目的lib文件夾,比如我的結構是signalr-protocol-msgpack |-msgpack5.js |-msgpack5.min.js |-signalr-protocol-msgpack.js |-signalr-protocol-msgpack.min.js
前端頁面引入這兩個js(注意順序:signalr、msgpack5、signalr-protocol-msgpack)
- 修改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序列化會報錯,沒找着解決方法,直接改成字符串傳遞,然后在前端解析了,有遇到過的大佬歡迎指點下
至此,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 |