• SignalR向部分客户端进行消息推送


    前置笔记:

    关于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. 1public async Task<string> SendPrivateMessage(string destUserName,string message)
    2. {
    3. User? destUser = Users.FindByName(destUserName);
    4. string destUserId = destUser.Id.ToString();
    5. string srcUserName = this.Context.User!.FindFirst(ClaimTypes.Name)!.Value;
    6. string time = DateTime.Now.ToShortTimeString();
    7. // 看这里 傻逼 重点代码在这里
    8. await this.Clients.User(destUserId).SendAsync("ReceivePrivateMessage",
    9. srcUserName, time, message);
    10. return "ok";
    11. }
    12. 2const ret = await connection.invoke("SendPrivateMessage", destUserName, msg);
    13. connection.on('ReceivePrivateMessage', (srcUser,time,msg) => {
    14. state.messages.push(srcUser+"在"+time+"发来私信:"+msg);
    15. });

    看注释部分,通过clients来指定/筛选 客户端

    客户端的筛选,分组 去看一下client提供的方法。

    IHubContext 滚去看

  • 相关阅读:
    SpringBoot整合定时任务遇到的多实例问题
    Android四大组件之BroadcastReceiver(四)
    LeetCode-1757. 可回收且低脂的产品_SQL
    HttpOnly Cookie 标志
    【NSString字符串以及NSArray数组的练习题 Objective-C语言】
    数据挖掘与分析课程笔记(Chapter 2)
    【外设篇】——显示器
    20【JDBC的事务处理】
    合并石子问题-区间dp总结
    Elasticsearch同义词最佳实践
  • 原文地址:https://blog.csdn.net/dongnihao/article/details/127557414