asp.net-mvc - 完全禁用 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 分钟(从我在客户端断开互联网的时间开始),如以下时间戳所示
- 1 = 连接
- 0 = 断开连接
- 右侧的 ConnectionIds
我的问题是 SignalR 是否要关闭与旧的旧连接ConnectionId
并将新的连接分配给ConnectionId
同一个客户端,那么为什么它会执行回退而不是OnDisconnected
首先触发。另外,更重要的是如何确保它始终触发OnDisconnected
并且永远不会进入回退状态?
解决方案
这就是为什么“新” SignalR
for.NET Core does
没有重新连接逻辑,因此用户被迫自己实现它。我会检查客户端的连接,如果它被掺杂,自动重新连接。此外,我会将用户映射到组,因此在这种情况下 connectionId 将无关紧要。
推荐阅读
- logging - Ultra Task 无法检索全部记录
- css - 如何调整 CSS 网格项元素?如何设置与宽度相同的高度?
- java - 如果先调用flush()然后关闭,为什么Java GzipOutputStream总是在预告片之前写入两个字节03 00?
- c - 使用 fork() 精确创建 5 个进程
- java - 如何测试带有 @PreAuthorized(hasAnyAuthority(...)) 注释的 Spring Boot 控制器方法
- python - 如何使用 pandas 数据框在 oracle 表中插入多条记录
- c# - Authentication.AuthenticateAsync 返回 null
- java - Java阻塞队列为什么如果queue.size == 0我们在队列中有notifyall?
- c++ - mersenne_twister_engine 实例的种子是不变的吗?
- deep-learning - torchvision.transforms.Resize(size, interpolation=2) 实际上做了什么?