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

MessagePack基礎介紹

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

爲Signalr添加MessagePack支持

  • 引入須要的Nuget包

Microsoft.AspNetCore.SignalR.Protocols.MessagePackweb

  • 修改以前的ConfigureServicesredis

    // 添加Signalr
      services.AddSignalR(config =>
      {
          if (_webEnv.IsDevelopment())
          {
              config.EnableDetailedErrors = true;
          }
      })
      // 支持MessagePack
      .AddMessagePackProtocol();
  • 前端引入messagepack解析庫

因爲MessagePack傳輸是以二進制形式進行傳輸,下降了帶寬,可是同時也增長到了代碼的複雜度,本來直接獲取數據就能夠用的,如今須要先將二進制數據轉換成正常數據,好在官方提供了對應的js庫msgpack5signalr-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

二維碼

相關文章
相關標籤/搜索