2012-02-17 859 views
26

我已经看到如何通过绑定到.disconnect事件来在SignalR客户端捕获断开连接事件。SignalR:检测客户端的连接状态

现在我已经完成了这个工作,我想让客户端进入一个“等待重新连接的循环”,它不断尝试连接,直到成功或用户取消。中心是否公开连接状态属性?我在想像(伪代码)

var isConnected; 

function onConnected() { isConnected = true; } 

hub.disconnect = function() { while(hub.notconnected) { connect(); } 

回答

46

JS客户端尝试重新连接一段时间,默认为110秒。您可以订阅connection.stateChanged事件,并获取有关状态更改的更新,以便您可以将其显示给用户,或验证SignalR对不同断开连接情况的响应。

在我的测试中,状态已正确更新为断开连接并重新连接等,如您所料。

More information on signalr connections

function connectionStateChanged(state) { 
    var stateConversion = {0: 'connecting', 1: 'connected', 2: 'reconnecting', 4: 'disconnected'}; 
    console.log('SignalR state changed from: ' + stateConversion[state.oldState] 
    + ' to: ' + stateConversion[state.newState]); 
} 

connection = $.connection(signalR_Endpoint); 
connection.stateChanged(connectionStateChanged); 
connection.start({ waitForPageLoad: false }); 
+7

我不认为这是完全正确的。如果我失去了连接到我的服务器,它最终会放弃尝试重新连接,并强迫我手动重新启动连接。我不会说它总是试图重新连接。 – KingOfHypocrites 2014-05-01 11:53:25

+2

请注意,可能的状态在'$ .signalR.connectionState'上枚举,例如'$ .signalR.connectionState.connected'。您可以看到'stateChanged' [here]的当前用法(https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client#connectionstatechanged-handlerchange-) – 2014-06-26 15:31:49

+0

查看客户端[code](https: //github.com/SignalR/SignalR/blob/master/src/Microsoft.AspNet.SignalR.Client.JS/jquery.signalR.transports.longPolling.js),我没有找到任何可能会停止的条件一段时间后重新连接。但是,有一个退避计算会导致失败的重新连接尝试之间的时间越来越长,直到连接成功。所以我相信,只要页面JS在浏览器中处于活动状态,它就会试图“永远”重新连接。 – Mazrick 2014-09-09 14:06:22

8

客户端总是尝试连接。你不必担心这一点。如果您想在连接成功重新建立时执行某些操作,则可以收听重新连接的事件。

编辑:这改变了,客户端只尝试在一段时间内重新连接。之后,您必须捕捉断开连接事件并手动重新启动。

+0

有什么特别的,我需要做来实现重新连接?看来我没有得到断开或重新连接事件触发。目前我在做:$ .connection.hub.disconnect = onDisconnected; $ .connection.hub.reconnect = onReconnected;在客户端上,并在集线器上实施了IDisconnect。 – Heather 2012-02-20 20:54:54

+0

@Jon IDisconnect接口用于服务器端事件,它工作正常(确保您使用的是SignalR 0.4)。在客户端,Disconnect事件永远不会被触发,因为SignalR永远不能确定你是否断开连接(这在未来我可能会改变)。重新连接应该工作,但我没有测试它,所以我不能帮你。 – nmat 2012-02-21 23:38:28

+1

我发现如果c#客户端断开连接状态,它不会重新连接。我必须重做hubConnection.Start()。Wait(); (我不知道这是否是一种好的做法!)我的场景是一台机器上的控制台应用程序与另一台机器上的网站交谈。如果我清理/重建网站,我们将通过重新连接,断开连接并且不会恢复,除非我手动强制它。 – Andiih 2014-06-17 16:15:38

相关问题