我正在创建一个嵌入在我的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上的集线器,那么第二个用户将覆盖第一个用户的实例。
答案 0 :(得分:1)
确实没有办法解决这个问题。离开页面时客户端将始终断开连接,并在加载下一页时再次连接到SignalR。
解决这个问题的唯一方法是创建一个SPA,因此不需要通过导航来断开SignalR。
使用SignalR集线器的想法是允许以最少的编程或复杂性进行实时操作 - 最好的方法是SignalR从当前登录用户列表中拉出,而不是活动连接,因为它可能具有同一个用户多次。
因此,我建议代替OnConnected
和OnDisconnected
,将其放在AccountController
,LogIn
和LogOut
方法中。例如:
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()
}