It's like JSON.
but fast and small.

MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages like JSON. But it's faster and smaller. Small integers are encoded into a single byte, and typical short strings require only one extra byte in addition to the strings themselves.

默认我们在 ASP.NET Core SignalR 中使用 WebSocket 协议通信,默认使用 JSON 格式数据传输,为了更高效我们可以使用 MessagePack 来替换。 MessagePack 是一个高效的二进制序列化格式。它让你像JSON一样可以在各种语言之间交换数据。但是它比JSON更快、更小。小的整数会被编码成一个字节,短的字符串仅仅只需要比它的长度多一字节的大小。

在 SignalR 中使用 MessagePack 也很简单:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. //自定义配置
  4. services.Configure<DbSetting>(Configuration.GetSection("ConnectionStrings"));
  5.  
  6. //https://docs.microsoft.com/en-us/aspnet/core/security/gdpr?view=aspnetcore-2.1
  7. services.Configure<CookiePolicyOptions>(options =>
  8. {
  9. options.CheckConsentNeeded = context => true;
  10. options.MinimumSameSitePolicy = SameSiteMode.None;
  11. });
  12.  
  13. //添加 Hangfire 服务
  14. services.AddHangfire(config => config.UseRedisStorage(Redis));
  15. // services.AddHangfire(config => config.UseSqlServerStorage("<connection string>"));
  16.  
  17. //添加 Cookie 中间件
  18. services.AddAuthentication(sharedOptions =>
  19. {
  20. sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  21. // sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
  22. })
  23.  
  24. //.AddAzureAdB2C(opts => Configuration.Bind("AzureAdB2C", opts))
  25. .AddCookie(opts =>
  26. {
  27. opts.LoginPath = new PathString("/account/login");
  28. opts.AccessDeniedPath = new PathString("/account/denied");
  29. });
  30.  
  31. services.AddSignalR(options =>
  32. {
  33. //Faster pings for testing
  34. //options.KeepAliveInterval = TimeSpan.FromSeconds(5);
  35. })
  36. .AddMessagePackProtocol(options =>
  37. {
  38. // options.FormatterResolvers = new List<MessagePack.IFormatterResolver>()
  39. //{
  40. // MessagePack.Resolvers.StandardResolver.Instance
  41. //};
  42. })
  43. .AddRedis(Configuration.GetConnectionString("Redis"));
  44.  
  45. //返回大小写问题
  46. services.AddMvc()
  47. .AddJsonOptions(option => option.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver());
  48. }
  1. .NET 客户端
  1. var hubConnection = new HubConnectionBuilder()
  2. .WithUrl("/chatHub")
  3. .AddMessagePackProtocol()
  4. .Build();

JavaScript 客户端

  1. npm install @aspnet/signalr-protocol-msgpack
  1. <script src="~/lib/signalr/signalr.js"></script>
  2. <script src="~/lib/msgpack5/msgpack5.js"></script>
  3. <script src="~/lib/signalr/signalr-protocol-msgpack.js"></script>
  1. const connection = new signalR.HubConnectionBuilder()
  2. .withUrl("/hqHub")
  3. .withHubProtocol(new signalR.protocols.msgpack.MessagePackHubProtocol())
  4. .build();

运行日志

REFER:
https://docs.microsoft.com/en-us/aspnet/core/signalr/messagepackhubprotocol?view=aspnetcore-2.1
https://damienbod.com/2018/03/19/using-message-pack-with-asp-net-core-signalr/
https://socket.io/docs/

SignalR 中使用 MessagePack 序列化提高 WebSocket 通信性能的更多相关文章

  1. 在Android中使用并发来提高速度和性能

    Android框架提供了很实用的异步处理类.然而它们中的大多数在一个单一的后台线程中排队.当你需要多个线程时你是怎么做的? 众所周知,UI更新发生在UI线程(也称为主线程).在主线程中的任何操作都会阻 ...

  2. (六)分布式通信----MessagePack序列化

    1. .Net Core的序列化方式 1.1 json.Net 常用的工具包,如Newtonsoft.Json, 它是基于json格式的序列化和反序列化的组件 json.net 有以下优点: 侵入性: ...

  3. 用 Function.apply() 的参数数组化来提高 JavaScript程序性能

    我们再来聊聊Function.apply() 在提升程序性能方面的技巧. 我们先从 Math.max() 函数说起, Math.max后面可以接任意个参数,最后返回所有参数中的最大值. 比如 aler ...

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

    ## MessagePack基础介绍 Signalr默认使用的是json形式传递数据,但是signalr提供了灵活的扩展,支持MessagePack形式序列化数据,以增加性能降低网络传输的效果,极大的 ...

  5. C#(SuperWebSocket)与websocket通信

    原文:C#(SuperWebSocket)与websocket通信 客户端代码 点击可以查看一些关于websocket的介绍 <!DOCTYPE html> <html> &l ...

  6. SignalR 2.0 入门与提高

    SignalR 2.0 入门与提高 SignalR 2.0 最近整理了SignalR2.0 部分知识点,原文翻译,由于自己是土鳖,翻译得不好的地方,欢迎指正!仅供各位初学者学习! 第一节. 入门ASP ...

  7. Spring实现WebSocket通信

    WebSocket是两个应用之间全双工的通信通道.WebSocket最常见的应用场景是实现服务器和基于浏览器的应用之间的通信. 浏览器中的javascript客户端开启一个到服务器的连接,服务器通过这 ...

  8. js判断是否安装某个android app,没有安装下载该应用(websocket通信,监听窗口失去焦点事件)

    现在经常有写场景需要提示用户下载app, 但是如果用户已经安装,我们希望是直接打开app. 实际上,js是没有判断app是否已经安装的方法的,我们只能曲线救国. 首先,我们需要有call起app的sc ...

  9. 在Asp.net Core中使用中间件来管理websocket

    介绍 ASP.NET Core SignalR是一个有用的库,可以简化Web应用程序中实时通信的管理.但是,我宁愿使用WebSockets,因为我想要更灵活,并且与任何WebSocket客户端兼容. ...

随机推荐

  1. [leetcode]64. Minimum Path Sum最小路径和

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  2. 13. pt-ioprofile

    pt-ioprofile 直接运行即可,对系统有影响,慎用!!! read:从文件中读出数据.要读取的文件用文件描述符标识,数据读入一个事先定义好的缓冲区. write:把缓冲区的数据写入文件中. p ...

  3. 【APP测试(Android)】--升级更新

  4. 第二次spring会议

    今天所做之事: 我用C#用DelectText对行数进行了定义,刚开始写代码有点无从下手. 遇到的问题:刚开始用datagridView进行了文本的输入,但是它更适合EXCEL之类的数据计算不符合我们 ...

  5. SSM框架整合(Spring+SpringMVC+MyBatis+Oracle)

    1.开发环境搭建以及创建Maven Web项目 参看之前的博文[确保maven web项目不报错]:http://www.cnblogs.com/cainiaomahua/p/6306476.html ...

  6. latex表格代码

     基本代码 \begin{table}[!h] \caption{Notations Used in Real-time Analysis.} \label{table:notation} \cent ...

  7. 基于UML的毕业选题系统建模研究

    一.基本信息 标题:基于UML的毕业选题系统建模研究 时间:2018 出版源:电脑迷 领域分类:UML建模技术 二.研究背景 问题定义:为了加强学生设计分析开发软件的相关能力,有效避免结构化模型存在的 ...

  8. FreeRTOS的内存管理

    FreeRTOS提供了几个内存堆管理方案,有复杂的也有简单的.其中最简单的管理策略也能满足很多应用的要求,比如对安全要求高的应用,这些应用根本不允许动态内存分配的. FreeRTOS也允许你自己实现内 ...

  9. 中国剩余定理poj1006

    中国剩余定理即解一组带余除法的不定方程组(同余式组解法). 例如:求一个最小数x,已知x%3=2且x%5=3且x%7=2. 思路就是: 1.先从(3,5)的公倍数中找一个%7=1的最小公倍数,这里是1 ...

  10. 剑指offer编程题Java实现——面试题10二进制中1的个数

    题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变 ...