Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use SignalR events to keep connection alive in the right way?

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 ?
like image 505
Dmitry Kazakov Avatar asked Feb 21 '14 06:02

Dmitry Kazakov


People also ask

Does SignalR keep connection alive?

You can handle this event if you want your application to take some action when a transport connection is lost. The default keepalive timeout period is currently 20 seconds. If your client code tries to call a Hub method while SignalR is in reconnecting mode, SignalR will try to send the command.

How do I set SignalR connection timeout?

Timeout configuration for SignalR can be set in Application_Start method of Global class in Global. asax. cs file. // Wait a maximum of 30 minutes after a transport connection is lost // before raising the Disconnected event to terminate the SignalR connection.


2 Answers

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.

like image 130
halter73 Avatar answered Oct 17 '22 10:10

halter73


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 
like image 39
syeed masoud tayefi Avatar answered Oct 17 '22 10:10

syeed masoud tayefi