为什么 SIgnalR 更喜欢 Forever Frames 而不是轮询?

Why does SIgnalR prefer Forever Frames over polling?

我正在学习使用 SignalR,到目前为止我已经成功了。我可以实现集线器,我可以实现业务逻辑,我可以从我想要的服务器调用客户端功能,我可以从客户端调用服务器端方法,这些东西很棒。令我困惑的是理论。

事实上,我从这个 video. SignalR is using WebSockets, which provide a full duplex channel over a single TCP connection. If no WebSockets are available, then the fallback protocol will be EventSource 中收集了信息。如果那不可用,则将使用 Forever Frame。如果那不可用,则将使用长轮询。对我来说,一个非常 hacky 的解决方案(如永久帧)比旧约定更受青睐,这对我来说相当奇怪,我对 SignalR 决定将永久帧作为第三个选项并将轮询作为第四个选项的基本原理感兴趣。

我试图找出这个问题的答案,但我发现有传言说 there is a 3x max latency time in the case of long polling compared to forever frames。这是事实吗?如果是,是所有浏览器还是部分浏览器?

foreverFrame 的工作方式有点像 serverSentEvents - 有一个很长的 运行 http 请求,服务器永远不会终止但用于将数据推送到客户端。 longPolling 的工作方式不同——每次有数据供客户端读取(或超时到期)时,服务器都会关闭一个轮询 http 请求。如果客户端想要读取更多数据,它需要打开一个新的 http 请求,一旦客户端有任何数据,服务器将再次关闭该请求。换句话说,在 foreverFrame 的情况下,服务器使用已建立的通道将数据推送到客户端,而在 longPolling 的情况下,客户端不断创建 http 请求以从服务器获取数据。