ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-10-05 21:58:04  阅读:211  来源: 互联网

标签:core 序列化 Signalr 03 MessagePack signalr js public


## 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 ``` C# // 添加Signalr services.AddSignalR(config => { if (_webEnv.IsDevelopment()) { config.EnableDetailedErrors = true; } }) // 支持MessagePack .AddMessagePackProtocol(); ``` - 前端引入messagepack解析库 由于MessagePack传输是以二进制形式进行传输,降低了带宽,但是同时也增加到了代码的复杂度,原本直接获取数据就可以用的,现在需要先将二进制数据转换成正常数据,好在官方提供了对应的js库*msgpack5*、*signalr-protocol-msgpack* 可以通过vs的包管理工具或者npm安装,然后拷贝需要的文件到项目的lib文件夹,比如我的结构是 ``` bash 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 ``` js 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 - 实现一个业务推送系统](https://blogs.xxgtalk.cn/2019/09/20/dotnetcore/signalr/00-introduct/) | 上一篇 | [.net core 3.0 Signalr - 02 使用强类型的Hub](https://blogs.xxgtalk.cn/2019/09/22/dotnetcore/signalr/02-type-hub/) | 下一篇 | [.net core 3.0 Signalr - 04 使用Redis做底板来支持横向扩展](/2019/10/01/dotnetcore/signalr/04-redis/) | 源码地址 | [源码](https://github.com/xiexingen/CTS.Signalr) | 官方文档 | [官方文档](https://docs.microsoft.com/zh-CN/aspnet/core/?view=aspnetcore-3.0) | MessagePack-CSharp | [MessagePack-CSharp](https://github.com/neuecc/MessagePack-CSharp) | MessagePack | [MessagePack](https://msgpack.org/index.html) ![二维码](https://www.icode9.com/i/l/?n=18&i=blog/394514/201910/394514-20191005213613187-1330258161.gif)

标签:core,序列化,Signalr,03,MessagePack,signalr,js,public
来源: https://www.cnblogs.com/xiexingen/p/11625859.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有