2013-02-18 246 views
7

我使用SignalR在我app.I具有取决于一个很大的程度上OnDisconnected()正确调用的应用程序。而且它在下列情况下正确调用:SignalR断开连接不会被调用互联网上断开/重新连接

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

然而,如果网络连接突然下降,它不会被调用。例如,如果我拔掉客户端计算机上的网线,或者禁用客户端的无线网络,或者拔掉路由器,即使等待几分钟,OnDisconnected()也不会被调用。

+0

我还没有与SignalR那么多的工作了,但是我敢肯定它不是其functionallities之一检查,如果用户仍然连接到集线器。您可能想要实现自己的计时器,该计时器将在(x)分钟后将用户注销。 – Timsen 2013-02-18 13:43:01

+0

就菲尔德在这个环节,它可能是有益的给你:http://www.dotnetcurry.com/ShowArticle.aspx?ID=826 – Timsen 2013-02-18 14:12:51

回答

6

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

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

+0

dfowler..i将使用信号r 1.0 OK,谢谢,我现在用的信号r 0.5.3 – user1527989 2013-02-19 05:01:25

+1

大卫,当我们在ASP.NET 4.5 + IIS 8.0下托管SignalR时,是否符合'HttpContext.Response.ClientDisconnectedToken'? – tugberk 2013-02-19 15:05:47

+2

我们不使用它,因为它有一个错误。但是当它被修复时,我们会使用它。 – davidfowl 2013-02-19 17:44:07

2

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

您将无法看到OnDisconnected事件猛然挥出当连接被丢弃,因为SignalR不追查(它用于连接后台任务的池以查看连接在特定时间间隔内是否死亡)。当你关闭浏览器时,我猜SignalR向服务器发送了一个请求来表示断开事件的信号。这就是为什么你突然看到事件被解雇的原因。

但是,对于HttpContext.Response,ASP.NET 4.5有一个CancellationToken属性,名为ClientDisconnectedToken,当TCP连接被丢弃时,该属性将发出信号。据我所知,这仅适用于IIS 8.0,我不确定SignalR是否可以在.NET 4.5 ASP.NET主机下使用它。