【问题标题】:SignalR - Not calling OnReconnected using long pollingSignalR - 不使用长轮询调用 OnReconnected
【发布时间】:2013-05-30 14:09:12
【问题描述】:

据我所知,SignalR 客户端在连接时不应错过来自服务器的任何消息。使用长轮询时,情况似乎并非如此。

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

  • 创建连接后 ($.connection.hub.start()) 将在集线器中调用 OnConnected 方法,并且客户端进入连接状态。
  • 如果我随后拔下网络电缆并快速将其重新插入,则不会调用 OnDisconnected 或 OnConnected。没有遗漏任何消息。任何在服务器上等待的消息随后都会发送到客户端。到目前为止还可以。
  • 如果我拔下网络电缆并让长轮询到期,我会接到 OnDisconnected 的呼叫。客户端没有状态变化。
  • 如果我将网络电缆重新插入客户端,则会再次开始接收消息。客户端上一直没有通知断线,但是客户端漏掉了一些消息。服务器上没有调用 OnReconnected 或 OnConnected。

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

【问题讨论】:

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


    【解决方案1】:

    WebSockets、服务器发送事件和永久帧都使用客户端保持活动状态,用于确保客户端连接。但是,由于技术限制,Long Polling 没有使用客户端保持活动功能,并且无法保证拔出网线等事件的连接性。

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

    但请记住,如果客户端在拔出网络电缆后碰巧重新与服务器建立连接,它会收到它在停机期间错过的任何消息。所以消息不会错过,只是延迟了。

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

    您所看到的是 100% 的设计 =)

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 2012-10-11
      • 2014-01-23
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      相关资源
      最近更新 更多