根据我的阅读,SignalR 客户端在连接时不应错过来自服务器的任何消息。使用长轮询时似乎并非如此。
我有一个使用 SignalR 1.1.2 的简单的基于集线器的应用程序。使用 SSE 时,如果在超时期限内拔下并重新插入网线,客户端和服务器都会收到重新连接的通知,据我所知,没有任何消息丢失。使用长轮询时,这似乎发生了:
- 创建连接时($.connection.hub.start()),集线器中调用 OnConnected 方法,客户端进入连接状态。
- 如果我随后拔下网络电缆并快速将其重新插入,则不会调用 OnDisconnected 或 OnConnected。没有遗漏任何消息。任何在服务器上等待的消息随后都会发送到客户端。到目前为止还可以。
- 如果我拔掉网线并让长轮询过期,我会接到 OnDisconnected 的电话。客户端没有状态变化。
- 如果我将网络电缆重新插入客户端,则会再次开始接收消息。客户端上一直没有通知断线,但是客户端漏掉了一些消息。服务器上没有调用 OnReconnected 或 OnConnected。
这是一个错误吗?SSE 和长轮询之间的行为似乎非常不同。是否有推荐的策略来确保客户端在这种情况下不会错过消息?我可以跟踪服务器上的连接 ID 并从客户端发送定期 ping - 如果我在 OnDisconnected 后收到 ping 我可以发送一条消息告诉客户端重新同步,但这似乎不是正确的做法. 有什么建议么?