John Hpa
John Hpa

Reputation: 463

Detect SignalR Hub Client Disconnect instantly

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?

Upvotes: 6

Views: 9437

Answers (2)

CodeCaster
CodeCaster

Reputation: 151588

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.

Upvotes: 3

Jason Evans
Jason Evans

Reputation: 29186

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.

Upvotes: 5

Related Questions