繁体   English   中英

是否有仅注册特定主题的内置方法?

[英]Is there a built-in way to register only for specific topics?

我想使用signalR将事件从服务器广播到客户端代理。 该服务器使用多租户架构,我想通过signalR组将signalR-Hub中的每个租户分开。

此外,我想通过signalR广播我的“框架事件”。 客户应为自己需要的事件进行注册。 这个问题可以用“ signalR-Topics”解决吗,或者客户只能注册他想要的事件,例如:

myHub.On<string>("addMessage", param => {
                Console.WriteLine(param);
            });

该示例具有局限性,所有事件/方法都必须在服务器上定义,并且如果框架获取新事件,我也不得不添加新的signalR方法/事件。

另一个问题是:如果客户端要取消订阅“ addMessage”? 是否可以在运行时删除注册“ myHub.On(“ addMessage” ...“?

另一个想法:如果我只发布“一个”通用事件方法,并带有附加的字符串参数“ topic”。 客户端可以在启动时注册特定的“主题”,并且可以在服务器端确定哪个客户端获取了事件。 我会将客户端/主题映射存储在字典中。

var topciMapping = Dictionary<string, List<string>>;
//the key is the topic name, and the list contains the signalR connectionIds

下一个问题是:我可以将事件发送到连接ID的自定义列表吗?

这应该可以解决问题,对吗?

var connectionIds = new List<string>();
Clients.Clients(connectionIds)

如果您具有要将消息发送到的所有connectionIDs的列表,则基本上可以执行以下操作:

    foreach(var connectionId in ConnectionList) 
       Clients.Client(connectionId).sendMessage(message);

希望这可以帮助。

祝你好运!

“其他想法”绝对有道理。 请注意,已经可以通过名称对组进行寻址,这非常适合您的主题。 这样,您已经对用户进行了分组,然后可以轻松解决:

Clients.Group(groupName).addChatMessage(name, message);
Clients.OthersInGroup(groupName).addChatMessage(name, message);

参考: 在SignalR中使用组

编辑

通用方法是接下来的方法。 另外,根据您在评论中所说的,您已经在使用groups的主题, Dictionary才有意义。 通过Clients.Clients(connectionIds)寻址也应该起作用。

因此,总的来说,如果您要问这是否是一种不错的方法,那么我会说是的。 我找不到有关“ SignalR-Topics”的任何东西,想知道我是否错过了什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM