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,则第二个用户将覆盖第一个用户的实例。
答
确实没有真正的解决方法。客户端在离开页面时将始终断开连接,并在下一页加载时再次连接到SignalR。
解决此问题的唯一方法是创建一个SPA,因此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()
}
你不能避免它。导航到新页面是一个新的连接。用户可以有多个连接。 – davidfowl 2013-03-08 15:16:00
解决方法是广泛使用ajax。使用相同的布局页面,并使用ajax来更新页面内容。新的私人聊天窗口,iframe或其他应附加到身体,所以他们不会消失。 – user1778606 2013-06-04 03:44:24