26
votes

I am developing a real-time client-server application using SignalR, ASP.NET and C#. I am using localhost as host and VS2013.

My questions are:

  1. Why if I close server, on web-client the "Reconnect" event occurs?

  2. The "Disconnect" event occurs after 40+ seconds only. How to reduce this time?

  3. I need the client to connect to server on start. The "Reconnect" event should occurs within fixed interval only. If "Reconnect" interval time is over the client should connect as a new client. How to archive this goal?

Finally, I would like to ask - how to keep alive connection using SignalR in the right way?

I am using this code:

C#

public override Task OnDisconnected()
{
clientList.RemoveAt(nIndex);
Console.WriteLine("Disconnected {0}\n", Context.ConnectionId);
return (base.OnDisconnected());
}

public override Task OnReconnected()
{
Console.WriteLine("Reconnected {0}\n", Context.ConnectionId);
return (base.OnReconnected());
}

Javascript

$.connection.hub.reconnected(function () {
// Html encode display name and message.
var encodedName = $('<div />').text("heartbeat").html();
var now = new Date();

// Add the message to the page.
$('#discussion').append('Reconnected to server: ' + now + '</br>');
});

$.connection.hub.disconnected(function () {
// Html encode display name and message.
var encodedName = $('<div />').text("heartbeat").html();
var now = new Date();
// Add the message to the page.
$('#discussion').append('Disconnected from server: ' + now + '</br>');
});

After Connect output:

message received from server : Fri Feb 21 2014 10:53:02

After Close Server output:

Reconnected to server: Fri Feb 21 2014 10:53:22 <-- Why, if i close server ???
Disconnected from server: Fri Feb 21 2014 10:53:53 <-- Why 40+ seconds after the server is closed ?
2

2 Answers

32
votes

1. After I close server, on web-client the "Reconnect" event occurs and the "Disconnect" event occurs only after. Why?

SignalR cannot tell the difference between closing the server and restarting the server. For this reason, when the server shuts down the client will start to try to reconnect in case the server is actually restarting.

2. The "Disconnect" occurs 30+ seconds after of unknown "Reconnect". How to reduce this time?

This 30 second timeout can be modified via the DisconnectTimeout property.

3. I need the client to connect to the server on start. The "Reconnect" should occurs within fixed interval only. If "Reconnect" interval time is over the client should connect as new client.

You should start the connection on the disconnected event, preferably after a timeout to reduce server load if it restarts.

$.connection.hub.disconnected(function() {
    setTimeout(function() {
        $.connection.hub.start();
    }, 5000); // Re-start connection after 5 seconds
});

The entire Understanding and Handling Connection Lifetime Events in SignalR article is probably relavent to your question.

3
votes

This method is for when you do not want to change the server configure ; javascript example code :

connection.serverTimeoutInMilliseconds = 1000 * 60 * 10; // for  10 minute