SignalR 如何在内部工作?

有人能告诉我 SignalR 在内部是如何高层次地工作的吗?

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

44332 次浏览

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

SignalR 有一些内置的传送器:

  1. WebSockets
  2. 服务器发送事件
  3. 永恒的画框
  4. 很长的投票

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

如果您想了解每个传输是如何实现的,可以查看 源代码

还有每个传输的客户端代码: Https://github.com/signalr/signalr/tree/master/src/microsoft ,AspNet,SignalR.client,js

如果你特别想知道长时间的投票传输是如何工作的:

它向异步等待信号响应的服务器发送一个 ajax 请求。当出现信号或请求超时时,它从服务器返回并发送另一个请求,进程继续。(我漏掉了一些细节,比如客户端如何跟踪它看到的内容,以免错过消息)

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

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

  • WebSocket 是唯一在客户机和服务器之间建立真正持久的双向连接的传输。不过,只有 IIS 8或以上版本,以及最新版本的 Internet Explorer 浏览器(Google Chrome 和 Mozilla Firefox)才支持 WebSocket。
  • 虽然服务器发送事件,永久框架和长轮询,所有三个遵循单向通信,并支持大多数浏览器。