对于在不调用Stop方法的情况下崩溃或关闭的 .net 客户端,何时在服务器端引发 SignalR Hub OnDisconnected ?
我正在使用 SignalR .NET 客户端进行测试,而不是 javascript 客户端。如果我在客户端调用Stop方法,Hub 将立即引发OnDisconnected方法。
但是如果我关闭客户端或终止进程,集线器将在大约 10 秒后引发OnDisconnected方法。
如何立即检测到客户端已断开连接?
对于在不调用Stop方法的情况下崩溃或关闭的 .net 客户端,何时在服务器端引发 SignalR Hub OnDisconnected ?
我正在使用 SignalR .NET 客户端进行测试,而不是 javascript 客户端。如果我在客户端调用Stop方法,Hub 将立即引发OnDisconnected方法。
但是如果我关闭客户端或终止进程,集线器将在大约 10 秒后引发OnDisconnected方法。
如何立即检测到客户端已断开连接?
在阅读了SignalR events here的文档后,我发现了这一部分:
当连接处于非活动状态时,服务器会定期向客户端发送保活数据包。截至本文撰写之日,默认频率为每 10 秒
有一节描述了如何更改保活设置,例如
protected void Application_Start(object sender, EventArgs e)
{
// Make long polling connections wait a maximum of 110 seconds for a
// response. When that time expires, trigger a timeout command and
// make the client reconnect.
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110);
// Wait a maximum of 30 seconds after a transport connection is lost
// before raising the Disconnected event to terminate the SignalR connection.
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30);
// For transports other than long polling, send a keepalive packet every
// 10 seconds.
// This value must be no more than 1/3 of the DisconnectTimeout value.
GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10);
RouteTable.Routes.MapHubs();
}
因此,您可以考虑减小该值,以便在客户端连接断开时更快地得到通知。
如何立即检测到客户端已断开连接?
由于 TCP 的工作方式,在您尝试向该客户端发送数据之前,您不能这样做。正如@JasonEvans 的回答所解释的,SignalR 默认每十秒发送一次数据(一条“keepalive”消息)。