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

问题描述:

我正在创建一个嵌入到我的asp.net mvc 4项目中的聊天。我有一个在线用户ul列表,在OnConnected上添加一个用户,并在OnDisconnected上删除它。SignalR客户端断开/连接每页刷新。 ASP.NET MVC

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

我在客户端使用这个在线用户列表来处理一些难题,因为signalr在每个页面刷新时调用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); 
}; 

但我sufering处理多用户情况下...因为如果在超时运行之前有多个用户执行onDisconnected,则第二个用户将覆盖第一个用户的实例。

+3

你不能避免它。导航到新页面是一个新的连接。用户可以有多个连接。 – davidfowl 2013-03-08 15:16:00

+0

解决方法是广泛使用ajax。使用相同的布局页面,并使用ajax来更新页面内容。新的私人聊天窗口,iframe或其他应附加到身体,所以他们不会消失。 – user1778606 2013-06-04 03:44:24

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

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

使用SignalR集线器的思想是以最少的编程或并发症实现实时动作 - 最好的方式是从当前登录的用户列表中选择最合适的方式,而不是激活的连接,因为它可能具有同一个用户多次。

因此,我建议,而不是OnConnectedOnDisconnected,把它放在你的AccountController,在LogInLogOut方法。例如:

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() 
}