7

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

 public Task OnDisconnected()
 {
     try
     {
        DeleteUser(Context.ConnectionId);
        return null;
     }
     catch (Exception ex)
     {
        return null;
     }
}
  1. 用户刷新页面
  2. 用户导航到新页面
  3. 用户关闭浏览器

但是,如果网络连接突然断开,则不会调用它。例如,如果我拔掉客户端机器上的网线,或者禁用客户端的无线网络,或者拔掉路由器OnDisconnected(),即使等待几分钟,也永远不会被呼叫。

4

2 回答 2

6

它会断开连接,但不会立即断开。有一个可配置的阈值(默认为 30 秒),SignalR 在认为客户端断开连接之前将等待(在底层 tcp 连接消失之后,这也不是立即的)。如果连接在配置的超时之前断开并重新连接,则不会引发 OnDisconnected。

如果您在等待一段时间后从未在某些情况下看到它被提出,那么它可能是一个错误。SignalR 1.0 今天发布了,所以我鼓励您也尝试一下,看看您是否仍然发现问题。

于 2013-02-18T22:02:11.957 回答
2

这可能不是正确的答案,但这是我所知道的:

当连接断开时,您将无法看到OnDisconnected事件突然触发,因为 SignalR 没有跟踪它(它与后台任务连接池以查看连接是否在特定时间间隔内死亡)。当您关闭浏览器时,我猜 SignalR 会向服务器发送请求以发出断开连接事件的信号。这就是为什么你突然看到事件被触发了。

但是,ASP.NET 4.5 有一个CancellationToken调用的属性ClientDisconnectedTokenHttpContext.Response当 TCP 连接断开时会发出信号。据我所知,这只适用于 IIS 8.0,我不确定 SignalR 是否适用于 .NET 4.5 ASP.NET 主机。

于 2013-02-18T13:53:03.430 回答