受欢迎的博客标签

[Original]ASP.NET Core SignalR(2):SignalR的三种传输模式

Published

 

通过三个DEMO学会SignalR的三种实现方式

1.采用集线器类(Hub)+非自动生成代理模式,

2采用集线器类(Hub)+自动生成代理模式

3.采用持久化连接类(PersistentConnection)

SignalR的三种传输模式

LongLooping(长轮询)、WebSocket(HTML5的WEB套接字)、Forever Frame(隐藏框架的长请求连接),可以在WEB客户端显式指定一种或几种,也可以采取默认(推荐),若采取默认,SignalR会根据浏览器的环境自动选择合适的传输方式。  

 

WebSockets

Blazor works best when using WebSockets as the SignalR transport due to lower latency, better reliability, and improved security.

When WebSockets are disabled, Azure App Service simulates a real-time connection using HTTP Long Polling.

HTTP Long Polling

Long Polling is used by SignalR when WebSockets isn't available or when the app is explicitly configured to use Long Polling.

HTTP Long Polling is noticeably slower than running with WebSockets enabled, which doesn't use polling to simulate a client-server connection.

We recommend using WebSockets for Blazor Server apps deployed to Azure App Service.

Note:

 When Blazor Server emits a console warning if it detects Long Polling is utilized:

Failed to connect via WebSockets, using the Long Polling fallback transport. This may be due to a VPN or proxy blocking the connection.

 

应用技术说明优缺点
轮询(polling)这应该是最常见的一种实现数据交互的方式,开发人员控制客户端以一定时间间隔中向服务器发送Ajax查询请求大,但是也因此,当服务器端内容并没有显著变化时,这种连接方式将带来很多无效的请求,造成服务器资源损耗。适合并发量小,实时性要求低的应用模型,更像是定时任务。优点:实现最为简单,配置简单,出错几率小 

缺点:每次都是一次完整的http请求,易延迟,有效请求命中率少,并发较大时,服务器资源损耗大
长轮询(long polling)长轮询是对轮询的改进,客户端通过请求连接到服务器,并保持一段时间的连接状态,直到消息更新或超时才返回Response并中止连接,可以有效减少无效请求的次数。属于Comet实现优点:有效减少无效连接,实时性较高 

缺点:客户端和服务器端保持连接造成资源浪费,服务器端信息更新频繁时,long polling并不比polling高效,并且当数据量很大时,会造成连续的polls不断产生,性能上反而更糟糕
iframe流iframe流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长链接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面。属于Comet实现优点:实时性高,浏览器兼容度好 

缺点:客户端和服务器端保持长连接造成资源浪费
WebSocket

WebSocket是HTML5提供的一种在单个 TCP 连接上进行全双工通讯的协议,目前chrome、Firefox、Opera、Safari等主流版本均支持,Internet Explorer从10开始支持。另外因为WebSocket 提供浏览器一个原生的 socket实现,所以直接解決了 Comet 架构很容易出错的问题,而在整個架构的复杂度上也比传统的实现简单得多。

Based on HTML 5 server push technology, WebSocket are a communications protocol compatible with HTTP. The WebSocket protocol facilitates real-time, bi-directional, and highly scalable data transfer between client and server applications using a publish/subscribe model. Implementing WebSocket is a useful strategy for building applications that need instant data updates without a browser refresh (stock market tickers, social media, games, etc).

优点:服务器与客户端之间交换的数据包档头很小,节约带宽。全双工通信,服务器可以主动传送数据给客户端。 

缺点:旧版浏览器不支持

理解SignalR

ASP.NET Core的实时库: SignalR -- 预备知识

SignalR使用了三种"底层"技术来实现实时Web, 它们分别是Long Polling, Server Sent Events 和 Websocket,具体实现过程见,下文介绍了Long Polling, Server Sent Events 和 Websocket客户端和浏览器间的交互过程:

https://www.cnblogs.com/cgzl/p/9509207.html

 

 

ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信(即:客户端(Web页面)和服务器端可以互相实时的通知消息及调用方法).

SignalR有三种传输模式:LongLooping(长轮询)、WebSocket(HTML5的WEB套接字)、Forever Frame(隐藏框架的长请求连接),可以在WEB客户端显式指定一种或几种,也可以采取默认(推荐),若采取默认,SignalR会根据浏览器的环境自动选择合适的传输方式。

SignalR的三种实现方式  

      第一种:采用集线器类(Hub)+非自动生成代理模式:服务端与客户端分别定义的相对应的方法,客户端通过代理对象调用服务端的方法,服务端通过IHubConnectionContext回调客户端的方法,客户端通过回调方法接收结果。 之前我写过一篇文章《分享一个基于长连接+长轮询+原生的JS及AJAX实现的多人在线即时交流聊天室》,是通过长轮询+长连接的方式来实现的在线多人聊天室功能,从代码量来看就知道实现起来并不简单,而如今有了SignalR,会简单很多,我这里使用SignalR再来写一个简单的在线多人聊天室示例,以便大家快速掌握SignalR。

DEMO - 1 示例代码如下: 服务端:

.