SignalR断开连接不会被调用互联网上断开/重新连接
我使用SignalR在我app.I具有取决于一个很大的程度上OnDisconnected()
正确调用的应用程序。而且它在下列情况下正确调用:SignalR断开连接不会被调用互联网上断开/重新连接
public Task OnDisconnected()
{
try
{
DeleteUser(Context.ConnectionId);
return null;
}
catch (Exception ex)
{
return null;
}
}
- 用户刷新页面
- 用户导航到一个新的页面
- 用户关闭浏览器
然而,如果网络连接突然下降,它不会被调用。例如,如果我拔掉客户端计算机上的网线,或者禁用客户端的无线网络,或者拔掉路由器,即使等待几分钟,OnDisconnected()
也不会被调用。
它会引发断开,但不会立即。有一个可配置的阈值(默认为30秒),SignalR将在它认为客户端断开连接之前等待(在底层tcp连接消失之后并且不会立即)。如果连接在配置的超时之前断开并重新连接,则不会引发OnDisconnected。
如果你从来没有看到它被提出在某些情况下等待一段时间,那么它可能是一个错误之后。 SignalR 1.0今天发布,所以我鼓励你也尝试一下,看看你是否仍然看到问题。
dfowler..i将使用信号r 1.0 OK,谢谢,我现在用的信号r 0.5.3 – user1527989 2013-02-19 05:01:25
大卫,当我们在ASP.NET 4.5 + IIS 8.0下托管SignalR时,是否符合'HttpContext.Response.ClientDisconnectedToken'? – tugberk 2013-02-19 15:05:47
我们不使用它,因为它有一个错误。但是当它被修复时,我们会使用它。 – davidfowl 2013-02-19 17:44:07
这可能不是正确的答案,但是这是我知道的:
您将无法看到OnDisconnected
事件猛然挥出当连接被丢弃,因为SignalR不追查(它用于连接后台任务的池以查看连接在特定时间间隔内是否死亡)。当你关闭浏览器时,我猜SignalR向服务器发送了一个请求来表示断开事件的信号。这就是为什么你突然看到事件被解雇的原因。
但是,对于HttpContext.Response
,ASP.NET 4.5有一个CancellationToken
属性,名为ClientDisconnectedToken
,当TCP连接被丢弃时,该属性将发出信号。据我所知,这仅适用于IIS 8.0,我不确定SignalR是否可以在.NET 4.5 ASP.NET主机下使用它。
我还没有与SignalR那么多的工作了,但是我敢肯定它不是其functionallities之一检查,如果用户仍然连接到集线器。您可能想要实现自己的计时器,该计时器将在(x)分钟后将用户注销。 – Timsen 2013-02-18 13:43:01
就菲尔德在这个环节,它可能是有益的给你:http://www.dotnetcurry.com/ShowArticle.aspx?ID=826 – Timsen 2013-02-18 14:12:51