当我用 F5 刷新浏览器页面时,不会立即调用 OnDisconnected 函数。在调用函数之前有几秒钟的延迟,使时间戳值无效。
public override System.Threading.Tasks.Task OnDisconnected()
为什么会这样?signalR 中的正常行为吗?
当我用 F5 刷新浏览器页面时,不会立即调用 OnDisconnected 函数。在调用函数之前有几秒钟的延迟,使时间戳值无效。
public override System.Threading.Tasks.Task OnDisconnected()
为什么会这样?signalR 中的正常行为吗?
是的,这很正常。它发生在客户端断开连接时 - 当您刷新页面时,它首先调用 OnDisconnected() 并在 OnConnected() 之后导致您再次加载页面。它也有任务 OnReconnected() - 但是当您在代码中重新连接程序时会调用它。
只是为了进一步扩展这一点。SignalR 在连接终止后会在调用 OnDisconnected 之前等待一段时间。默认为 10 秒,但您可以在 Global.asax 文件中覆盖此设置(示例如下)。可悲的是,这个值至少需要 6 秒,但我明白了它背后的原因。
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 地址),如果我找到那个客户端,继续删除那个旧连接来自我的自定义会话集合。