什么是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. ASP.NET MVC5(四):数据注解和验证

    前言 用户输入验证的工作,不仅要在客户端浏览器中执行,还要在服务端执行.主要原因是客户端验证会对输入数据给出即时反馈,提高用户体验:服务器端验证,主要是因为不能完全信任用户提供的数据.ASP.NET ...

  2. 常用DOM API

    Node Node是一个接口,中文叫节点,很多类型的DOM元素都是继承于它,都共享着相同的基本属性和方法.常见的Node有 element,text,attribute,comment,documen ...

  3. Owl Carousel幻灯片插件的使用

    Owl Carousel 是一个强大.实用但小巧的 jQuery 幻灯片插件,它具有一下特点: 兼容所有浏览器 支持响应式 支持 CSS3 过度 支持触摸事件 支持 JSON 及自定义 JSON 格式 ...

  4. mybatis if test 解决页面 升序和降序的问题

    <if test="status !=null and status !='' and status =='1'.toString()"> ORDER BY tag.c ...

  5. webpack前端工程化构建工具的使用

    一.模块打包机 1.创建文件 在目标文件下建立一个src文件夹作为js代码区:作为例子,我创建了两个js文件,并利用commonJS规范require引入到index.js中: moduleA.js: ...

  6. [leetcode-606-Construct String from Binary Tree]

    You need to construct a string consists of parenthesis and integers from a binary tree with the preo ...

  7. Example016实现下拉框

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Oracle 11g RAC 自动应用PSU补丁简明版

    环境:Oracle RAC(GI 11.2.0.4 + DB 11.2.0.4) 本文应用补丁信息: Patch 23615403 - Combo of OJVM Component 11.2.0.4 ...

  9. maven仓库--搭建局域网私服(windows版)

    使用nexus搭建局域网私服 一. 认识maven仓库 1.1 maven仓库的作用   回想之前不用maven的时候,我们用eclipse原始的项目骨架构建项目时,在工程目录下往往有一个lib文件夹 ...

  10. 自定义MapReduce中数据类型

    数据类型(都实现了Writable接口) BooleanWritable 布尔类型 ByteWritable 单字节数值 DoubleWritable 双字节数值 FloatWritable 浮点数 ...