我在我的应用程序中使用SignalR。我有一个应用程序,它在很大程度上取决于OnDisconnected()
被正确调用。在以下情况下正确调用它:
public Task OnDisconnected()
{
try
{
DeleteUser(Context.ConnectionId);
return null;
}
catch (Exception ex)
{
return null;
}
}
但是,如果网络连接突然中断,则不会调用它。例如,如果我拔掉客户端计算机上的网络电缆,或者禁用客户端的无线网络,或拔掉路由器,即使在几分钟的等待之后,OnDisconnected()
也永远不会被呼叫。
答案 0 :(得分:6)
它会提升断开连接但不会立即提升。可以配置一个阈值(默认为30秒),SignalR将在等待客户端断开连接之前等待(在底层tcp连接消失之后,这也不是立即执行)。如果连接在配置的超时之前丢失并重新连接,则它不会引发OnDisconnected。
如果你在等待一段时间之后从未在某些情况下看到它被提升,那么它可能是一个错误。 SignalR 1.0今天发布,所以我鼓励你尝试一下,看看你是否还能看到问题。
答案 1 :(得分:2)
这可能不是正确的答案,但这就是我所知道的:
当连接被删除时,您将无法看到OnDisconnected
事件突然被触发,因为SignalR没有跟踪它(它用于连接后台任务以查看连接是否已死亡)一定的间隔)。当您关闭浏览器时,我猜测SignalR向服务器发送请求以发出断开连接事件的信号。这就是你突然看到事件被解雇的原因。
但是,ASP.NET 4.5有一个名为CancellationToken
的{{1}}属性用于ClientDisconnectedToken
,当TCP连接被删除时会发出信号。据我所知,这仅适用于IIS 8.0,我不确定SignalR是否适用于.NET 4.5 ASP.NET主机。