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:
Why if I close server, on web-client the "Reconnect" event occurs?
The "Disconnect" event occurs after 40+ seconds only. How to reduce this time?
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 ?
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.
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.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With