.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 ...
随机推荐
- SCRUM起源
http://www.scrumcn.com/agile/scrum-knowledge-library/scrum.html#tab-id-3 Scrum的原始含义 Scrum原始含义是指英式橄榄球 ...
- E-Find the median_2019牛客暑期多校训练营(第七场)
题意 N次操作,每次塞入区间\([L,R]\)的每个数,并输出此时的中位数. 题解 如果题目不是每次塞入一整个区间,而是只塞入一个数,可以简单的建权值线段树查询区间第K大,由于每次都是查询整个区间就不 ...
- 牛客-2018多校算法第五场C-KMP
字符串的问题 在原来的字符串中前缀与后缀相同,且原来的中间还含有这个子串: 这里加的num[]数组真是太厉害了,可以直接用来判断中间是否有子串: #include <iostream> # ...
- HDU - 5128The E-pang Palace+暴力枚举,计算几何
第一次写计算几何,ac,感动. 不过感觉自己的代码还可以美化一下. 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5128 题意: 在一个坐标系中,有n个 ...
- hdu 3577 Fast Arrangement(线段树区间修改,求区间最小值)
Problem Description Chinese always have the railway tickets problem because of its' huge amount of p ...
- CodeForces 103 D Time to Raid Cowavans
Time to Raid Cowavans 题意:一共有n头牛, 每头牛有一个重量,m次询问, 每次询问有a,b 求出 a,a+b,a+2b的牛的重量和. 题解:对于m次询问,b>sqrt(n) ...
- Allure-pytest功能特性介绍
前言 Allure框架是一个灵活的轻量级多语言测试报告工具,它不仅以web的方式展示了简介的测试结果,而且允许参与开发过程的每个人从日常执行的测试中最大限度的提取有用信息从dev/qa的角度来看,Al ...
- sed一些常用命令
[转] http://blog.chinaunix.net/uid-20754793-id-177657.html 下面是我学习sed时参照参考书总结的一些常用sed命令,基本上每条语句都进行了调试1 ...
- Java 添加Word文本框
在Word中,文本框是指一种可移动.可调节大小的文字或图形容器.我们可以向文本框中添加文字.图片.表格等对象,下面,将通过Java编程来实现添加以上对象到Word文本框. 使用工具:Free Spir ...
- 【Nginx】基于Consul+Upsync+Nginx实现动态负载均衡
一.Http动态负载均衡 什么是动态负载均衡 动态负载均衡实现方案 常用服务器注册与发现框架 二.Consul快速入门 Consul环境搭建 三.nginx-upsync-module nginx-u ...