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 |

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/110619.html
標籤:.NET Core
