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

这篇具有很好参考价值的文章主要介绍了.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服务器的客户端。文章来源地址https://www.toymoban.com/news/detail-688212.html

  • 解决办法:引入 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消息

到了这里,关于.Net 6 SignalR 实际业务开发中遇到的问题及解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安装unity时遇到的问题与解决办法

    我遇到的问题 unity package manager error, vs安装时提示网络问题, hub个人许可证不见了且申请不了   百度真是个好东西,对我这种小白极为友好,写一下我踩的坑   1.unityhub版本问题 下最新版也不是不好,但我还是觉得2.5版本好(我安装最新版会弄不出许可证) 注意,安装un

    2023年04月10日
    浏览(46)
  • Microsoft Visio 画图遇到的问题及解决办法

    这条虚线是用来分页的,对画图没有影响,但可能新手会想要去掉它,方法如下: 在编辑首页中点击打开主菜单栏中的“视图”选项,然后在弹出来的窗口中点击取消打勾“分页符”选项。然后就可以看到编辑页面中的虚线成功消失啦。 如果想要在画布中画出一条虚线,只

    2024年02月06日
    浏览(54)
  • 路由器升级可能遇到的问题及解决办法

    一、出现乱码 拿出路由器,通电后通过Console口连上去,发现超级屏幕出现了一些乱码,会不会是Consol口坏了?如果出现Console口坏了,一般会在超级终端屏幕上不断输出很多的乱码,回车后出现乱码,可能是每秒传输速率不对,将默认值9600更换为l15200,路由器启动成功,路由

    2024年02月05日
    浏览(36)
  • IDEA遇到Cannot resolve symbol问题的解决办法

    以下列出了多种可能造成Cannot resolve symbol问题的情况, 可以根据自己的问题进行选择设置 解决: 在idea中找到File – Project Structure – Project SDK, 然后选择自己安装好的JDK 解决: 打开File – Setting – 直接搜索Maven, 然后设置Maven home path(自己的Maven安装路径) 如下图的位置, 清除缓存后

    2024年02月15日
    浏览(74)
  • 安装opencv-python遇到的问题及解决办法

           由于本人是小白,课程作业为不限软件不限语言进行横缝检测,想通过opencv进行相应的图片处理,本文是在安装导入过程中遇到的问题及解决办法,谨以此文感谢我实验室大佬。 环境:anaconda,python3.8, PyCharm2020 首先是我在导入过程中几个参考的看起来很靠谱的文章:

    2024年02月09日
    浏览(67)
  • 微信小程序picker组件遇到的问题以及解决办法

    先来看一下官方文档中picker的基本概念: 从底部弹起的滚动选择器,现支持三种选择器,通过mode来区分,分别是普通选择器,时间选择器,日期选择器,默认是普通选择器。 重要属性 range: 选取范围,数据类型为Array / Object Array,mode为 普通选择器 时,range 有效; value:

    2024年02月11日
    浏览(55)
  • 实际记录uni-app使用uni-download和uni.saveFile下载保存文件遇到的问题以及解决方法

    app里的开发的小程序需要下载文件功能以及一个下载中心页面可以查看所有下载的文件,使用了uni.download下载以及uni.saveFile保存文件 下载中心页面实现逻辑 1.下载文件后保存文件名和uni.saveFile返回的路径uni.setStorageSync到缓存里 2.下载中心读取uni.getStorageSync缓存的文件列表 通

    2024年02月12日
    浏览(72)
  • cocos creator 3.x遇到的一些问题和解决办法

    一、场景文件损坏问题。 现象:一次异常死机,关机重启后,场景文件(cocos creator 3.6.2创建)无法打开,涉及几天的工作,如果无法恢复,损失巨大!感觉太夸张了。 分析:认真分析了场景文件格式,是json格式(可以用visual studio code打开),层次不多,以id进行关联,尝

    2024年02月05日
    浏览(66)
  • UE4及Airsim安装时遇到的问题及解决办法

    我根据知乎上一篇博主的教程来进行安装UE4和Airsim,期间遇到了一些问题,在这里总结并给出可能的解决方法 教程:(解密AirSim-初稿)第一章:初识AirSim - 知乎 (zhihu.com) UE4是在Epic平台上的,而这个游戏平台在几家游戏平台里面虽然不是最慢的,但是速度也不稳定,我连接校

    2024年02月15日
    浏览(51)
  • Tauri发送网络请求系列,接口请求封装并遇到的问题解决办法

    接口请求处理 项目中没有使用 axios 等前端 HTTP 请求库,使用的是 Tauri 内置的 fetch 方法,但该方法使用比较简单,没有请求拦截器或响应拦截器相关配置,所以我们有必要在此基础上做下二次封装。  红框选中的内容是必须改的,不然会发生跨域: 新建  utils/http.ts  文件

    2024年02月14日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包