166

谁能让我知道 SignalR 如何在内部以高级方式工作?

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

4

2 回答 2

253

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

SignalR 有一些内置的传输:

  1. 网络套接字
  2. 服务器发送事件
  3. 永远的框架
  4. 长轮询

SignalR 尝试选择服务器和客户端支持的“最佳”连接(您也可以强制它使用特定的传输)。

这就是高水平。如果您想了解每个传输是如何实现的,可以查看源代码

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

如果您特别询问长轮询传输的工作原理:

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

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

于 2011-10-24T10:37:21.803 回答
9

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

  • WebSocket 是唯一一种在客户端和服务器之间建立真正持久的双向连接的传输方式。但是,WebSocket 仅支持 IIS 8 或更高版本,以及最新版本的 Internet Explorer、Google Chrome 和 Mozilla Firefox。
  • 虽然 Server Sent Events、Forever Frame 和 Long polling,所有这三个都遵循单向通信,并且被大多数浏览器支持。
于 2017-04-04T06:41:39.857 回答