多数情况下,客户端和服务端的关系就像一对朋友,通过请求–响应方式你来我往,客户端无论是刷新页面还是发送请求,服务端有求必应。SignalR让客户端和服务端之间建立了全双工通讯,两者又似乎成了家人,你中有我我中有你,客户端可以调用服务端的方法,反之亦然。于是我们在股票金融、物联网设备、多人协作等需要实时显示数据的场景中看到了SignalR的身影。


本周,在"青岛微软技术交流"群里,Darren提出了一个SinglaR连接数受限的问题,经过大家的群(七)策(嘴)群(八)力(舌),Darren最终在项目中避开了连接数限制问题,取得了很好的实时效果。本篇侧重于对整个过程的复盘,不涉及SignalR的基本面。

在Darren的项目中,设备的实时数据指向到了MVC中的一个控制器(DataReceiverController)方法,局域网内的设备每隔几秒向该控制器方法发送实时数据一次,在其中进行处理并按设备号(设备号具备唯一性)异步保存到Redis缓存,最终在视图页中展示某个区域的、比如10台设备的实时数据。

首先的一个思路是:当打开某个区域内包含10台设备的视图页,让它每隔几秒就到Hub取数据,而Hub负责把Redis缓冲中的各个设备的数据收集上来转换成视图页所需要的格式。大致如下:

这样做能实现实时性,但是存在的问题是:由于每个设备中包含了多路数据,当设备中的某个线路数据发生变化,视图页需较长的时间才能反应过来。

代码方面,在依赖倒置容器、请求管道中的配置大致如下:

以上的MyHubSignalR中最核心的部分。


有了Hub,视图页就每隔几秒向Hub请求一次。

以上,视图页每次向Hub请求数据,Hub就会调用视图页的broadcast方法把数据加载到页面。

既然视图页加载10台设备的所有路数据实时反应不够理想,如果分而治之会怎样呢?如果在视图页配上10个iframe,通过其src属性加载各个设备的视图页呢?大致如下:

此时的Hub需要根据设备号到缓存取数据再交给视图页。


运行下来会报错:cannot send data if the connection is not in the 'Connected' state。原因在于:

每个客户端将同时具有大约6个连接的HTTP连接限制。当SignalR使用长轮询或服务器发送事件时,很快就会达到限制。甚至WebSockets也限制了大约50个连接

于是Darren把问题抛给了群里。有说可以通过Stream的方式来做,也有从设备通讯协议的角度给出建议。最后,"独火"建议只把数据变化交给客户端,Darren尝试了这种方式。

SignalR提供了IHubContext<T>接口,可以把它注入到控制器,每当设备数据过来,把现有数据和缓存中的数据进行比对,如果有变化直接使用IHubContext<T>调用视图页方法。


这样一来,在DataReceiverController中获取到实时数据,与缓存数据进行比对,只把变化交给视图页。用这种方式实时反应明显提升,并且避开了SignalR连接数限制的问题。

以上 .NET Core的运行时是2.0,各个运行时下使用的方式略有不同。

在.NET Core中避开SingalR连接数限制相关推荐

  1. 如何在 ASP.Net Core 中使用 SignalR

    SignalR for ASP.Net Core 是 SignalR 的浴火重生版,允许你在 ASP.Net Core 中实现实时通讯,这里的 实时 意味着双方都能快速的感知对方发来的消息,比如:一旦 ...

  2. ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡

    本系列相关文章: <ASP.NET Core中Ocelot的使用:API网关的应用> <ASP.NET Core中Ocelot的使用:基于Spring Clound Netflix ...

  3. 工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题

    在 .NET Framework 与 .NET Core 中 HttpClient 有个臭名昭著的问题,HttpClient 实现了 IDispose 接口,但当你 Dispose 它时,它不会立即关 ...

  4. 在.NET Core中处理一个接口多个不同实现的依赖注入问题

    前言 近段时间在准备公司的技术分享,所以这段时间将大部分时间放在准备分享内容上去了.博客也就停了一下下. 在.NET Core中处理依赖注入问题时,往往是定义好了一个操作规范的接口,会有N多个基于不同 ...

  5. Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)

    前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于SignalR Core的文章了. 先介绍一下SignalR吧,如下: ASP.NET S ...

  6. .net core 中并发请求发送HttpWebRequest的坑

    在framework中,大量并发 HttpWebRequest 需要设置一个最大连接数 ServicePointManager.DefaultConnectionLimit = 200; 但是在.ne ...

  7. .net core 中的[FromBody]

    一.针对.net core中post类型的api注意的地方(前提是Controller上加[ApiController]特性).默认是这个. 1.如果客户端Content-Type是applicati ...

  8. 如何使用C#在ASP.NET Core中轻松实现QRCoder

    by Yogi 由瑜伽士 如何使用C#在ASP.NET Core中轻松实现QRCoder (How to easily implement QRCoder in ASP.NET Core using ...

  9. 使用Novell.Directory.Ldap.NETStandard在.NET Core中验证AD域账号

    Novell.Directory.Ldap.NETStandard是一个在.NET Core中,既支持Windows平台,又支持Linux平台,进行Windows AD域操作的Nuget包. 首先我们 ...

最新文章

  1. 我挖掘Kafka底层原理!发现了它火爆宇宙的3个真相!
  2. Linux headtail命令
  3. Gym - 101986F Pizza Delivery(最短路+DAG必经边)
  4. HTML5 Audio(音频)
  5. 482. 密钥格式化
  6. 《游戏行业DDoS攻击解决方案》重磅发布
  7. mysql 复制方式_MySQL复制方法
  8. Each interface on the back of the fuselage
  9. 【图像去噪】基于matlab全变分算法图像去噪【含Matlab源码 1324期】
  10. 【应用软件】用jpg+swf制作gif动感小图(附带AVI转gif技巧)
  11. CTF-Tools 一款CTF古典密码加解密工具
  12. 用Firefox看CHM电子书
  13. WINVNC源码分析(四)
  14. CSR蓝牙开发资源大全(软件代码资料)
  15. 我的第一份CUDA代码
  16. 3.9使用ValidationSummary控件
  17. 如何使用股票行情软件看股票
  18. 网站推广最实用不过的七种方法
  19. 车载开发之 Hicar carLife carPlay
  20. 如何将dedecms转Eyoucms程序呢?告别织梦商业授权烦恼教程

热门文章

  1. mac 启动android 模拟器,weex 启动 android 模拟器(mac环境)
  2. python按内容分割txt文件_Python实现逐行分割大txt文件示例详解
  3. 节操播放器——视频充满布局、监听播放结束(循环播放)、隐藏进度条等
  4. ssm+jsp计算机毕业设计宠物狗网店管理系统y1urm(程序+LW+源码+远程部署)
  5. 软件开发的打怪升级攻略
  6. el-table单元格换行显示,超出部分省略号
  7. CardView 简介和使用
  8. 计算机教育学论文,计算机教育学论文大纲范本模板 计算机教育学论文大纲怎么写...
  9. 阳光城:规模快车道上的速度与理性
  10. 逍遥自在学C语言 | 指针函数与函数指针