管理信号器中的多个浏览器选项卡

时间:2017-01-02 09:22:05

标签: c# jquery asp.net-mvc sockets signalr

我正在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调用并且用户的状态在数据库中更改为脱机。但是用户在之前的浏览器标签中仍然在线。

由于此问题,此用户根据数据库离线,但已在线。

我已经完成了很多关于它的研究,但是找不到合适的解决方案。

问:如何解决此多个浏览器标签问题?

感谢。

1 个答案:

答案 0 :(得分:2)

谢谢thab

你说:

  

您只跟踪用户,而您还需要跟踪connectionId。当用户没有活动的connectionIds时,它们就会脱机等

这是一个好主意,我实现了这一点。这非常有效。 我正在跟踪connectionId。当用户没有活动的connectionIds时,他们将离线,否则他们将在线。