You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动