在网络断开/重新连接时,SignalR未调用断开连接。

7

我正在我的应用程序中使用 SignalR。我的应用程序在很大程度上依赖于正确调用OnDisconnected()方法。以下情况下会正确调用:

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

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


我并没有太多使用SignalR的经验,但我相当确定它的功能之一不是检查用户是否仍连接到中心。您可能需要实现自己的计时器,在(x)分钟后将用户注销。 - Timsen
刚刚看到这个链接,可能对你有帮助:http://www.dotnetcurry.com/ShowArticle.aspx?ID=826 - Timsen
2个回答

6

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

如果您在等待一段时间后仍然没有看到它被引发,则可能是一个错误。SignalR 1.0今天发布,因此我鼓励您尝试一下,并查看是否仍然存在问题。


好的,谢谢 dfowler。我将使用 SignalR 1.0,目前我正在使用 SignalR 0.5.3。 - user1527989
1
David,当我们在 ASP.NET 4.5 + IIS 8.0 下托管 SignalR 时,HttpContext.Response.ClientDisconnectedToken 是否会被尊重? - tugberk
2
我们不使用它,因为其中有一个错误。但是当它被修复后,我们会使用它。 - davidfowl

2

我知道的不一定是正确答案,但以下是我的理解:

当连接断开时,你无法突然看到OnDisconnected事件被触发,因为SignalR不会追踪它(它通过后台任务轮询连接,以查看在一定时间间隔内连接是否已死亡)。当你关闭浏览器时,我猜想SignalR会向服务器发送一个请求来标识断开事件。这就是为什么你会突然看到事件被触发。

然而,ASP.NET 4.5有一个叫做CancellationToken的属性,名为ClientDisconnectedToken,用于HttpContext.Response,当TCP连接断开时会被标记。据我所知,这仅适用于IIS 8.0,并且我不确定SignalR是否在.NET 4.5 ASP.NET主机下使用此功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接