这里是以ASP.NET Core为例说明SignalR中的Caller使用场景。初学者往往都会忽略到这一点儿,造到的后果就是发送的消息接收不到。一般们后台往前端发送消息会有以下几种方式,注意收藏。

1、对所有已连接的客户端发送消息

_hub.Clients.All.SendAsync(methodName, msg);

2、对指定的用户组发送消息

_hub.Clients.Group(goupName).SendAsync(methodName, msg);

3、对指定的用户发送消息

_hub.Clients.User(user).SendAsync(methodName, msg);

4、对当前会话回复消息

_hub.Clients.Caller.SendAsync(methodName, msg);


每一项展开都会很多内容,这里只是做一个简单的汇总,详细信息可以参见官方的使用文档。

https://docs.microsoft.com/zh-cn/aspnet/core/signalr/groups?view=aspnetcore-5.0

四种目标的使用场景对照

SignalR 服务端推送的四个目标各有分工,混用是"消息发出去却收不到"的头号原因。

  • Clients.All:广播,如全局公告、行情全推;
  • Clients.Group(groupName):按组推送,如直播间、协同文档房间,用户通过 Groups.AddToGroupAsync 入组;
  • Clients.User(userId):定向推给某登录用户的所有连接(需 IUserIdProvider 把连接映射到用户标识),如个人通知;
  • Clients.Caller:只回给当前发起调用的那个连接,适合"提交后回执"。

调试时打开浏览器开发者工具的 Network 面板,选中 WebSocket 帧即可看到 method 名与参数,比在服务端打日志更快定位问题。

相关阅读

参考资料