这里是以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 名与参数,比在服务端打日志更快定位问题。
相关阅读
- 微信公众号 ASP.Net Core API开发 接收消息的实现
- ASP.NET Core MVC 中添加Areas区域进行模块化分隔
- ASP.NET Core IIS Bad Request Post Url
- The antiforgery token could not be decrypted