2013-10-29 57 views
3

对JS长轮询客户端使用SignalR持久连接,我们发现在不同的场景中重新连接行为不一致。当客户端机器的网络电缆被拔出时,JS连接不会进入重新连接状态,并且它从不(至少在5分钟后)达到断开连接状态。对于其他情况,例如重新启动IIS Web应用程序,长轮询JS连接确实进入重新连接状态并成功重新连接。我明白这背后的原因是长时间投票传输不支持保持活跃状态​​。SignalR长轮询重新连接行为

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

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

干杯

回答

3

我们讨论不同的替代方案,以支持保活“喜欢”功能对于长轮询;然而,由于投票的覆盖时间有多长,在不影响绝大多数用户的情况下实施起来并不容易。随着我们继续辩论“正确”的解决方案,我将为您提供一项解决方案,以便在长轮询客户端中检测网络故障(如果绝对需要)。

创建一个服务器的方法,让我们称它为平:

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

希望这有助于!

+1

感谢您的回答。检测客户端上的断开连接对于我们的应用程序的工作是非常必要的,所以我认为我们会像您所建议的那样使用某种类型的定期ping。谢谢! – xsov