SignalR:检测客户端连接状态

39

我已经了解到如何使用SignalR通过绑定.disconnect事件在客户端捕获断开连接的情况。

现在,我想将客户端放入“等待重新连接循环”中,直到成功连接或用户取消为止。Hub是否公开连接状态属性?我考虑使用类似于以下的伪代码:

var isConnected;

function onConnected() { isConnected = true; }

hub.disconnect = function() { while(hub.notconnected) { connect(); }
3个回答

62

本回答仅适用于"SignalR版本2",最新版本的"ASP.NET Core SignalR"可能有所不同。

SignalR版本2: JS客户端会在一定时间内尝试重新连接,默认为110秒。您可以订阅connection.stateChanged事件,并获取状态更改的更新,以便将其显示给用户或验证SignalR对不同断开连接场景的响应。

在我的测试中,状态被正确地更新为已断开连接和正在重新连接等,正如您所期望的那样。

有关signalr连接的更多信息

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
5
请注意,可能的状态在 $.signalR.connectionState 中枚举,例如 $.signalR.connectionState.connected。您可以在此处查看 stateChanged 的当前使用情况 链接 - Jon Egerton
查看客户端code ,我没有找到任何参考条件,可以在一段时间后停止重新连接。但是,有一个退避计算,导致重新连接尝试之间的时间越来越长,直到成功连接为止。因此,只要浏览器中的页面JS处于活动状态,我相信它将会一直尝试重新连接。 - Mazrick
3
如果有人来到这里,请注意,这里写的所有内容仅适用于jQuery SignalR插件,在官方JavaScript库中没有名为“stateChanged”的事件:https://learn.microsoft.com/en-us/javascript/api/@microsoft/signalr/hubconnection?view=signalr-js-latest - seekingtheoptimal

11
客户端始终在尝试连接,您不需要担心。 如果您想要在连接成功重新建立时执行某些操作,可以监听重新连接事件。

编辑:情况已更改,客户端只会在一定时间内尝试重新连接。之后,您必须捕获断开连接事件并手动重新启动连接。


我需要特别注意什么才能实现重新连接吗?似乎我没有收到断开连接或重新连接事件的触发。目前我在客户端上这样做:$.connection.hub.disconnect = onDisconnected; $.connection.hub.reconnect = onReconnected; 并在hub上实现了IDisconnect。 - Heather
@Jon,IDisconnect接口用于服务器端事件,它可以正常工作(确保您正在使用SignalR 0.4)。在客户端上,Disconnect事件从未触发,因为SignalR从未真正确定您已断开连接(我认为这可能会在将来改变)。重新连接应该可以工作,但我没有测试过,所以无法帮助您。 - nmat
1
我发现C#客户端在断开连接后不会自动重新连接。我必须重新执行hubConnection.Start().Wait()。(我不知道这是否是一个好的做法!)我的情况是一个控制台应用程序在一台机器上与另一台网站通信。如果我清理/重建网站,我们将经历重新连接、断开连接并且除非我手动强制它,否则永远无法恢复。 - Andiih
4
不正确。如果连接中断了一两分钟,它将完全退出。ASP.net SignalR页面解决了这个问题,并解释了在这些情况下需要重新调用hub.start(可以通过hub.disconnected或hub.statechanged检测)。 - Josh Sutterfield

5
这是我的代码:
$.connection.hub.stateChanged(function (state) {
            var stateConversion = { 0: 'connecting', 1: 'connected', 2: 'reconnecting', 4: 'disconnected' };
            console.log('SignalR state changed from: ' + stateConversion[state.oldState]
                + ' to: ' + stateConversion[state.newState]);
        });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接