.net core 3.0 Signalr - 03 使用MessagePack压缩传输内容
## MessagePack基础介绍
Signalr默认使用的是json形式传递数据,但是signalr提供了灵活的扩展,支持MessagePack形式序列化数据,以增加性能降低网络传输的效果,极大的提高响应速度。
先看一个MessagePack自定义序列化的例子,以一个自定义的实体对象为例,可以使用MessagepackObject标记为序列化的对象,同时定义使用属性名作为key(区分大小写),同时可以定义忽略某个属性等、以及自定义key等
``` C#
[MessagePackObject(keyAsPropertyName: true)]
public class OffLineData
{
///
///
public string UserId { set; get; }
///
///
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
{
///
///
[Key(0)]
public string UserId { set; get; }
///
///
[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)

.net core 3.0 Signalr - 03 使用MessagePack压缩传输内容的更多相关文章
- .net core 3.0 Signalr - 实现一个业务推送系统
## 介绍 ASP.NET Core SignalR 是一个开源代码库,它简化了向应用添加实时 Web 功能的过程. 实时 Web 功能使服务器端代码能够即时将内容推送到客户端. SignalR 的适 ...
- .net core 3.0 Signalr - 02 使用强类型的Hub
## 强类型的优缺点 - 优点 强类型的Hub可以避免魔法函数名,相比弱类型更容易维护和发现问题,直接上代码 - 缺点 特么的得多些好几行代码 ## 代码 ### 接口定义 ``` C# /// // ...
- .net core 3.0 Signalr - 04 使用Redis做底板来支持横向扩展
在实际的系统中,可能需要多台机器部署;然而,Signalr的连接信息是跟站点走的,举个例子 推送系统部署了A.B两个服务器,张三访问A服务器,李四访问B服务器,当张三通过A服务器向李四推送的时候,A服 ...
- .net core 3.0 Signalr - 05 使用jwt将用户跟signalr关联
Signalr是以Group.Connect为核心来进行推送,比如,给某个组.某个连接来推送,但实际场景中,核心应该是某个组.某个人:然而一个人可以对应多个连接(浏览器多个tab页):本节就来介绍下自 ...
- .net core 3.0 Signalr - 01 基础篇
因为将signalr作为单独的站点,此处需要建立两个项目,一个专门用于signalr作为推送项目,一个客户端(实际的业务项目) ## 基础知识速览 ### Clients对象属性 | 属性 | 描述 ...
- .net core 3.0 Signalr - 06 业务实现-业务分析
## 业务需求 1. 人-项目关系 一个人可以属于多个项目,一个项目可以有多个人加入,通知的时候,可以通知项目内的所有人,也可以通知部分人或者某个责任人. 2. 登录互斥 同一个人不允许登录两次(不同 ...
- .net core 3.0 Signalr - 08 业务实现-客户端demo
由于signalr作为一个单独的推送系统,跟业务系统是分离开的,所以此处模拟一个业务系统,新建一个.net core app项目 ## 模拟实现一个登录功能 我们的登录很简单,当进入系统,如果检测到用 ...
- .net core 3.0 Signalr - 09 待改进&交流
## 个人心得 写博客真的比写代码累,膜拜那些坚持写博客的大佬! 有时候零散的片段比较多,没写之前感觉有千千万万要写的东西,实际写的时候发现, 好像这个没啥说的,然后就帖了个图,或者一笔带过了 ## ...
- .net core 3.0 Signalr - 07 业务实现-服务端 自定义管理组、用户、连接
Hub的管理 重写OnConnectedAsync 从连接信息中获取UserId.Groups,ConnectId,并实现这三者的关系,存放于redis中 代码请查看 using CTS.Signal ...
随机推荐
- evevt
EventEvent 是一个事件对象,当一个事件发生后,和当前事件发生相关的详细信息会被临时存储到一个指定的地方,也就是event对象,以方便我们在需要的时候调用. 在这一点上,非常类似于飞机当中的黑 ...
- mysql迁移mpp数据库Greenplum
1. 场景描述 因兄弟项目中mysql有点扛不住了,要做sql优化,但是业务有点小复杂,优化起来有点麻烦(sql嵌套有点多),便想着用Mpp数据库Greenplum测试下,看性能和复杂度怎么样,趟趟水 ...
- 企业代码版本管理之争:TrunkBased vs GitFlow vs AoneFlow vs OneFlow vs ExeFlow
目录 引言 TrunkBased GitFlow AoneFlow OneFlow ExeFlow 综述 引言 网络上版本管理系统之争持久而喧嚣,依照声量来讲目前应该是Git占了较大的优势.不过我们本 ...
- 写一手好SQL很有必要
MySQL性能 最大数据量 最大并发数 查询耗时0.5秒 实施原则 数据表设计 数据类型 避免空值 text类型 索引优化 索引分类 优化原则 SQL优化 分批处理 不做列运算 避免Select * ...
- tit文件的加密解密
加密 # hello 源文件 # ifmmp 加密 # hello 解密 file = open("Email.txt","r") # 源文件 只针对字符不需要 ...
- 牛客多校第七场 C Bit Compression 思维
链接:https://www.nowcoder.com/acm/contest/145/C来源:牛客网 A binary string s of length N = 2n is given. You ...
- UVA - 315 Network(tarjan求割点的个数)
题目链接:https://vjudge.net/contest/67418#problem/B 题意:给一个无向连通图,求出割点的数量.首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第 ...
- IPv6地址存储
import java.util.Arrays; /** * @author: 何其有静 * @date: 2019/4/2 * @description: IPv6地址存储 * https://mp ...
- IDEA中自动导包快捷键
1.File-->Settings 2.解释: 勾选标注第1个选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们导入需要用到的包.但是对于那些同名的包,还是需要手动 Alt + ...
- SpringCloud(三)Ribbon与Feign
上一篇使用了Eureka与Ribbon组件做了最简单的的服务注册与发现,我们知道Eureka是实现服务治理中心的组件,但是上一篇Eureka没有实现集群,这样没有保证到Eureka Server的高可 ...