【问题标题】:SignalR disconnect not being called on internet disconnection/re-connection互联网断开/重新连接时未调用 SignalR 断开连接
【发布时间】:2013-02-18 13:22:06
【问题描述】:

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

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

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

【问题讨论】:

  • 我与 SignalR 合作的次数不多,但我很确定它不是要检查的功能之一,如果用户仍然连接到集线器。您可能希望实现自己的计时器,该计时器将在 (x) 分钟后注销用户。
  • 请浏览此链接,它可能对您有所帮助:dotnetcurry.com/ShowArticle.aspx?ID=826

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


【解决方案1】:

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

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

【讨论】:

  • 好的,谢谢 dfowler..我将使用信号 r 1.0,现在我使用信号 r 0.5.3
  • David,当我们在 ASP.NET 4.5 + IIS 8.0 下托管 SignalR 时,HttpContext.Response.ClientDisconnectedToken 荣幸吗?
  • 我们不使用它,因为它有一个错误。但是当它修复后,我们会使用它。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多