使用与JS长轮询客户端的SignalR持久连接,我们在不同的场景中看到不一致的重新连接行为。当客户端计算机的网络电缆被拔出时,JS连接不会进入重新连接状态,并且从不(至少在5分钟后)到达断开连接状态。对于其他方案(例如重新启动IIS Web应用程序),长轮询JS连接会进入重新连接状态并成功重新连接。据我所知,这背后的原因是长轮询传输不支持keep-alive。
我可以看到已经在github上提出建议,以便更好地支持长轮询传输的重新连接(https://github.com/SignalR/SignalR/issues/1781),但似乎没有承诺改变它。
首先,在长轮询的情况下,是否有适当的解决方法来检测客户端上的断开连接。 其次,是否有人知道是否有计划在所描述的情况下支持重新连接?
干杯
答案 0 :(得分:3)
我们已经讨论了不同的替代方案,以支持长时间轮询的“保持活力”特征;但是,由于在幕后工作多长时间,在不影响绝大多数用户的情况下实施并不容易。当我们继续讨论“正确”的解决方案时,我会留下一个解决方案来检测长轮询客户端中的网络故障(如果它是绝对需要的)。
创建一个服务器方法,让我们称之为ping:
public class MyHub : Hub
{
public void Ping()
{
}
}
现在在客户端上创建一个“ping”服务器的时间间隔:
var proxy = $.connection.myHub,
intervalHandle;
...
$.connection.hub.disconnected(function() {
clearInterval(intervalHandle);
});
...
$.connection.hub.start().done(function() {
// Only when long polling
if($.connection.hub.transport.name === "longPolling") {
// Ping every 10s
intervalHandle = setInterval(function() {
// Ensure we're connected (don't want to be pinging in any other state).
if($.connection.hub.state === $.signalR.connectionState.connected) {
proxy.server.ping().fail(function() {
// Failed to ping the server, we could either try one more time to ensure we can't reach the server
// or we could fail right here.
TryAndRestartConnection(); // Your method
});
}
}, 10000);
}
});
希望这有帮助!