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