何时在服务器端引发SignalR Hub OnDisconnected,对于崩溃或关闭但未调用 停止 方法的.net客户端?
我正在测试SignalR .NET客户端,而不是javascript客户端。 如果我在客户端上调用 停止 方法,则Hub会立即引发 OnDisconnected 方法。
但是,如果我关闭客户端或终止进程,Hub将在大约10秒后才会引发 OnDisconnected 方法。
如何立即检测到客户端已断开连接?
答案 0 :(得分:5)
阅读SignalR events here的文档后,我发现了这一部分:
当连接处于非活动状态时,服务器会定期发送一个 keepalive数据包到客户端。截至本文发表之日 写,默认频率是每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();
}
因此,您可以考虑减少该值,以便更快地通知客户端连接何时停止。
答案 1 :(得分:3)
如何立即检测到客户端已断开连接?
由于TCP的工作方式,您不能尝试将数据发送到该客户端。正如@JasonEvans的回答所解释的那样,SignalR默认每十秒发送一次数据(“keepalive”消息)。