在互联网断开/重新连接时不会调用SignalR断开连接

时间:2013-02-18 13:22:06

标签: c# asp.net signalr signalr-hub signalr.client

我在我的应用程序中使用SignalR。我有一个应用程序,它在很大程度上取决于OnDisconnected()被正确调用。在以下情况下正确调用它:

 public Task OnDisconnected()
 {
     try
     {
        DeleteUser(Context.ConnectionId);
        return null;
     }
     catch (Exception ex)
     {
        return null;
     }
}
  1. 用户刷新页面
  2. 用户导航到新页面
  3. 用户关闭浏览器
  4. 但是,如果网络连接突然中断,则不会调用它。例如,如果我拔掉客户端计算机上的网络电缆,或者禁用客户端的无线网络,或拔掉路由器,即使在几分钟的等待之后,OnDisconnected()也永远不会被呼叫。

2 个答案:

答案 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主机。

相关问题