C# 管理Signal中的多个浏览器选项卡

C# 管理Signal中的多个浏览器选项卡,c#,jquery,asp.net-mvc,sockets,signalr,C#,Jquery,Asp.net Mvc,Sockets,Signalr,我正在MVC4中开发一个类似facebook的聊天应用程序 我正在连接到hub,如下所示 var chat = $.connection.chatHub; $.connection.transports.longPolling.supportsKeepAlive = function () { return false; } $.connection.hub.qs = "UserID=" + $('#hdfLoggedInUserID').val(); $.connection.hub

我正在
MVC4
中开发一个类似facebook的聊天应用程序

我正在连接到hub,如下所示

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.
});
    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);
    }
我的
hub
类如下

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.
});
    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\u id
在数据库中更新时,我会根据这一点

之后,我在同一浏览器的“新建”选项卡中打开我的应用程序,然后再次调用
OnConnected
方法,并在数据库中更新用户的新
连接id
和状态(联机)

之后,当我关闭“新建浏览器”选项卡时,
OnDiconnected
调用,数据库中的用户状态更改为脱机。但用户仍在上一个浏览器选项卡中联机

由于此问题,根据数据库,此用户处于脱机状态,但它处于联机状态

我已经做了很多的研发工作,但是找不到合适的解决方案

Q:如何解决多浏览器选项卡问题?

谢谢。

谢谢

你说:


您只跟踪用户,而还需要跟踪connectionId。当用户没有活动连接ID时,他们就处于脱机状态等

这是一个伟大的想法,我实现了它。这很有效。
我正在跟踪
连接ID
。当用户没有活动连接ID时,他们将处于脱机状态,否则他们将处于联机状态。

您只跟踪用户,而您还需要跟踪连接ID。当用户没有活动连接ID时,他们将脱机etcThanks@thab,这将解决我的问题。仅供参考,我通常使用HubPipeline进行此操作,以允许在任何新站点中重用。不过,我手头上没有示例代码……我也有同样的问题。你有解析码帮我吗?感谢you@LeonanMilani你可以看到这个作为参考