C# 互联网断开/重新连接时未调用信号器断开
我在我的应用程序中使用SignalR。我有一个应用程序,它在很大程度上取决于C# 互联网断开/重新连接时未调用信号器断开,c#,asp.net,signalr,signalr-hub,signalr.client,C#,Asp.net,Signalr,Signalr Hub,Signalr.client,我在我的应用程序中使用SignalR。我有一个应用程序,它在很大程度上取决于OnDisconnected()是否被正确调用。在下列情况下正确调用: public Task OnDisconnected() { try { DeleteUser(Context.ConnectionId); return null; } catch (Exception ex) { return null;
OnDisconnected()
是否被正确调用。在下列情况下正确调用:
public Task OnDisconnected()
{
try
{
DeleteUser(Context.ConnectionId);
return null;
}
catch (Exception ex)
{
return null;
}
}
但是,如果网络连接突然中断,则不会调用它。例如,如果我拔下客户端计算机上的网络电缆,或禁用客户端的无线网络,或拔下路由器,
OnDisconnected()
将永远不会被调用,即使等待几分钟。这可能不是正确的答案,但我知道:
当连接断开时,您将无法看到突然触发的OnDisconnected
事件,因为信号器没有跟踪它(它与后台任务共享连接,以查看连接是否在某个时间间隔内已断开)。当您关闭浏览器时,我猜signer会向服务器发送一个请求,以通知断开连接事件。这就是为什么你突然看到事件被触发
但是,ASP.NET 4.5有一个
CancellationToken
属性,名为ClientDisconnectedToken
,用于HttpContext.Response
,在TCP连接断开时发出信号。据我所知,这仅适用于IIS 8.0,我不确定Signal是否适用于.NET 4.5 ASP.NET主机下的这一功能。它将引发断开连接,但不会立即引发。有一个可配置的阈值(默认情况下为30秒),信号器将在认为客户端已断开连接之前等待(在底层tcp连接消失后,这也不是立即的)。如果连接在配置的超时之前断开并重新连接,则不会引发OnDisconnected
如果您在等待一段时间后,在某些场景中从未看到它被提出,那么它可能是一个bug。SignalR 1.0于今天发布,因此我鼓励您也尝试一下,看看您是否仍然看到了问题。我没有与SignalR进行过太多的合作,但我非常确定,如果用户仍然连接到集线器,那么这不是需要检查的功能之一。您可能需要实现自己的计时器,该计时器将在(x)分钟后让用户注销。只需浏览此链接,它可能会对您有所帮助:好的,谢谢dfowler..我将使用信号R1.0,现在我使用信号R0.5.3David,当我们在ASP.NET 4.5+IIS 8.0下托管SignalR时,
HttpContext.Response.ClientDisconnectedToken
是否受到尊重?我们不使用它,因为它有一个bug。但当它修好后,我们会使用它。