zoukankan      html  css  js  c++  java
  • 【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,那么会使用其他的协议进行通讯。

    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 ExplorerChrome (Windows or iOS)FirefoxSafari (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 applicationSilverlight
    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/ .NETWindows Store/ JavaScriptWindows Phone/ IEWindows 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
  • 相关阅读:
    (转)ANT与RTS的结合
    (转)[Android] 利用 ant 脚本修改项目包名
    (转)MULTIPLE TARGETS FROM ONE ANDROID SOURCE (THE BETTER WAY)
    JS+CSS打造网站头部蓝色简约可自动显示/隐藏的导航菜单
    CSS打造很棒的黑色背景下的导航菜单
    老外JS实现的Infinite Menus
    【荐】JavaScript打造的无限级可刷新树型折叠菜单
    【荐】纯CSS打造超酷的圆角菜单,鼠标移过向上/向下扩张
    来自阿里巴巴网的滑动TAB导航特效
    适用于商城JS实现的可折叠的商品分类导航
  • 原文地址:https://www.cnblogs.com/webenh/p/9560521.html
Copyright © 2011-2022 走看看