SignalR - 不使用长轮询调用OnReconnected

时间:2013-06-04 08:48:54

标签: asp.net asp.net-mvc-4 signalr long-polling

根据我的阅读,SignalR客户端在连接时不应错过来自服务器的任何消息。使用长轮询时似乎不是这种情况。

我使用SignalR 1.1.2有一个简单的基于集线器的应用程序。使用SSE时,如果在超时期限内拔下网络电缆并重新插入,则会通知客户端和服务器已发生重新连接,据我所知,没有错过任何消息。使用长轮询时,似乎会发生这种情况:

  • 创建连接时($ .connection.hub.start()),在集线器中调用OnConnected方法,客户端进入连接状态。
  • 如果我然后拔下网线并快速弹回,则无法调用OnDisconnected或OnConnected。没有错过任何消息。随后在服务器上等待的任何消息都将发送到客户端。好了到目前为止。
  • 如果我拔下网线并让长轮询过期,我会接到OnDisconnected的电话。客户端没有状态变化。
  • 如果我在客户端重新插入网络电缆,则会再次开始接收消息。客户端上没有通知它已断开连接,但客户端错过了一些消息。服务器上没有OnReconnected或OnConnected的调用。

这是一个错误吗? SSE和长轮询之间的行为似乎非常不同。 是否有建议的策略来确保客户端不会错过此方案中的消息?我可以跟踪服务器上的连接ID并定期从客户端发送ping - 如果我在OnDisconnected后收到ping,我可以发送一条消息告诉客户端重新同步,但这似乎不是正确的做法。 有什么建议吗?

1 个答案:

答案 0 :(得分:2)

WebSockets,Server Sent Events和Forever Frame都利用客户端保持活动状态,用于确保客户端连接。但是,由于技术限制,Long Polling不使用客户端保持活动功能,并且无法保证连接等拉出网络电缆的事件。

当我说不能保证时,我只是声明SignalR不再能够确保长轮询传输,而是依靠浏览器在Long Polling的ajax连接上触发正确的事件(SignalR可以通过它连接)。

请记住,如果客户确实在拔出网线后确实重新获得与服务器的连接,它将收到在停机期间错过的任何消息。因此,消息不会错过,它们只会被延迟。

最后,如果服务器长时间未看到客户端,则会触发OnDisconnected事件。为了在诸如拔出网络电缆的情况下发生这种情况,服务器将首先超时当前连接的请求,然后将连接本身超时。这意味着您仍然可以依赖OnDisconnected事件,它可能会因网络状况而延迟。

Soooo你所看到的是100%设计=)

希望这有帮助!