有没有办法获得Signalr集线器组中的连接数?

时间:2012-04-02 15:49:56

标签: signalr

这是我的问题,我想跟踪用户是在线还是离线,并通知其他客户。我正在使用集线器并实现了IConnected和IDisconnect接口。

我的想法是在集线器检测到连接或断开连接时向所有客户端发送通知。默认情况下,当用户刷新页面时,他将获得新的连接ID,并且最终先前的连接将调用disconnect以通知其他客户端用户即使他实际上在线也处于脱机状态。

我尝试使用自己的ConnectionIdFactory返回用户名作为连接ID,但是在某些时候打开多个标签会检测到用户连接断开连接,之后客户端集线器将尝试无限循环地连接到集线器浪费内存和CPU使浏览器几乎无法使用。我需要快速修复它,所以我删除了我的工厂,现在我使用用户名添加每个新连接到组,所以我可以轻松地通知所有连接上的单个用户,但是我有检测用户是在线还是离线的问题,因为我不知道用户有多少活动连接。

所以我想知道有没有办法在一个组中获得连接数?或者,如果有人更好地了解如何跟踪用户何时离线?

我正在使用Signalr 0.4

2 个答案:

答案 0 :(得分:9)

除了依靠自己之外,别无他法。

答案 1 :(得分:4)

找到解决方法:

重写ConnectionId,因此在每个标签中都有相同的ConnectionId

 public class MyConnectionFactory : IConnectionIdGenerator
    {
        public string GenerateConnectionId(IRequest request)
        {
            return MyUserManager.Instance.CurrentUserID.ToString();
        }
    }

添加到global.asax:

GlobalHost.DependencyResolver.Register(typeof(IConnectionIdGenerator), () => new MyConnectionFactory());

我尽可能多地打开标签,所有标签都会收到通知。