SignalR客户端在每次刷新页面时断开/连接。 ASP.NET MVC

时间:2013-03-08 12:55:58

标签: asp.net-mvc asp.net-mvc-4 signalr

我正在创建一个嵌入在我的asp.net mvc 4项目中的聊天。我有一个在线用户ul列表,在OnConnected上添加用户并在OnDisconnected上删除它。

所以,我的应用程序不是SinglePage应用程序,这意味着它一直在页面上刷新。

我在客户端使用此在线用户列表来处理一些困难,因为信​​号器在每次刷新页面时调用OnDisconnected和OnConnected。

当另一个客户端在应用程序中正常导航时,它会一直被删除并在每次刷新页面时添加。

如何在客户端上避免此行为?


我正在尝试做这样的事情,在运行带有usersOnline列表的页面的客户端上...

var timeout;

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

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

但我更倾向于处理多用户场景......因为如果多个用户在超时运行之前执行了onDisconnected上的集线器,那么第二个用户将覆盖第一个用户的实例。

1 个答案:

答案 0 :(得分:1)

确实没有办法解决这个问题。离开页面时客户端将始终断开连接,并在加载下一页时再次连接到SignalR。

解决这个问题的唯一方法是创建一个SPA,因此不需要通过导航来断开SignalR。

使用SignalR集线器的想法是允许以最少的编程或复杂性进行实时操作 - 最好的方法是SignalR从当前登录用户列表中拉出,而不是活动连接,因为它可能具有同一个用户多次。

因此,我建议代替OnConnectedOnDisconnected,将其放在AccountControllerLogInLogOut方法中。例如:

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()
}
相关问题