iuristona
iuristona

Reputation: 927

SignalR client disconnect/connect on every refresh of pages. ASP.NET MVC

I am creating a chat embedded in my asp.net mvc 4 project. I have an online users ul list which add a user on OnConnected and remove it on OnDisconnected.

So, my app isn't a SinglePage app, which means that it refreshes on pages all the time.

I am encountering some difficulties to treat with this online users list on the client side, because signalr calls OnDisconnected and OnConnected on every page refresh.

While the other client is navigating normally in app, it keep being removed and added on every refresh of page.

How to avoid this behavior on client?


I am trying to do some like this, on client which are running the page with usersOnline list...

var timeout;

chat.client.login = function (chatUser) {
    addUser(chatUser);
    window.clearTimeout(timeout);
};

chat.client.logout = function (chatUser) {
    timeout = setTimeout(function () { removeUser(chatUser.Id); }, 3000);
};

But I am suffering to deal with multi-users scenario... Because if more than one user executes the hub onDisconnected before the timeout runs, the second will override the instance of the first.

Upvotes: 4

Views: 10357

Answers (1)

James Haug
James Haug

Reputation: 1497

There is indeed no real way around this. A client will always disconnect when leaving a page, and connects to SignalR again when the next page is loaded.

The only way around this is to create a SPA, so SignalR doesn't need to be disconnected by navigating away.

Using the idea of SignalR hubs is to allow real-time actions with minimal programming or complications - the best way would be for SignalR to be pulling from a list of currently logged in users, not active connections, as that could have the same user multiple times.

Therefore, I suggest, instead of OnConnected and OnDisconnected, put it in your AccountController, in the LogIn and LogOut methods. For example:

public ActionResult LogIn()
{
    //other stuff
    var hub = GlobalHost.ConnectionManager.GetHubContext</*Hub Title*/>();
    hub.client.chat.login()
}

public ActionResult LogOut()
{
    // other stuff
    var hub = GlobalHost.ConnectionManager.GetHubContext</*Hub Title*/>();
    hub.client.chat.logout()
}

Upvotes: 3

Related Questions