我需要从服务器后端调用组中的所有SignalR客户端。
我需要相当于Clients.OthersInGroup('MyGroupName').MyFunction
但需要通过IHubContext
对象(或者来自Hub实例外部)。这有可能吗?
我的使用案例:我是托管SharePoint App的提供商。 SignalR用于实时更新其他客户端的更改(使用SignalR JavaScript客户端)。由于应用程序支持连接到服务器的多租户客户端可以来自不同的SharePoints租户。通信应始终仅在同一租户的客户端之间。因此,如果客户端连接,则将其添加到其SharePoint租户的SignalR组。 现在有一些操作,比如显示一个文件,如果它不存在则创建它,发生在服务器上。在这种情况下,客户端调用后端的URL,然后返回文档。如果是新创建的,则应将其传达给受影响租户的客户。
答案 0 :(得分:1)
注意:编辑此答案是为了反映有问题的其他信息。
可以通过多种方式解决此问题:
方法1:
向所有属于租户的客户转发通知(我假设您使用租户标识符作为组名)。在通知消息中包括文档作者的标识。然后在处理客户端通知的代码中决定,如果用户是文档的作者。如果他(她)是,请不要显示通知。
这样,您就不必在应用程序的服务器端进行任何特殊过滤,只能使用标准API。
方法2:
您必须在SignaR连接和用户之间创建某种映射。如果您的应用程序在单个服务器上运行,则可以将此信息存储在某个静态映射中。如果您的提供商托管应用程序在服务器场中运行,则必须使用类似Redis的内容。用户和连接之间的映射可以在OnConnected
(添加映射的连接ID)和OnDisconnected
(从映射中删除连接ID)方法中完成。
然后,当您要发送通知时,使用Group
IHubContext.Clients
方法,从地图获取属于文档作者的连接列表,并将它们作为应忽略的连接传递。
这样的事情:
string[] connectionIdsBelongingToAuthor = // get from mapping, these will be ignored
string groupName = // get group which should be notified
hubContext.Clients.Group(groupName, connectionIdsBelongingToAuthor).NotificationMethod(...)
我选择方法1并决定是否应在客户端显示通知。