【问题标题】:Is there a way to get number of connections in Signalr hub group?有没有办法获得 Signalr 集线器组中的连接数?
【发布时间】:2012-04-16 07:06:20
【问题描述】:

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

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

我尝试使用我自己的 ConnectionIdFactory 返回连接 ID 的用户名,但在某些时候打开了多个选项卡,它会检测到用户连接 ID 已断开连接,之后客户端集线器将尝试连接到集线器但无休止地循环浪费内存和 cpu使浏览器几乎无法使用。我需要快速修复它,所以我删除了我的工厂,现在我使用用户名将每个新连接添加到组中,这样我就可以轻松地通知所有连接的单个用户,但是当我检测用户是在线还是离线时,我遇到了问题不知道有多少活跃的连接用户。

所以我想知道有没有办法获得一个组中的连接数?或者是否有人对如何跟踪用户何时下线有更好的了解?

我正在使用 Signalr 0.4

【问题讨论】:

  • 您可以使用 Dictionary>,其中键是用户名,哈希集包含该用户的 connectionId。用户数 = Keys.Count(),连接数 = dict.Values.Sum(x=>x.Count());
  • 网站应该在网络农场场景下工作,所以我不能使用字典。我可以将连接存储在数据库中,但如果可能的话,我想避免这种情况。
  • 当您说用户刷新页面并获得新的连接 ID 时,我将连接 ID 存储在我的数据库中,如果用户在我的网站上查看我的集线器相同的两个页面,则连接 ID 与好吧。为什么要获得单独的连接 ID。我认为只有当客户不同时,您才能获得不同的 ID。
  • 要说如何在线离线跟踪我只是将用户名和连接ID存储在数据库中。在另一个应用程序中,我创建了一个组作为角色,这样用户就可以在他们的角色内交谈,或者通过了解他们的角色与超级管理员或 IT 人员交谈。我正在使用 ASP.net 成员资格和 Active Directory。两者都适用。

标签: signalr


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    找到解决方法:

    重写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());
    

    我设法打开了尽可能多的标签,并且所有标签都会收到通知。

    【讨论】:

    • 你可以给出完整的代码来理解,比如如何实现对 signalr 不熟悉的 ConnectionFactory。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 2021-01-22
    • 2015-07-09
    • 2022-01-25
    • 2017-04-27
    相关资源
    最近更新 更多