欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.net core 3.0 Signalr - 03 使用MessagePack压缩传输内容

程序员文章站 2022-07-02 12:52:45
MessagePack基础介绍 Signalr默认使用的是json形式传递数据,但是signalr提供了灵活的扩展,支持MessagePack形式序列化数据,以增加性能降低网络传输的效果,极大的提高响应速度。 先看一个MessagePack自定义序列化的例子,以一个自定义的实体对象为例,可以使用Me ......

messagepack基础介绍

signalr默认使用的是json形式传递数据,但是signalr提供了灵活的扩展,支持messagepack形式序列化数据,以增加性能降低网络传输的效果,极大的提高响应速度。

先看一个messagepack自定义序列化的例子,以一个自定义的实体对象为例,可以使用messagepackobject标记为序列化的对象,同时定义使用属性名作为key(区分大小写),同时可以定义忽略某个属性等、以及自定义key等
``` c#
[messagepackobject(keyaspropertyname: true)]
public class offlinedata
{
///


/// 用户id
///

public string userid { set; get; }
///
/// 连接id
///

public string connectionid { set; get; }
///
/// 是否该用户的最后一个连接
///

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还可以定义序列化成数组形式,代码如下
``` c#
[messagepackobject]
public class offlinedata
{
///


/// 用户id
///

[key(0)]
public string userid { set; get; }
///
/// 连接id
///

[key(0)]
public string connectionid { set; get; }
///
/// 是否该用户的最后一个连接
///

[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

.net core 3.0 Signalr - 03 使用MessagePack压缩传输内容