SignalR如何在内部工作?

时间:2011-10-18 12:16:45

标签: signalr

有谁能让我知道SignalR如何以高水平的方式在内部工作?

我猜它正在使用Response.Flush刷新数据,并且在客户端它以一定的间隔发送Ajax请求。这是对的吗?

2 个答案:

答案 0 :(得分:231)

不,SignalR是连接的抽象。它为您提供了两种编程模型(集线器和持久连接)。 SignalR具有传输概念,每个传输决定数据的发送/接收方式以及连接和断开连接的方式。

SignalR有一些内置的传输方式:

  1. 的WebSockets
  2. 服务器已发送事件
  3. 永远的框架
  4. 长轮询
  5. SignalR尝试选择服务器和客户端支持的“最佳”连接(您也可以强制它使用特定的传输)。

    这是高水平。如果您想了解每种传输的实现方式,可以查看source code

    每个传输还有客户端代码: https://github.com/SignalR/SignalR/tree/master/src/Microsoft.AspNet.SignalR.Client.JS

    如果您询问长轮询运输如何运作:

    它向服务器发送ajax请求,该服务器异步等待信号响应。当有信号或请求超时时,它从服务器返回并发送另一个请求并继续该过程。 (我留下了一些关于客户如何跟踪它所看到的内容以及它不会错过消息的细节)

    希望这能回答你的大部分问题。

答案 1 :(得分:2)

@davidfowl已经回答了主要部分。但是,要提供有关传输行为差异的更多细节,特别是WebSocket和其他传输之间的差异;以下是一些观点。

  • WebSocket是唯一一种在客户端和服务器之间建立真正持久的双向连接的传输。但是,WebSocket仅受IIS 8或更高版本以及最新版本的Internet Explorer,Google Chrome和Mozilla Firefox支持。
  • 当服务器发送事件,永久帧和长轮询时,这三个都遵循单向通信,并且大多数浏览器都支持。