首页 > 其他分享 >.Net 6 SignalR 实际业务开发中遇到的问题及解决办法

.Net 6 SignalR 实际业务开发中遇到的问题及解决办法

时间:2024-09-29 11:04:29浏览次数:6  
标签:解决办法 websocket id SignalR 服务器 Net 连接 客户端

.Net 6 SignalR 实际业务开发中遇到的问题及解决办法

 

一、SiganlR 使用的协议类型

  • 1.websocket即时通讯协议
  • 2.Server-Sent Events(SSE)服务器事件
  • 3.longpolling 长轮询。

如果客户端开启协商,会按顺序选择可兼容的协议。(默认开启协议协商)
如果客户端禁用协商,只能websocket协议。

二、连接过程

  • 客户端未禁用协商
    • 1.客户端向服务器发http请求,询问服务器支持什么协议。
      服务端返回支持的协议类型,并分配ConnectionId。(http 协商请求)
    • 2.客户端确认协议后发送 websocket 请求,建立连接。(客户端会按顺序选择可兼容的协议)
  • 客户端禁用协商
    • 客户端直接发送 websocket 请求,建立连接。
    //客户端建立signalr连接时,指定配置参数,禁用协商。
    const options = {
      skipNegotiation: true,//是否跳过协商过程
      transport: signalR.HttpTransportType.WebSockets,//直接指定使用websocket协议
    };
    connection = new signalR.HubConnectionBuilder()
      .withUrl("https://localhost:7002/Hubs/ChatRoomHub",options)
      .withAutomaticReconnect() //自动重连
      .build();
    

三、身份认证

  • websocket协议 无请求报文头headers,token只能放 QueryString 中,一般参数名定为 access_token。
  • 在 Hub中引入身份认证服务,Hub OnConnectedAsync()中,即建立连接时,通过身份认证服务解析token是否合法并拿到用户信息。

四、分布式部署问题

问题1. 多节点环境,客户端协商过程,可能请求到不同服务器。

如果有AB两个服务器负载,在协商过程时
客户端第一次http请求A,A服务器记录了客户端连接信息上下文。
客户端第二次ws连接发送到B服务器,而B服务器没有客户端连接信息上下文,就出错了。

方式1. 粘性会话

网关服务器 或 负载均衡服务器 进行配置,把来自同一个客户端的请求都转发给同一台服务器。

  • 优点:兼容性最好,客户端按兼容性依次选择协议
  • 缺点:公网ip没办法平均分配,很难控制。
方式2. 禁用协商

客户端连接时设置禁用协商,连接时仅一次ws请求。

  • 缺点:只能适用于兼容websocket的浏览器 只能使用websocket协议,无法使用 sse 和 longpolling

问题2. 多节点环境,消息不能跨服务器连接发送。

A服务器向全部连接发消息,只能发送到连接A服务器的客户端,不能发送给连接到B服务器的客户端。

  • 解决办法:引入 Microsoft.AspNetCore.SignalR.StackExchangeRedis 包,注入分布式SignalR服务到DI中。
    作用:在多个服务器实例之间共享消息和连接状态。确保跨服务器实例的连接同步和消息传递。
     services.AddSignalR(o =>
      {
          o.EnableDetailedErrors = true;//详细异常信息
          o.HandshakeTimeout = TimeSpan.FromSeconds(30);//握手超时时间
      }).AddStackExchangeRedis("{redis连接字符串}", opt =>
      {
          opt.Configuration.ChannelPrefix = "{RedisKey前缀}";
      });//分布式 SignalR 消息
    

问题3. 在后台任务中使用Hub推送消息。

  • 1.建立连接,从token中拿到用户信息。(分布式环境,多节点负载时,更新缓存需要加锁)
    • 缓存: 用户id - [连接id集合]
    • 缓存: 连接id - 用户id
  • 2.断开连接,从缓存中移除 当前连接id。(分布式环境,多节点负载时,更新缓存需要加锁)
  • 3.后台任务
    • 注入分布式SignalR服务
    • 注入Hub服务
    • 业务中拿到要接收消息的 用户id集合
    • 从缓存中找到对应的 全部连接id
    • 调Hub向连接id推送SignalR消息

标签:解决办法,websocket,id,SignalR,服务器,Net,连接,客户端
From: https://www.cnblogs.com/sexintercourse/p/18439185

相关文章

  • .NET常见的几种项目架构模式,你知道几种?(附带使用情况投票)
    .NET常见的几种项目架构模式,你知道几种?(附带使用情况投票) 思维导航前言三层架构MVC架构DDD分层架构整洁架构CQRS架构最后总结参考文章DotNetGuide技术社区前言项目架构模式在软件开发中扮演着至关重要的角色,它们为开发者提供了一套组织和管理代码的指导原则,以......
  • .Net Web项目中,实现轻量级本地事件总线 框架
    .NetWeb项目中,实现轻量级本地事件总线框架 一、事件总线设计方案1.1、事件总线的概念事件总线是一个事件管理器,负责统一处理系统中所有事件的发布和订阅。事件总线模式通过提供一种松耦合的方式来促进系统内部的业务模块之间的通信,从而增强系统的灵活性和可维护性。1......
  • ‌Java JVM相当于.NET Core的CLR。
    ‌JavaJVM相当于.NETCore的CLR。Java虚拟机(JVM)和.NET的公共语言运行时(CLR)在内部工作方面有相似之处,但也有一些区别。JVM的主要作用是将编译后的Java字节码转换为特定计算机上的可执行代码,允许跨平台的执行,并提供内存管理和垃圾回收功能。CLR作为.NET框架的核心组件,也是将.NET代......
  • 第28篇 如何.net中实现高效可靠数据同步api
    通过以下方式可以高效,并保证数据同步的可靠性1.API设计使用RESTful设计,确保API端点明确,并使用适当的HTTP方法(如POST用于创建,PUT用于更新)。设计清晰的请求和响应模型,以确保客户端能够理解预期格式。2.数据验证在服务器端进行严格的数据验证,确保接收到的数据符合预期格式和......
  • 针对VMware的安装遇到的麻烦及解决办法(vmware Authorization Service未启动,蓝屏,卡在下
    注明:该文章仅为个人安装vmware时遇到的问题与解决方法的总结,第一次写文章可能有点粗糙。注意:如要使用vmware需要允许虚拟机相关服务详见第二个文章链接(先开启此项服务尝试问题是否解决再尝试其他办法)一:vmwareAuthorizationService未启动安装好VMware后运行虚拟机时会报错......
  • VMware Tanzu Kubernetes Grid Integrated Edition 1.20 发布下载,新增功能概览
    VMwareTanzuKubernetesGridIntegratedEdition1.20发布下载,新增功能概览VMwareTanzuKubernetesGridIntegratedEdition(TKGI)1.20.0-运营商Kubernetes解决方案Kubernetes-basedcontainersolutionwithadvancednetworking,aprivatecontainerregistry,an......
  • idea启动卡在启动界面不动弹,java.net.BindException: Address already in use: bind
    早上刚想打开idea发现卡在启动界面无法动弹任务管理器关闭idea和重启机器都无法解决,搜了一下网上的教程把解决方法记录下:打开AppData\Local\JetBrains\IntelliJIdea2021.2\log查看idea.log发现详细错误如下:2024-09-2908:46:57,944[10149]ERROR-llij.ide.plugins.Plugi......
  • 在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
    前言:什么是操作筛选器操作筛选器是ASP.NETCoreWebAPI中的一种过滤器,用于在执行控制器操作(Action)之前或之后执行一些代码,完成特定的功能,比如执行日志记录、身份验证、授权、异常处理等通用的处理逻辑。每次ASP.NETCoreWebAPI中控制器的操作方法被执行的时候,操作筛选器......
  • 猜拳数据集-石头-剪刀-布数据集-YOLOv9 - YOLOv8 - YOLOv5 - YOLOv7 - COCO JSON - YO
    “石头-剪刀-布”计算机视觉项目是一个利用摄像头捕捉手势并识别出手势是石头、剪刀还是布的项目。这类项目通常用于学习和展示计算机视觉技术,如图像处理、特征提取以及机器学习或深度学习模型的应用。数据介绍rock-paper-scissorsComputerVisionProject数据集信息......
  • 【GAN】生成对抗网络Generative Adversarial Networks理解摘要
    【Pytorch】生成对抗网络实战_pytorch生成对抗网络-CSDN博客【损失函数】KL散度与交叉熵理解-CSDN博客  [1406.2661]GenerativeAdversarialNetworks(arxiv.org)GAN本质是对抗或者说竞争,通过生成器和鉴别器的竞争获取有效地结果,换句话说,GAN是在养蛊,大量数据和批次的......