0

当我用 F5 刷新浏览器页面时,不会立即调用 OnDisconnected 函数。在调用函数之前有几秒钟的延迟,使时间戳值无效。

 public override System.Threading.Tasks.Task OnDisconnected()

为什么会这样?signalR 中的正常行为吗?

4

2 回答 2

0

是的,这很正常。它发生在客户端断开连接时 - 当您刷新页面时,它首先调用 OnDisconnected() 并在 OnConnected() 之后导致您再次加载页面。它也有任务 OnReconnected() - 但是当您在代码中重新连接程序时会调用它。

于 2013-10-08T13:20:48.427 回答
0

只是为了进一步扩展这一点。SignalR 在连接终止后会在调用 OnDisconnected 之前等待一段时间。默认为 10 秒,但您可以在 Global.asax 文件中覆盖此设置(示例如下)。可悲的是,这个值至少需要 6 秒,但我明白了它背后的原因。

https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/handling-connection-lifetime-events#disconnecttimeout

protected void Application_Start(object sender, EventArgs e)
{
    // Make long polling connections wait a maximum of 110 seconds for a
    // response. When that time expires, trigger a timeout command and
    // make the client reconnect.
    GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110);
    
    // Wait a maximum of 30 seconds after a transport connection is lost
    // before raising the Disconnected event to terminate the SignalR connection.
    **GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(6);**
    
    // For transports other than long polling, send a keepalive packet every
    // 10 seconds. 
    // This value must be no more than 1/3 of the DisconnectTimeout value.
    GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10);
    
    RouteTable.Routes.MapHubs();
}

我处理这个问题的方法是在 OnConnected 函数中,我存储并查找客户端的另一个唯一标识(在我的情况下是 IP 地址),如果我找到那个客户端,继续删除那个旧连接来自我的自定义会话集合。

于 2021-07-23T14:55:40.663 回答