SignalR Core群组消息发送相关技术问题咨询
SignalR Core 群组相关问题解答
刚上手SignalR Core确实会碰到不少和旧版不一样的地方,我来给你捋捋这两个问题的解决思路:
问题1:是否需要检查连接已在群组中?
答案是不需要额外检查。SignalR Core的Groups.AddToGroupAsync(Context.ConnectionId, chatRoomId)方法本身是幂等的——也就是说,哪怕当前连接已经在目标群组里了,重复调用这个方法也不会抛出错误,框架内部会自动处理重复添加的情况。
而且SignalR Core并没有提供公开的API来直接查询某个连接是否属于某个群组,因为框架已经帮我们处理了重复添加的场景。你既然能随消息拿到ChatRoomId,直接调用添加方法就好,完全不用提前做成员状态检查,省掉不少冗余代码。
问题2:如何排除发送者接收自己的消息?
确实,SignalR Core移除了旧版的OthersInGroup方法,但我们有两种更灵活的方式实现这个需求:
服务端直接排除(推荐):
发送消息的时候,用Except方法指定排除当前发送者的连接ID即可。示例代码如下:await Clients.Group(chatRoomId) .Except(Context.ConnectionId) .SendAsync("ReceiveMessage", messageContent);这种方式最高效,因为服务端根本不会把消息推送给发送者,避免了不必要的网络传输。
客户端过滤:
如果某些场景下你不想在服务端处理,也可以在客户端收到消息时,判断消息携带的发送者连接ID是否和自己的连接ID一致,如果是就忽略这条消息。不过这种方式只是客户端不展示,消息其实已经发到客户端了,不如服务端处理高效。
内容的提问来源于stack exchange,提问作者Sam




