什么是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,那么会使用其他的协议进行通讯。

  1. WebSocket。如果服务器和客户端都支持,那么就使用WebSocket协议来进行通讯。
  2. 服务器推送事件(Server-sent Events)。除了IE,其他的浏览器基本都支持。

Comet协议

下面两种协议都是基于Comet模型。

  1. Forever Frame (只支持IE)。
  2. Ajax长轮询(Ajax long polling)。

SignalR协议选择过程

下面的列表显示SignalR是如何选择具体使用的协议。

  1. 如果浏览器是IE8或者更早的版本,使用长轮询。
  2. 如果配置了Jsonp(如果连接开始的时候jsonp的参数设置为true), 使用长轮询。
  3. 如果是跨域连接, 如果下面的条件符合就会使用WebSocket,如果有条件不符合,那就是用长轮询。
    • 客户端支持跨域连接
    • 客户端支持WebSocket
    • 服务器端支持WebSocket
  4. 如果没有配置jsonp,而且不是跨域连接,如果客户端和服务端都支持WebSocket,那么就使用WebSocket。
  5. 如果客户端或者服务端不支持WebSocket,使用服务器推送事件。
  6. 如果不支持服务器推送事件,使用Forever Frame。
  7. 如果不支持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理论介绍的更多相关文章

  1. .net reactor 学习系列(一)---.net reactor介绍

    原文:.net reactor 学习系列(一)---.net reactor介绍       学习.net已经一年多了,从语言的编写到框架类库的运用再到.net三大解决方案的了解(WF,WCF,WPF ...

  2. 【SignalR学习系列】4. SignalR广播程序

    创建项目 创建一个空的 Web 项目,并在 Nuget 里面添加 SignalR,jQuery UI 包,添加以后项目里包含了 jQuery,jQuery.UI ,和 SignalR 的脚本. 服务端 ...

  3. 01LaTeX学习系列之---TeX的介绍与认识

    目录 01TeX的介绍与认识 目录 前言 (一)TeX 的宣传 TeX - Beauty and Fun 1. TeX 是什么? 2. TeX 是哪家公司生产的? 3. 我们今天主角的名字怎么念啊?& ...

  4. 【SignalR学习系列】8. SignalR Hubs Api 详解(.Net C# 客户端)

    建立一个 SignalR 连接 var hubConnection = new HubConnection("http://www.contoso.com/"); IHubProx ...

  5. 【SignalR学习系列】7. SignalR Hubs Api 详解(JavaScript 客户端)

    SignalR 的 generated proxy 服务端 public class ContosoChatHub : Hub { public void NewContosoChatMessage( ...

  6. 【SignalR学习系列】6. SignalR Hubs Api 详解(C# Server 端)

    如何注册 SignalR 中间件 为了让客户端能够连接到 Hub ,当程序启动的时候你需要调用 MapSignalR 方法. 下面代码显示了如何在 OWIN startup 类里面定义 SignalR ...

  7. 【SignalR学习系列】5. SignalR WPF程序

    首先创建 WPF Server 端,新建一个 WPF 项目 安装 Nuget 包 替换 MainWindows 的Xaml代码 <Window x:Class="WPFServer.M ...

  8. 【SignalR学习系列】3. SignalR实时高刷新率程序

    创建项目 创建一个空的 Web 项目,并在 Nuget 里面添加 SignalR,jQuery UI 包,添加以后项目里包含了 jQuery,jQuery.UI ,和 SignalR 的脚本. 创建基 ...

  9. 【SignalR学习系列】2. 第一个SignalR程序

    新建项目 1.使用VisualStudio 2015 新建一个Web项目 2.选择空模板 3.添加一个新的SignalR Hub Class (v2)类文件,并修改类名为ChatHub 4.修改Cha ...

随机推荐

  1. git rebase -i命令修改commit历史

    [TOC] 修改commit历史的前提 修改历史的提交是可能有风险的,是否有风险取决于commit是否已经推送远程分支,未推送,无风险,如果已推送,就千万不要修改commit了. 修改commit历史 ...

  2. python通过excel对数据库插入数据

    1.需要有两个包文件xlrd及MySQLdb(其他数据库可以另外找) 2.读取excel文件信息 book = xlrd.open_workbook(文件地址) 3.建立MySQL链接 databas ...

  3. 用GAN生成二维样本的小例子

    同步自我的知乎专栏:https://zhuanlan.zhihu.com/p/27343585 本文完整代码地址:Generative Adversarial Networks (GANs) with ...

  4. if中可以使用那些作为判断条件呢?

    在所有编程语言中if是最长用的判断之一,但在js中到底哪些东西可以在if中式作为判断表达式呢? 例如如何几行,只是少了一个括号,真假就完全不同,到底表示什么含义呢 ? 1 2 3 4 5 6 7 8 ...

  5. .net 4.0 中的特性总结(五):并行编程

    1.任务并行库 从 .NET Framework 4 开始,TPL 是编写多线程代码和并行代码的首选方法. 但是,并不是所有代码都适合并行化:例如,如果某个循环在每次迭代时只执行少量工作,或它在很多次 ...

  6. java hascode

    有部分代码如下: Cat cat=new Cat("Kitty",2);system.out.println(cat):问题:输出什么? 调用并执行toString()方法,两种情 ...

  7. 九度OJ:1002-Grading

    时间限制:1 秒内存限制:32 兆特殊判题:否提交:24102解决:6126 题目描述: Grading hundreds of thousands of Graduate Entrance Exam ...

  8. 淘宝tairKV分布式

    Tair是什么 Tair是由淘宝开发的key/value方案,系统默认支持基于内存和文件的存储引擎,对应于通常我们所说的缓存和持久化存储,这里可以获取更多关于tair的信息,淘宝团队介绍,Tair在淘 ...

  9. django-xadmin列表页filter关联对象搜索问题

    环境:xadmin-for-python3 python3.5.2 django1.9.12 问题描述:Product ProductSku两个实体,ProductSku FK外键关联Product ...

  10. 微信小程序开发者注册流程

    一,首先打开浏览器,搜索微信公众平台 点击进入,此时还没有注册微信小程序开发账号,我们需要点击注册 进入注册页面,会出现四种账号,我们选择小程序账号 然后根据提示就可以进行注册了 注册时,需填写一下个 ...