首页 > 解决方案 > 完全禁用 SignalR 中的回退

问题描述

我挖了很多文章来弄清楚当连接丢失时如何在 SignalR 中禁用回退,但似乎没有。

我的 SignalR服务器配置如下

protected void Application_Start()
{
 GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110);
 GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(10);
 GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(2);
.....

我的客户Microsoft.AspNet.SignalR.Client在 Xamarin.Android 上使用如下

hubConnection = new HubConnection("https://*******azurewebsites.net/*****", querystringData);
mhubProxy = hubConnection.CreateHubProxy("******");
try
{
 hubConnection.StateChanged += HubConnection_StateChanged; 
 await hubConnection.Start();
 return true;
}
catch (Exception X)
{
 Log.Info(TAG, "SignalR: " + X.Message);
 return false;
}

我的整个设置工作正常,只有一个问题。如果客户端的 Internet 断开连接,SignalR 服务器不会OnDisconnected立即触发并开始回退。整个过程大约需要 10 分钟才能OnDisconnected触发。

所以我可以有以下两种结果

结果 1:如果重新打开互联网

在这种情况下,当客户端重新打开互联网时,我尝试重新连接客户端,在服务器上,SignalR 关闭旧连接并将客户端连接到新的 ConnectionId :( 让我很难过

结果 2:如果在该后备窗口期间从未重新打开互联网

SignalR 服务器调用OnDisconnected:( 也让我感到难过,因为它需要 10 分钟(从我在客户端断开互联网的时间开始),如以下时间戳所示

在此处输入图像描述

我的问题是 SignalR 是否要关闭与旧的旧连接ConnectionId并将新的连接分配给ConnectionId同一个客户端,那么为什么它会执行回退而不是OnDisconnected首先触发。另外,更重要的是如何确保它始终触发OnDisconnected并且永远不会进入回退状态?

标签: asp.net-mvcsignalr

解决方案


这就是为什么“新” SignalRfor.NET Core does没有重新连接逻辑,因此用户被迫自己实现它。我会检查客户端的连接,如果它被掺杂,自动重新连接。此外,我会将用户映射到组,因此在这种情况下 connectionId 将无关紧要。


推荐阅读