前置笔记:
关于SignalR的身份认证问题_董厂长的博客-CSDN博客
之前做Task的解决方案是不同的功能对应不同的Hub,分开进行消息推送。应付简单的场景是足够的。后期复杂场景可能会出现单个HUB向部分客户端发送消息。
举个栗子:聊天室的demo下,北京客户端 和 上海客户端链接是同一个hub,但是需求是单个hub向上海客户端发消息。
不要局限于聊天室功能,再举个栗子,OA流程的请假功能,OA通知到Hub,Hub通知到领导。hub肯定不会sendAllAsync( )给所有的同事。
主要思路:筛选客户端
1、客户端筛选的3个参数:ConnectionId、组和用户Id
(用户id就是对应登录的时候ClaimTypes.NameIdentifier的Claim)。
2、Hub的Groups属性为IGroupManager属性,可以对组成员进行管理。查看类型的成员。
3、Hub的Clients属性为IHubCallerClients类型,可以对连接到当前集线器的客户端进行筛选。查看类型的成员。
4、IClientProxy类型。无法知道具体有哪些客户端调用SendAsync()方法向筛选的客户端发送消息。
5、实现聊天室私聊。
1、public async Task<string> SendPrivateMessage(string destUserName,string message)
{
User? destUser = Users.FindByName(destUserName);
string destUserId = destUser.Id.ToString();
string srcUserName = this.Context.User!.FindFirst(ClaimTypes.Name)!.Value;
string time = DateTime.Now.ToShortTimeString();
// 看这里 傻逼 重点代码在这里
await this.Clients.User(destUserId).SendAsync("ReceivePrivateMessage",
srcUserName, time, message);
return "ok";
}
2、const ret = await connection.invoke("SendPrivateMessage", destUserName, msg);
connection.on('ReceivePrivateMessage', (srcUser,time,msg) => {
state.messages.push(srcUser+"在"+time+"发来私信:"+msg);
});
看注释部分,通过clients来指定/筛选 客户端
客户端的筛选,分组 去看一下client提供的方法。
IHubContext 滚去看