有人能告诉我 SignalR 在内部是如何高层次地工作的吗?
我猜测它正在使用 Response.Flush刷新数据,并且在客户端以一定的间隔发送 Ajax 请求。对吗?
Response.Flush
不,SignalR 是连接上的抽象。它在该连接上提供了两个编程模型(集线器和持久连接)。SignalR 有一个传输的概念,每个传输决定如何发送/接收数据以及如何连接和断开数据。
SignalR 有一些内置的传送器:
SignalR 尝试选择服务器和客户端支持的“最佳”连接(您也可以强制它使用特定的传输)。
如果您想了解每个传输是如何实现的,可以查看 源代码。
还有每个传输的客户端代码: Https://github.com/signalr/signalr/tree/master/src/microsoft ,AspNet,SignalR.client,js
如果你特别想知道长时间的投票传输是如何工作的:
它向异步等待信号响应的服务器发送一个 ajax 请求。当出现信号或请求超时时,它从服务器返回并发送另一个请求,进程继续。(我漏掉了一些细节,比如客户端如何跟踪它看到的内容,以免错过消息)
希望这能回答你的大部分问题。
@ davidfowl 已经回答了主要部分。但是,为了提供有关传输行为差异的更多细节,特别是 WebSocket 和其他传输之间的差异; 以下是一些要点。