我正在MVC 4
开发一个像facebook这样的聊天应用程序。
我正在连接到集线器,如下面的
var chat = $.connection.chatHub;
$.connection.transports.longPolling.supportsKeepAlive = function () {
return false;
}
$.connection.hub.qs = "UserID=" + $('#hdfLoggedInUserID').val();
$.connection.hub.start().done(function () {
//...
});
$.connection.hub.disconnected(function () {
setTimeout(function () {
$.connection.hub.start();
}, 5000); // Restart connection after 5 seconds.
});
我的hub
课程就像是
public override Task OnConnected()
{
var userID = Context.QueryString["UserID"];
if (userID != null)
{
//set user online in database and save connection_id
RefreshOnlineUsers(uId);
}
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
var userID = Context.QueryString["UserID"];
if (userID != null)
{
//set user offline in database
RefreshOnlineUsers(uId);
}
return base.OnDisconnected(stopCalled);
}
当我只使用一个浏览器标签时,它工作正常。
当浏览器选项卡打开时, OnConnected
调用,当浏览器选项卡关闭时调用OnDisconnected
。
因此,当我打开一个标签时,OnConnected
调用和用户的状态(在线)和connection_id
在数据库中更新。
之后,我在同一浏览器的新标签页中打开我的应用程序,然后再次OnConnected
方法调用,并在数据库中更新用户的新connection_id
和状态(在线)更新。
之后,当我关闭新的浏览器选项卡时,OnDiconnected
调用并且用户的状态在数据库中更改为脱机。但是用户在之前的浏览器标签中仍然在线。
由于此问题,此用户根据数据库离线,但已在线。
我已经完成了很多关于它的研究,但是找不到合适的解决方案。
问:如何解决此多个浏览器标签问题?
感谢。
答案 0 :(得分:2)
谢谢thab。
你说:
您只跟踪用户,而您还需要跟踪connectionId。当用户没有活动的connectionIds时,它们就会脱机等
这是一个好主意,我实现了这一点。这非常有效。
我正在跟踪connectionId
。当用户没有活动的connectionIds时,他们将离线,否则他们将在线。