6

对于在不调用Stop方法的情况下崩溃或关闭的 .net 客户端,何时在服务器端引发 SignalR Hub OnDisconnected ?

我正在使用 SignalR .NET 客户端进行测试,而不是 javascript 客户端。如果我在客户端调用Stop方法,Hub 将立即引发OnDisconnected方法。

但是如果我关闭客户端或终止进程,集线器将在大约 10 秒后引发OnDisconnected方法。

如何立即检测到客户端已断开连接?

4

2 回答 2

5

在阅读了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();
}

因此,您可以考虑减小该值,以便在客户端连接断开时更快地得到通知。

于 2013-08-06T09:24:43.770 回答
3

如何立即检测到客户端已断开连接?

由于 TCP 的工作方式,在您尝试向该客户端发送数据之前,您不能这样做。正如@JasonEvans 的回答所解释的,SignalR 默认每十秒发送一次数据(一条“keepalive”消息)。

于 2013-08-06T09:27:35.450 回答