是否有一种内置的方式只为特定主题注册

本文关键字:注册 方式 内置 一种 是否 | 更新日期: 2023-09-27 18:26:35

我想使用signalR将事件从服务器广播到客户端代理。服务器使用多租户体系结构,我想通过signalR组来分隔signalR集线器中的每个租户。

此外,我想通过signalR广播我的"框架事件"。客户应该为他需要的活动注册。"signalR主题"可以涵盖这个问题吗?或者客户必须只注册他想要的事件,比如:

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

这个示例有一个限制,即所有事件/方法都必须在服务器上定义,如果框架得到一个新的事件,我还需要添加一个新信号R方法/事件。

另一个问题是:如果客户端想从"addMessage"中取消脚本?是否可以在运行时删除注册"myHub.On("addMessage"…"?

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

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

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

这应该会奏效,对吧?

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主题"的内容,想知道我是否错过了什么。