Asp.net 信号器-不调用已使用长轮询重新连接

Asp.net 信号器-不调用已使用长轮询重新连接,asp.net,asp.net-mvc-4,signalr,long-polling,Asp.net,Asp.net Mvc 4,Signalr,Long Polling,从我所读到的信息来看,signar客户端在连接时不应该错过来自服务器的任何消息。在使用长轮询时,情况似乎并非如此 我有一个使用Signalr1.1.2的基于集线器的简单应用程序。使用SSE时,如果在超时期间拔下网络电缆并重新插入,则客户端和服务器都会收到重新连接的通知,并且据我所知,不会丢失任何消息。使用长轮询时,似乎会发生以下情况: 创建连接($.connection.hub.start())时,会在集线器中调用OnConnected方法,客户端将进入已连接状态 如果我随后拔下网络电缆并将其

从我所读到的信息来看,signar客户端在连接时不应该错过来自服务器的任何消息。在使用长轮询时,情况似乎并非如此

我有一个使用Signalr1.1.2的基于集线器的简单应用程序。使用SSE时,如果在超时期间拔下网络电缆并重新插入,则客户端和服务器都会收到重新连接的通知,并且据我所知,不会丢失任何消息。使用长轮询时,似乎会发生以下情况:

  • 创建连接($.connection.hub.start())时,会在集线器中调用OnConnected方法,客户端将进入已连接状态
  • 如果我随后拔下网络电缆并将其快速插回,则不会呼叫OnDisconnected或OnConnected。没有消息丢失。服务器上等待的任何消息随后都会发送到客户端。好的,到目前为止
  • 如果我拔下网络电缆,让长轮询过期,我会接到OnDisconnected的电话。客户端上没有状态更改
  • 如果我将网络电缆插回,客户端将再次开始接收消息。在客户端上没有关于已断开连接的通知,但客户端丢失了一些消息。在服务器上没有对OnReconnected或OnConnected的调用
这是虫子吗?SSE和long polling之间的行为似乎非常不同。 是否有一个推荐的策略来确保客户机在这种情况下不会错过消息?我可以跟踪服务器上的连接ID,并定期从客户端发送ping——如果在OnDisconnected之后收到ping,我可以发送消息告诉客户端重新同步,但这似乎不是正确的做法。
有什么建议吗?

WebSocket、服务器发送的事件和永久帧都使用客户端保持活动,用于确保客户端连接。但是,由于技术限制,长轮询不使用客户端保持活动的功能,并且不能保证事件(如拔出网络电缆)的连接性

当我说“不保证”时,我只是说长轮询传输不再能够由signar保证,而是依赖浏览器在长轮询的ajax连接上触发正确的事件(signar可以通过该连接响应)

但是请记住,如果客户机在拔出网络电缆后确实恢复了与服务器的连接,它将收到在停机期间丢失的任何消息。所以信息不会被错过,只是被延迟了

最后,如果服务器长时间看不到客户端,将触发OnDisconnected事件。对于这种情况,例如拔出网络电缆,服务器将首先使当前连接的请求超时,然后使连接本身超时。这意味着您仍然可以依赖OnDisconnected事件,它可能只是根据网络条件而延迟

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

希望这有帮助