SignalR - Server side method to detect if a client disconnects from a hub?

I'm wanting to stop a System.Timers.Timer that is running in a SignalR hub after a client closes a window/tab containing the active connection.

I have tried sending a bool value to the server by calling server code to notify the server the client is still connected or not, but it's not currently working.

window.onbeforeunload = function () {
    profile.server.setIsConnected(false);
};

Server Side:

public ProfileHub()
{  
    timer = new Timer(15000);
    timer.Elapsed += (sender, e) => { timer_Elapsed(sender, e, _isActive); };
    timer.AutoReset = false;
}

[Authorize]
private void timer_Elapsed(object sender, ElapsedEventArgs e, bool active)
{            
    timer.Stop();

    if (active)
    {
        System.Diagnostics.Debug.WriteLine("Timer Started");
        timer.Start();
    }
    else
    {
        System.Diagnostics.Debug.WriteLine("Timer Stopped");
        return;
    }
    // process code
}

[Authorize]
public void SetIsActive(bool isActive)
{
    _isActive = isActive;
}

Is this possible and am I on the right track? I suspect it has something to do with the anonymous delegate for timer.Elapsed, but I'm not entirely sure.

Answers


SignalR has OnConnected, OnDisconnected, and OnReconnected that are called every time the client does one of those actions. You can simply override them:

public override Task OnConnected()
{
    return base.OnConnected();
}

public override Task OnDisconnected()
{
    //custom logic here
    return base.OnDisconnected();
}

public override Task OnReconnected()
{
    return base.OnReconnected();
}

I've found them to be extremely useful also for debugging purposes. If you're wanting to set a timer for each person, you should use some sort of connectionMapping along with the above functions to keep track of your users.


You should use the method OnDisconnected instead of the timer. Here's the official documentation, but the framework gives you events when a connected client disconnects or reconnects.


Need Your Help

How implement security with the mvcSiteMapProvider?

asp.net-mvc asp.net-mvc-3 mvcsitemap mvcsitemapprovider asp.net-mvc-sitemap

I need to implement Role security with my mvcSiteMapProvider V4 software. I am using it with MVC3.