2017-01-02 35 views
2

我正在开发一个类似于facebook的聊天应用程序MVC 4管理信号器中的多个浏览器选项卡

我连接到集线器像下面

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电话和用户的状态更改数据库脱机。但用户仍然在以前的浏览器选项卡上在线。

由于此问题,此用户根据数据库脱机,但它在线。

我已经做了很多关于它[R & d,但找不到任何妥善的解决办法。

问:我怎样才能解决这个多个浏览器标签的问题?

谢谢。

+2

您只跟踪用户,而您需要跟踪connectionId。当用户没有活动connectionIds然后他们是离线等 – thab

+0

谢谢@thab这将解决我的问题。 – Manoj

回答

2

谢谢thab

你说:

你只跟踪用户,而你需要跟踪的ConnectionId也。当用户没有活动connectionIds然后他们是离线等

这是一个好主意,我实现了这一点。这很好。我正在跟踪connectionId。当用户没有活动的连接ID时,他们将脱机,其他人将会在线。

+0

仅供参考我已经使用HubPipeline完成了这项工作 - 允许在任何新网站中重复使用等。我没有手头上的示例代码... – thab

+0

我有同样的问题。你有解析代码来帮助我吗?谢谢 –

+1

@LeonanMilani你可以参考https://github.com/stackmanoj/chatapp/blob/master/ChatApp/Common/ChatHub.cs – Manoj

相关问题