检测SignalR Hub客户端立即断开连接

时间:2013-08-06 08:52:57

标签: .net signalr-hub signalr.client

何时在服务器端引发SignalR Hub OnDisconnected,对于崩溃或关闭但未调用 停止 方法的.net客户端?

我正在测试SignalR .NET客户端,而不是javascript客户端。 如果我在客户端上调用 停止 方法,则Hub会立即引发 OnDisconnected 方法。

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

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

2 个答案:

答案 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”消息)。