SignalR:检测客户端上的连接状态

Posted

技术标签:

【中文标题】SignalR:检测客户端上的连接状态【英文标题】:SignalR: detect connection state on client 【发布时间】:2012-03-09 05:48:02 【问题描述】:

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

现在我已经完成了这项工作,我想让客户端进入“等待重新连接周期”,它会不断尝试连接,直到连接成功或用户取消。集线器是否公开连接状态属性?我在想类似(伪代码)

var isConnected;

function onConnected()  isConnected = true; 

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

【问题讨论】:

【参考方案1】:

此答案特定于“SignalR 版本 2”,最新版本 "ASP.NET Core SignalR" 可能有所不同。

SignalR 版本 2: 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 );

【讨论】:

我不认为这是完全正确的。如果我失去与服务器的连接,它最终会放弃尝试重新连接并强制我手动重新启动连接。我不会说它总是试图重新连接。 请注意,可能的状态在$.signalR.connectionState 上枚举,例如$.signalR.connectionState.connected。你可以看到stateChangedhere的当前使用情况 查看客户端code,我没有找到任何关于一段时间后实际上会停止重新连接的条件的引用。然而,有一个退避计算导致失败的重新连接尝试之间的时间越来越长,直到连接成功。所以我相信只要页面 JS 在浏览器中存活,它就会尝试“永远”重新连接。 万一有人来了,这里写的所有东西都只适用于jQuery SignalR插件,在官方javascript库中没有像'stateChanged'这样的事件:docs.microsoft.com/en-us/javascript/api/@microsoft/signalr/…【参考方案2】:

客户端一直在尝试连接。您无需担心。 有一个 reconnected 事件可供您收听,以防在成功重新建立连接后您想做某事。

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

【讨论】:

我需要做些什么来实现重新连接吗?似乎我没有触发 Disconnect OR Reconnect 事件。目前我正在做: $.connection.hub.disconnect = onDisconnected; $.connection.hub.reconnect = onReconnected;在客户端上,并在集线器上实现了 IDisconnect。 @Jon IDisconnect 接口用于服务器端事件,它工作正常(确保您使用的是 SignalR 0.4)。在客户端,永远不会触发 Disconnect 事件,因为 SignalR 永远不会真正确定您是否已断开连接(我认为这在未来可能会改变)。重新连接应该可以工作,但我还没有测试过,所以我无法帮助你。 我发现如果 C# 客户端处于断开连接状态,它不会重新连接。我必须重做 hubConnection.Start().Wait(); (我不知道这是否是一个好习惯!)我的场景是一台机器上的控制台应用程序与另一台机器上的网站交谈。如果我清理/重建网站,我们会重新连接、断开连接并且永远不会恢复,除非我手动强制它。 不正确。如果它无法连接一两分钟,它将完全退出。 ASP.net signalR 页面解决了这个问题并解释了在这些情况下确实需要再次调用 hub.start(可以通过 hub.disconnected 或 hub.statechanged 检测到)【参考方案3】:

这是我的代码:

$.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]);
        );

【讨论】:

以上是关于SignalR:检测客户端上的连接状态的主要内容,如果未能解决你的问题,请参考以下文章

SignalR HubConnectionState = 正在连接

.Net Core SignalR - 连接超时 - 心跳定时器 - 连接状态更改处理

ASP.NET SignalR - IIS 上处于 AuthorizeRequest 状态的连接过多

关于SignalR连接数量问题的记录

检测来自客户端的SignalR中丢失的连接

ActionCable:检测客户端连接丢失,向用户显示连接状态