5

好的,所以我有这个代码

var c = GlobalHost.ConnectionManager.GetHubContext<SomeHubClass>().Clients;

现在,客户端返回一个具有 IHubConnectionContext 的 IHubConext,该 IHubConnectionContext 具有 IGroupManager 组。现在无论如何可以从中获取所有组名吗?这甚至可以通过 signalR 接口实现,还是我必须自己跟踪每个集线器的所有组?

4

2 回答 2

15

SignalR 没有公开的 API 来管理整个组、迭代组,甚至获取组的摘要列表。您只能添加或删除组。如果您想保留组名列表,也许可以为您的 SomeHubClass 使用单例模式。在您可以轻松访问的单例中保留 aList<string>组名称,或者甚至Dictionary<string, HashSet<string>>映射连接 id 的名称和哈希集,尽管在这种情况下这可能是矫枉过正。

请参阅http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-server#callfromoutsidehub以实现集线器的单例。

于 2013-10-13T23:56:35.493 回答
1

您实际上可以像我一样使用反射获取所有组名(因为我们需要的所有字段都是私有的),这也是我挖掘它的方法:IGroupManager -> _lifetimeManager -> _groups -> _groups

IGroupManager groupManager = signalRHubContext.Groups;

object lifetimeManager = groupManager.GetType().GetRuntimeFields()
    .Single(fi => fi.Name == "_lifetimeManager")
    .GetValue(groupManager);

object groupsObject = lifetimeManager.GetType().GetRuntimeFields()
    .Single(fi => fi.Name == "_groups")
    .GetValue(lifetimeManager);

IDictionary groupsDictionary = groupsObject.GetType().GetRuntimeFields()
    .Single(fi => fi.Name == "_groups")
    .GetValue(groupsObject) as IDictionary;

List<string> groupNames = groupsDictionary.Keys.Cast<string>().ToList();
于 2022-02-08T15:54:49.583 回答