【SignalR学习系列】1. SignalR理论介绍
什么是SignalR?
ASP.NET SignalR 是一个让 ASP.NET开发者可以简单地给自己的程序添加即时通讯功能的开发库。即时通讯功能可以直接从服务器端给在线的客户端发送数据,而不用等待客户端请求数据再返回数据。
SignalR提供了一个简单的api来创建服务器--客户端的远程工程调用协议(RPC),可以通过服务器端的C#代码调用浏览器端的javascript函数(或者其他的平台)。SignalR也提供了连接管理,和Group连接管理的api。
SignalR和WebSocket
如果客户端和服务器都支持WebSocket,那么SignalR会通过WebSocket来传输数据。当然你也可以自己使用WebSocket来实现SignalR的功能,不过使用SignalR你就不用考虑如果客户端或者服务器不支持WebSocket的问题了。
SignalR的协议选择
SignalR是可以在客户端和服务器端进行即时通讯的几种协议的抽象和实现。一个SignalR连接是通过http请求发起的,然后上升为WebSocket(如果客户端和服务端都支持)。WebSocket是SignalR最理想的协议,它可以有效地利用服务器端的内存,有着最低的延迟,最多的基础特性(比如客户端和服务端的全双工连接),不过它也有着严格的要求,需要服务器端使用Windows Server 2012或者Windows 8以上的系统,也需要.NET Framework 4.5.。如果不符合这些要求,那么SignalR会使用其他的协议来建立连接。
HTML 5协议
下面的两种协议基于HTML5,如果客户端不支持HTML5,那么会使用其他的协议进行通讯。
- WebSocket。如果服务器和客户端都支持,那么就使用WebSocket协议来进行通讯。
- 服务器推送事件(Server-sent Events)。除了IE,其他的浏览器基本都支持。
Comet协议
下面两种协议都是基于Comet模型。
- Forever Frame (只支持IE)。
- Ajax长轮询(Ajax long polling)。
SignalR协议选择过程
下面的列表显示SignalR是如何选择具体使用的协议。
- 如果浏览器是IE8或者更早的版本,使用长轮询。
- 如果配置了Jsonp(如果连接开始的时候jsonp的参数设置为true), 使用长轮询。
- 如果是跨域连接, 如果下面的条件符合就会使用WebSocket,如果有条件不符合,那就是用长轮询。
- 客户端支持跨域连接
- 客户端支持WebSocket
- 服务器端支持WebSocket
- 如果没有配置jsonp,而且不是跨域连接,如果客户端和服务端都支持WebSocket,那么就使用WebSocket。
- 如果客户端或者服务端不支持WebSocket,使用服务器推送事件。
- 如果不支持服务器推送事件,使用Forever Frame。
- 如果不支持Forever Frame,使用长轮询。
监控协议
你可以通过在你的Hub上开启logging来监控你的SignalR使用了什么协议。
你需要在你的客户端代码里加入以下代码
$.connection.hub.logging = true;

指定协议
SignalR判断协议也需要消耗一定的客户端、服务端资源,如果你清楚客户端、服务端支持的协议,那么你可以指定使用某种协议来建立连接。
比如,你知道客户端只支持长轮询,那么你可以指定使用长轮询来进行通讯。
connection.start({ transport: 'longPolling' });
你也可以指定一个序列,客户端会按照序列里的顺序来进行通讯。下面的代码的作用是,先使用WebSocket,如果失败了,就使用长轮询。
connection.start({ transport: ['webSockets','longPolling'] });
SignalR包含下面四种指定的协议常量:
- webSockets
- foreverFrame
- serverSentEvents
- longPolling
连接和Hubs
SignalR api为了客户端和服务端通讯,建立了两个模型:持久连接和Hubs。
一个持久连接代表了一个端点,它可以发送单一接收者,Group接受者或者广播信息。持久连接的api是SignalR提供给开发者进入低级别协议的api。连接模型使用起来和WCF比较类似。
Hubs是SignalR提供的高级别的api,它允许客户端和服务端,在自己这边相互调用对方的方法。Hubs模型类似于.Net Remoting。使用Hubs也可以让你传递强类型参数,进行模型绑定。
SignalR架构图
下面的结构图显示了Hubs,持久连接,和SignalR所使用的底层协议之间的联系。

Hubs如何工作
当服务端代码调用客户端的方法,一个信息包会通过当前使用的协议传输出去,里面包含了所调用方法的名字和参数(如果参数是一个对象,那么会使用json序列化)。客户端会去匹配方法名,如果客户端有服务端调用的方法,那么客户端会代入参数数据并执行方法。
方法的调用可以使用Fiddler或者其他工具来进行追踪。
下面图片显示的就是Fiddler抓取到的一次SignalR调用记录。方法是通过一个叫MoveShapeHub的Hub来调用的,执行的客户端方法名是updateShape。

这个例子里H参数是Hub名字,参数名是M参数,而方法的参数数据是A参数。
如何挑选通讯模型
大部分情况下会使用Hub api来进行通讯。下面几种情况则使用连接api。
- 强制指定发送信息的模型。
- 开发者比起远程调度模型,更喜欢使用消息传递和调度模型。
- 原来的应用使用了消息调度,现在接口需要使用SignalR。
服务端要求
操作系统
SignalR组件可以在Win7、Windows Server 2008 R2及更高级别系统上运行。如果需要支持WebSocket,那么需要使用Win8和Windows Server 2012及更高级别的系统。
IIS版本
- IIS 8 or IIS 8 Express及更高级版本。
- IIS 7 and 7.5。需要支持extensionless URLs。
- IIS必须在集成模式下进行,不支持经典模型。如果在经典模式下使用Server-Sent Events协议,那么延迟可能超过30秒。
- 宿主程序必须在完全信任的级别下运行。
客户端要求
浏览器
| 协议 | Internet Explorer | Chrome (Windows or iOS) | Firefox | Safari (OSX or iOS) | Android |
|---|---|---|---|---|---|
| WebSockets | 10+ | current - 1 | current - 1 | current - 1 | N/A |
| Server-Sent Events | N/A | current - 1 | current - 1 | current - 1 | N/A |
| ForeverFrame | 8+ | N/A | N/A | N/A | 4.1 |
| Long Polling | 8+ | current - 1 | current - 1 | current - 1 | 4.1 |
Windows桌面和Silverlight
| 协议 | .NET application | Silverlight |
|---|---|---|
| Web Sockets | Windows 8+ and .NET 4.5+ | N/A |
| Forever Frame | N/A | N/A |
| Server-Sent Events | .NET 4+ | 5+ |
| Long Polling | .NET 4+ | 5+ |
Windows Store and Windows Phone
| 协议 | Windows Store/ .NET | Windows Store/ JavaScript | Windows Phone/ IE | Windows Phone/ .NET |
|---|---|---|---|---|
| WebSockets | N/A | Win8+ | 8+ | N/A |
| Forever Frame | N/A | Win8+ | 7.5+ | N/A |
| Server-Sent Events | Win8+ | N/A | N/A | 8+ |
| Long Polling | Win8+ | Win8+ | 7.5+ | 8+ |
参考链接:
https://docs.microsoft.com/zh-cn/aspnet/signalr/overview/getting-started/introduction-to-signalr
https://docs.microsoft.com/zh-cn/aspnet/signalr/overview/getting-started/supported-platforms
【SignalR学习系列】1. SignalR理论介绍的更多相关文章
- .net reactor 学习系列(一)---.net reactor介绍
原文:.net reactor 学习系列(一)---.net reactor介绍 学习.net已经一年多了,从语言的编写到框架类库的运用再到.net三大解决方案的了解(WF,WCF,WPF ...
- 【SignalR学习系列】4. SignalR广播程序
创建项目 创建一个空的 Web 项目,并在 Nuget 里面添加 SignalR,jQuery UI 包,添加以后项目里包含了 jQuery,jQuery.UI ,和 SignalR 的脚本. 服务端 ...
- 01LaTeX学习系列之---TeX的介绍与认识
目录 01TeX的介绍与认识 目录 前言 (一)TeX 的宣传 TeX - Beauty and Fun 1. TeX 是什么? 2. TeX 是哪家公司生产的? 3. 我们今天主角的名字怎么念啊?& ...
- 【SignalR学习系列】8. SignalR Hubs Api 详解(.Net C# 客户端)
建立一个 SignalR 连接 var hubConnection = new HubConnection("http://www.contoso.com/"); IHubProx ...
- 【SignalR学习系列】7. SignalR Hubs Api 详解(JavaScript 客户端)
SignalR 的 generated proxy 服务端 public class ContosoChatHub : Hub { public void NewContosoChatMessage( ...
- 【SignalR学习系列】6. SignalR Hubs Api 详解(C# Server 端)
如何注册 SignalR 中间件 为了让客户端能够连接到 Hub ,当程序启动的时候你需要调用 MapSignalR 方法. 下面代码显示了如何在 OWIN startup 类里面定义 SignalR ...
- 【SignalR学习系列】5. SignalR WPF程序
首先创建 WPF Server 端,新建一个 WPF 项目 安装 Nuget 包 替换 MainWindows 的Xaml代码 <Window x:Class="WPFServer.M ...
- 【SignalR学习系列】3. SignalR实时高刷新率程序
创建项目 创建一个空的 Web 项目,并在 Nuget 里面添加 SignalR,jQuery UI 包,添加以后项目里包含了 jQuery,jQuery.UI ,和 SignalR 的脚本. 创建基 ...
- 【SignalR学习系列】2. 第一个SignalR程序
新建项目 1.使用VisualStudio 2015 新建一个Web项目 2.选择空模板 3.添加一个新的SignalR Hub Class (v2)类文件,并修改类名为ChatHub 4.修改Cha ...
随机推荐
- qt编译的基于xlib cairo的桌面程序
在*.pro中添加以下代码: INCLUDEPATH += /usr/include/cairo LIBS += -lX11 -lcairo 在ubuntu16下编译通过
- Mac远程连接windows报错“证书或相关链无效,是否仍要连接到此计算机”的处理办法。
这个主要是因为策略组设置的问题.详细的设置方法如下: 本地计算机策略>计算机配置>管理模板>windows组件>远程桌面服务>远程桌面会话主机>安全>远程(R ...
- java中计算两个时间差
java计算时间差及比较时间大小 比如:现在是2004-03-26 13:31:40 过去是:2004-01-02 11:30:24 我现在要获得两个日期差,差的形式为:XX天XX小时XX分XX秒 方 ...
- Python 第八章笔记
第八章总结 8.5. heapq - 堆队列算法 有8个算法 方法 heappush heappop heappushpop heapreplace heapify merge nlargest ns ...
- 关闭数据库下的所有连接操作 sql存储过程
use master go )) as begin ),) declare @spid int set @sql='declare getspid cursor for select spid fro ...
- Mybatis中使用 #{} 和 ${} 向sql传参时的区别
今天在工作时,使用MyBatis中向sql传递两个参数时,一直显示SQL语法错误,仔细检查,才发现传入的参数被加上了引号,导致传入的参数(要传入的参数是表名)附近出现语法错误. 错误写法: } a } ...
- 【hexo】如何在一个小时内搭载个人博客
版权申明:本文为博主原创文章,未经博主允许不得转载.如需转载,请私聊博主. 什么是hexo Hexo是一个开源的静态博客生成器,用node.js开发,作者是台湾大学生tommy351. 前期准备 安装 ...
- 【Android Developers Training】 102. 序言:让你的应用获知地点
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 致命错误:mysql/cli 目录 #include "mysql/client_plugin.h"
居然说没有mysql.h这个文件,可是我确实安装了mysql了啊....... 原来是缺少libmysqlclient-dev,OK安装就是了 ubuntu下 : audo apt-get in ...
- rownumber和rowid伪劣用法
select rownum ,deptno,dname loc from dept; select deptno,dname,loc from dept where rownum=1; select ...