3

使用带有 JS 长轮询客户端的 SignalR 持久连接,我们会看到不同场景下不一致的重新连接行为。当客户端机器的网线被拔掉时,JS连接不会进入重新连接状态,它永远不会(至少5分钟后不会)达到断开状态。对于其他情况,例如重新启动 IIS Web 应用程序,长轮询 JS 连接确实会进入重新连接状态并成功重新连接。我知道这背后的原因是长轮询传输不支持保持活动。

我可以看到在 github 上提出了一个建议,以更好地支持长轮询传输的重新连接(https://github.com/SignalR/SignalR/issues/1781),但似乎没有承诺改变它。

首先,在长轮询的情况下,是否有适当的解决方法来检测客户端上的断开连接。其次,有人知道在所描述的情况下是否有计划支持重新连接?

干杯

4

1 回答 1

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); 
    }
});

希望这可以帮助!

于 2013-10-29T18:23:32.613 回答