4

我正在创建一个嵌入到我的 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 ,则第二个用户将覆盖第一个用户的实例。

4

1 回答 1

3

确实没有真正的解决方法。客户端在离开页面时总是会断开连接,并在加载下一页时再次连接到 SignalR。

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

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

因此,我建议,而不是OnConnectedand OnDisconnected,把它放在你的AccountController, 在LogInandLogOut方法中。例如:

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()
}
于 2014-02-17T19:50:13.027 回答