## 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://img2018.cnblogs.com/blog/394514/201910/394514-20191005213613187-1330258161.gif)

.net core 3.0 Signalr - 03 使用MessagePack压缩传输内容的更多相关文章

  1. .net core 3.0 Signalr - 实现一个业务推送系统

    ## 介绍 ASP.NET Core SignalR 是一个开源代码库,它简化了向应用添加实时 Web 功能的过程. 实时 Web 功能使服务器端代码能够即时将内容推送到客户端. SignalR 的适 ...

  2. .net core 3.0 Signalr - 02 使用强类型的Hub

    ## 强类型的优缺点 - 优点 强类型的Hub可以避免魔法函数名,相比弱类型更容易维护和发现问题,直接上代码 - 缺点 特么的得多些好几行代码 ## 代码 ### 接口定义 ``` C# /// // ...

  3. .net core 3.0 Signalr - 04 使用Redis做底板来支持横向扩展

    在实际的系统中,可能需要多台机器部署;然而,Signalr的连接信息是跟站点走的,举个例子 推送系统部署了A.B两个服务器,张三访问A服务器,李四访问B服务器,当张三通过A服务器向李四推送的时候,A服 ...

  4. .net core 3.0 Signalr - 05 使用jwt将用户跟signalr关联

    Signalr是以Group.Connect为核心来进行推送,比如,给某个组.某个连接来推送,但实际场景中,核心应该是某个组.某个人:然而一个人可以对应多个连接(浏览器多个tab页):本节就来介绍下自 ...

  5. .net core 3.0 Signalr - 01 基础篇

    因为将signalr作为单独的站点,此处需要建立两个项目,一个专门用于signalr作为推送项目,一个客户端(实际的业务项目) ## 基础知识速览 ### Clients对象属性 | 属性 | 描述 ...

  6. .net core 3.0 Signalr - 06 业务实现-业务分析

    ## 业务需求 1. 人-项目关系 一个人可以属于多个项目,一个项目可以有多个人加入,通知的时候,可以通知项目内的所有人,也可以通知部分人或者某个责任人. 2. 登录互斥 同一个人不允许登录两次(不同 ...

  7. .net core 3.0 Signalr - 08 业务实现-客户端demo

    由于signalr作为一个单独的推送系统,跟业务系统是分离开的,所以此处模拟一个业务系统,新建一个.net core app项目 ## 模拟实现一个登录功能 我们的登录很简单,当进入系统,如果检测到用 ...

  8. .net core 3.0 Signalr - 09 待改进&交流

    ## 个人心得 写博客真的比写代码累,膜拜那些坚持写博客的大佬! 有时候零散的片段比较多,没写之前感觉有千千万万要写的东西,实际写的时候发现, 好像这个没啥说的,然后就帖了个图,或者一笔带过了 ## ...

  9. .net core 3.0 Signalr - 07 业务实现-服务端 自定义管理组、用户、连接

    Hub的管理 重写OnConnectedAsync 从连接信息中获取UserId.Groups,ConnectId,并实现这三者的关系,存放于redis中 代码请查看 using CTS.Signal ...

随机推荐

  1. 消息中间件——RabbitMQ(九)RabbitMQ整合Spring AMQP实战!(全)

    前言 1. AMQP 核心组件 RabbitAdmin SpringAMQP声明 RabbitTemplate SimpleMessageListenerContainer MessageListen ...

  2. IT项目管理入门知识

  3. Codeforces Round #484 (Div. 2) B. Bus of Characters(STL+贪心)982B

    原博主:https://blog.csdn.net/amovement/article/details/80358962 B. Bus of Characters time limit per tes ...

  4. 通过CMD命令窗口获取django版本号

    通过CMD命令窗口获取django版本号 方法一: C:\Users\Administrator>python >>> import django >>> d ...

  5. spring的嵌套事务

    转自http://www.iteye.com/topic/35907 在所有使用 spring 的应用中, 声明式事务管理可能是使用率最高的功能了, 但是, 从我观察到的情况看, 绝大多数人并不能深刻 ...

  6. CentSO7.6下部署Maridb Galera Cluster 实践记录(一)

    根据目前系统业务发展,预计未来上集成的概率异常之高,所以提前学习如何部署,网上尽管有很多这方面资料,但是真正适合自己的只有实践过的. 很奇怪目前的yum资源库里面为什么没有galera资源,目前只能通 ...

  7. Cloudera版本的hadoop环境准备

    对于普通学习用户而言,应该先下载一个虚拟机, 推荐vmware,因为是免费的. Hadoop环境有三个版本: Apache版本(Apache基金会) CDH(cloudera公司) hdp版本(Hor ...

  8. spring cloud config使用mysql存储配置文件

    spring cloud config使用mysql存储配置文件 1.结构图 2.pom.xml: <?xml version="1.0" encoding="UT ...

  9. 实验吧CTF练习题---WEB---貌似有点难解析

    实验吧web之貌似有点难   地址:http://www.shiyanbar.com/ctf/32 flag值:SimCTF{daima_shengji}   解题步骤: 1.打开题目页面,观察题目要 ...

  10. Scratch Blocks本地环境搭建

    关于Scratch Blocks环境的搭建,大家在实现的过程中还是有很多的问题,目前谷歌和MIT的工程师也在进一步完善.可以通过以下方式,简单快捷的导出Scratch Blocks对应的index.h ...