6

When is the SignalR Hub OnDisconnected raised on server side, for the the .net client that crash or close without calling the Stop method?

I am testing with the SignalR .NET client, not the javascript client. If I call the Stop method on the client, the Hub will raise OnDisconnected method immediately.

But if I close the client or kill the process, the Hub will raise OnDisconnected method only after about 10 seconds.

How can I detect instantly that the client is disconnected?

John Hpa
  • 463
  • 6
  • 18

2 Answers2

5

Having read the documentation for SignalR events here, I spotted this section:

When a connection is inactive, periodically the server sends a keepalive packet to the client. As of the date this article is being written, the default frequency is every 10 seconds

There is a section that describes how to change the keepalive setting e.g.

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();
}

Thus you could look into reducing that value, in order to be notified quicker of when a client connection ha gone down.

Jason Evans
  • 28,906
  • 14
  • 90
  • 154
  • Hi Jason, thanks for the info. But from my testing, the KeepAlive only affects the Hub Client proxy time to raise the StateChanged event. I already try to set the ConnectionTimeout to 6 seconds and KeepAlive to 2 seconds on the server side, but it has no effect on the Hub OnDisconnected method. – John Hpa Aug 06 '13 at 09:27
3

How can I detect instantly that the client is disconnected?

You can't, due to the way TCP works, until you try to send data to that client. As @JasonEvans' answer explains, SignalR by default sends data (a "keepalive" message) every ten seconds.

CodeCaster
  • 147,647
  • 23
  • 218
  • 272