.net core 3.0 Signalr - 03 使用MessagePack壓縮傳輸內容


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庫msgpack5signalr-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

二維碼


免責聲明!

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



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