【发布时间】:2018-09-26 23:35:50
【问题描述】:
我正在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 调用并且用户的状态在数据库中更改为脱机。但用户在之前的浏览器选项卡中仍然在线。
由于这个问题,根据数据库,该用户处于离线状态,但它是在线的。
我已经为此做了很多研发,但找不到任何合适的解决方案。
问:如何解决这个多浏览器标签问题?
谢谢。
【问题讨论】:
-
您只是在跟踪用户,而您还需要跟踪 connectionId。当用户没有活动的 connectionIds 时,他们处于离线状态等
-
谢谢@thab 这将解决我的问题。
标签: c# jquery asp.net-mvc sockets signalr