什么是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. Context源码分析

    我们做安卓开发,时时都在和Context打交道,那么Context到底是什么?有什么作用?如何与Application,Activity,Service等实例发生联系的?等等 Context是什么? ...

  2. java 多线程基础

    线程是进程内的执行单元,进程当中都有若干个线程. 通常主线程或进程是阻塞式的按顺序执行的,如果希望异步执行些子任务,而不要阻塞当前线程的执行,即需要创建子线程,子线程创建后主线程可以等待它们的结果,得 ...

  3. Android 图片加载框架Glide4.0源码完全解析(一)

    写在之前 上一篇博文写的是Picasso基本使用和源码完全解析,Picasso的源码阅读起来还是很顺畅的,然后就想到Glide框架,网上大家也都推荐使用这个框架用来加载图片,正好我目前的写作目标也是分 ...

  4. 实现Runnable接口和继承Thread类之间的区别

    在Java语言中,我们都知道,有两种创建线程的方式,一中是使用Runnable接口,另一种是使用Thread类. public class DemoRunnable implements Runnab ...

  5. SQL之删除触发器

    比如要删除的触发器名字叫dbo.test_trigger. 先判断这个触发器是否存在,判断存在后删除 if exists (select * from sysobjects where name = ...

  6. Kubernetes服务之StatefulSets简介

    StatefulSets在v1.5时还是个beta特性,它取代了v1.4的PetSets特性.PetSets的用户可以参考v1.5的升级指导,将正在运行的PeetSets升级到StatefulSets ...

  7. 解决运行pytorch程序多线程问题

    当我使用pycharm运行  (https://github.com/Joyce94/cnn-text-classification-pytorch )  pytorch程序的时候,在Linux服务器 ...

  8. 【案例分享】SequoiaDB+Spark搭建医院临床知识库系统

    1.背景介绍 从20世纪90年代数字化医院概念提出到至今的20多年时间,数字化医院(Digital Hospital)在国内各大医院飞速的普及推广发展,并取得骄人成绩.不但有数字化医院管理信息系统(H ...

  9. 关于Ext 修复源代码 bug的方法

    Ext修复源代码出现的问题 1.使用override属性,重写组件 定义一个新的组件,override属性设为要重写的源组件 例子: Extjs4.2.3遇到的一个bug,Datefield 选择不了 ...

  10. H5仿微信界面教程(一)

    前言 先来张图,仿微信界面,界面如下,并不完全一模一样,只能说有些类似,希望大家见谅. 1 用到的知识点 jQuery WeUI 是WeUI的一个jQuery实现版本,除了实现了官方插件之外,它还提供 ...