Asp.Net Core SignalR的协议协商问题

news2025/6/4 1:55:04

文章目录

  • 前言
  • 一、协议协商的原理
  • 二、常见的协商问题及解决办法
    • 1.跨域资源共享(CORS)问题
    • 2.身份验证和授权问题
    • 3.传输方式不兼容问题
    • 4.路由配置错误
    • 5.代理和负载均衡器问题
    • 6.自定义协商(高级)
  • 总结


前言

在ASP.NET Core SignalR 里,协议协商是客户端和服务器建立连接时的重要步骤

一、协议协商的原理

  • SignalR 客户端和服务器在建立连接时,会经历以下协商步骤:
    • 客户端向服务器发送一个 HTTP GET 请求,请求路径为/negotiate
    • 服务器返回客户端支持的传输方式(像 WebSocketServer-Sent Events长轮询)、访问令牌以及其他配置信息。
    • 客户端依据服务器返回的信息,挑选合适的传输方式来建立连接。

二、常见的协商问题及解决办法

1.跨域资源共享(CORS)问题

  • 问题表现:客户端在协商请求时,浏览器控制台显示类似No ‘Access-Control-Allow-Origin’ header is present的错误。

  • 解决办法
    要保证服务器端已正确配置 CORS
    必须启用 SignalR 特定的 CORS 策略。

    //跨域
    string[] urls = new[] { "http://localhost:5173" };
    builder.Services.AddCors(opt => 
            opt.AddDefaultPolicy(builder => builder.WithOrigins(urls)
            .AllowAnyMethod().AllowAnyHeader().AllowCredentials())
            );
    app.UseCors();
    app.UseHttpsRedirection();
    

2.身份验证和授权问题

  • 问题表现:协商请求返回 401(未授权)或者 403(禁止访问)错误。

  • 解决办法
    要确保客户端在协商请求中正确传递了认证信息。
    对服务器端的授权策略进行检查。

    // 对Hub添加授权要求
    [Authorize]
    public class MyHubService: Hub
    {
        // ...
    }
    

3.传输方式不兼容问题

  • 问题表现:客户端和服务器没有共同支持的传输方式。
  • 解决办法
    检查客户端和服务器是否都支持相同的传输方式。
    可以在客户端限制传输方式。
    // 创建新连接
              state.connection = new signalR.HubConnectionBuilder()
                .withUrl(state.serverUrl, {
                  //skipNegotiation: true, // 尝试跳过协商步骤
                  transport: signalR.HttpTransportType.WebSockets // 限制传输方式,强制使用 WebSockets
                })
                .withAutomaticReconnect({
                  nextRetryDelayInMilliseconds: retryContext => {
                    state.retryCount = retryContext.previousRetryCount + 1;
                    return Math.min(1000 * Math.pow(2, state.retryCount), 30000);
                  }
                })
                .configureLogging(signalR.LogLevel.Debug) // 启用详细调试日志
                .build();
    

4.路由配置错误

  • 问题表现:协商请求返回 404(未找到)错误。
  • 解决办法
    确认 Hub 的路由配置无误。
    // 配置路由
    app.MapHub<MyHubService>("/Hubs/MyHubService");// SignalR 终结点
    

5.代理和负载均衡器问题

  • 问题表现:在 Kubernetes/IIS ARR 后出现 WebSocket is closed 或协商超时。
  • 解决办法
    • 粘性会话(Sticky Sessions):
      若使用 WebSocket,需配置负载均衡器保持会话亲和性。
    • 转发头配置
      app.UseForwardedHeaders(new ForwardedHeadersOptions {
          ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
      });
      
    • WebSocket 支持
      IIS 需启用 WebSocket 模块,Azure App Service 配置 webSockets: true。

6.自定义协商(高级)

  • 禁用协商(仅限 WebSocket
    服务器必须启用 WebSocket 并开放正确端口(通常 80/443)。
    // 创建新连接
              state.connection = new signalR.HubConnectionBuilder()
                .withUrl(state.serverUrl, {
                  skipNegotiation: true, // 尝试跳过协商步骤
                  transport: signalR.HttpTransportType.WebSockets // 强制使用 WebSockets
                })
                .withAutomaticReconnect({
                  nextRetryDelayInMilliseconds: retryContext => {
                    state.retryCount = retryContext.previousRetryCount + 1;
                    return Math.min(1000 * Math.pow(2, state.retryCount), 30000);
                  }
                })
                .configureLogging(signalR.LogLevel.Debug) // 启用详细调试日志
                .build();
    

总结

  • 检查终结点是否注册 MapHub

  • 验证 CORS 策略(特别是 AllowCredentials())

  • 确保身份认证信息正确传递

  • 核对客户端/服务端库版本

  • 检查网络层(防火墙、代理、负载均衡)

  • 启用详细日志分析协商过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2396071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rust 学习笔记:发布一个 crate 到 crates.io

Rust 学习笔记&#xff1a;发布一个 crate 到 crates.io Rust 学习笔记&#xff1a;发布一个 crate 到 crates.io提供有用的文档注释常用标题文档注释作为测试注释所包含的项目 使用 pub use 导出一个方便的公共 API设置 crates.io 账户添加 metadata 到一个新的 crate发布到 c…

Vert.x学习笔记-EventLoop与Context的关系

Vert.x学习笔记 1. EventLoop 的核心作用2. Context 的核心作用3. EventLoop 与 Context 的关系1. 事件循环&#xff08;EventLoop&#xff09;的核心职责2. 上下文&#xff08;Context&#xff09;的核心职责3. 事件循环与上下文的关系&#xff08;1&#xff09;一对一绑定&am…

2025030给荣品PRO-RK3566开发板单独升级Android13的boot.img

./build.sh init ./build.sh -K ./build.sh kernel 【导入配置文件】 Z:\Android13.0\rockdev\Image-rk3566_t\config.cfg 【更新的内核】 Z:\Android13.0\rockdev\Image-rk3566_t\boot.img 【导入分区表&#xff0c;使用原始的config.cfg会出错的^_】 Z:\Android13.0\rockdev\…

由enctype-引出post与get的关系,最后深究至请求/响应报文

本篇载自我的笔记&#xff0c;本次为第二次复习。我觉得我有能力理一下思路了。 --- 笔记截图。 enctype HTML 表单的 enctype&#xff08;Encode Type&#xff0c;编码类型&#xff09;属性用于控制表单数据在提交到服务器时的编码方式&#xff0c;不同取值的详细解析如下&a…

搭建基于VsCode的ESP32的开发环境教程

一、VsCode搜索ESP-IDF插件 根据插件处搜索找到ESP-IDF并安装 安装完成 二、配置安装ESP-IDF 配置IDF 按照如下配置&#xff0c;点击安装 安装完成 三、使用案例程序 创建一个闪光灯的例子程序&#xff0c;演示程序编译下载。 选择blink例子&#xff0c;闪烁LED的程序 选…

【MFC】初识MFC

目录 01 模态和非模态对话框 02 静态文本 static text 01 模态和非模态对话框 首先我们需要知道模态对话框和非模态对话框的区别&#xff1a; 模态对话框是一种阻塞时对话框&#xff0c;它会阻止用户与应用程序的其他部分进行交互&#xff0c;直到用户与该对话框进行交互并关…

如何通过数据分析优化项目决策

通过数据分析优化项目决策需从明确数据分析目标、选择适当的数据分析工具、确保数据质量、建立数据驱动文化等方面入手&#xff0c;其中&#xff0c;明确数据分析目标是优化决策过程的基础&#xff0c;只有清晰明确的数据分析目标才能指导有效的数据采集与分析&#xff0c;避免…

2024年数维杯国际大学生数学建模挑战赛B题空间变量协同估计方法研究解题全过程论文及程序

2024年数维杯国际大学生数学建模挑战赛 B题 空间变量协同估计方法研究 原题再现&#xff1a; 在数理统计学中&#xff0c;简单采样通常假设来自相同总体的采样点彼此独立。与数理统计相反&#xff0c;空间统计假设空间变量的采样点是相依的&#xff0c;并在其值中表现出某些趋…

leetcode hot100刷题日记——34.将有序数组转换为二叉搜索树

First Blood&#xff1a;什么是平衡二叉搜索树&#xff1f; 二叉搜索树&#xff08;BST&#xff09;的性质 左小右大&#xff1a;每个节点的左子树中所有节点的值都小于该节点的值&#xff0c;右子树中所有节点的值都大于该节点的值。 子树也是BST&#xff1a;左子树和右子树也…

网页自动化部署(webhook方法)

实现步骤&#xff1a; 宝塔安装宝塔WebHook 2.5插件。 github 上配置网页仓库&#xff08;或可在服务器的网页根目录clone&#xff09;。 配置宝塔WebHook 2.5 添加hook脚本&#xff1b; 编辑添加syncJC脚本&#xff1b; #!/bin/bash # 定义网站根目录 WEBROOT"/www…

AU6825集成音频DSP的2x32W数字型ClaSSD音频功率放大器(替代TAS5825)

1.特性 ● 输出配置 - 立体声 2.0: 2 x 32W (8Ω,24V,THD N 10%) - 立体声 2.0: 2 x 26W (8Ω,21V,THD N 1%) ● 供电电压范围 - PVDD:4.5V -26.4V - DVDD: 1.8V 或者 3.3V ● 静态功耗 - 37mA at PVDD12V ● 音频性能指标 - THDN ≤ 0.02% at 1W,1kHz - SNR ≥ 107dB (A-wei…

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1商用服务体验全流程

华为云 Flexus 与 DeepSeek-V3/R1 的深度整合&#xff0c;构建了一套 “弹性算力 智能引擎” 的协同体系。 Flexus 系列云服务器基于柔性计算技术&#xff0c;通过动态资源调度&#xff08;如 Flexus X 实例&#xff09;实现 CPU / 内存的实时弹性分配&#xff0c;尤其适合大模…

C# NX二次开发-查找连续倒圆角面

在QQ群里有人问怎么通过一个选择一个倒圆角面来自动选中一组倒圆角面。 可以通过ufun函数 UF_MODL_ask_face_type 和 UF_MODL_ask_face_props 可判断处理选择相应的一组圆角面。 代码: Tag[] 查找连续倒圆角面(Tag faceTag) {theUf.Modl.AskFaceType(faceTag, out int typ…

今天遇到的bug

先呈现一下BUG现象。 这主要是一个传参问题&#xff0c;参数一直传不过去。后来我才发现&#xff0c;问题所在。 我们这里用的RquestBody接收参数&#xff0c;所有请求的参数需要用在body体中接收&#xff0c;但是我们用postman&#xff0c;用的是字符串查询方式传参&#x…

长安链智能合约命令解析(全集)

创建命令解析 ./cmc client contract user create \ --contract-namefact \ --runtime-typeWASMER \ --byte-code-path./testdata/claim-wasm-demo/rust-fact-2.0.0.wasm \ --version1.0 \ --sdk-conf-path./testdata/sdk_config.yml \ --admin-key-file-paths./testdata/cryp…

一、OpenCV的基本操作

目录 1、OpenCV的模块 2、OpenCV的基础操作 2.1图像的IO操作 2.2绘制几何图形 2.3获取并修改图像中的像素点 2.4 获取图像的属性 2.5图像通道的拆分与合并 2.6色彩空间的改变 3、OpenCV的算数操作 3.1图像的加法 3.2图像的混合 3.3总结 1、OpenCV的模块 2、OpenCV的基…

裂缝仪在线监测装置:工程安全领域的“实时守卫者”

在基础设施运维领域&#xff0c;裂缝扩展是威胁建筑结构安全的核心隐患之一。传统人工巡检方式存在效率低、时效性差、数据主观性强等局限&#xff0c;而裂缝仪在线监测装置通过技术迭代&#xff0c;实现了对结构裂缝的自动化、持续性追踪&#xff0c;为工程安全评估提供科学依…

【论文精读】2024 ECCV--MGLD-VSR现实世界视频超分辨率(RealWorld VSR)

文章目录 一、摘要二、问题三、Method3.1 Latent Diffusion Model3.2 Motion-guided Diffusion Sampling3.3 Temporal-aware Decoder Fine-tuning 四、实验设置4.1 训练阶段4.2 训练数据 贡献总结 论文全称&#xff1a; Motion-Guided Latent Diffusion for Temporally Consis…

SpringBoot简单体验

1 Helloworld 打开&#xff1a;https://start.spring.io/ 选择maven配置。增加SpringWeb的依赖。 Generate之后解压&#xff0c;代码大致如下&#xff1a; hpDESKTOP-430500P:~/springboot2/demo$ tree ├── HELP.md ├── mvnw ├── mvnw.cmd ├── pom.xml └── s…

2025年通用 Linux 服务器操作系统该如何选择?

2025年通用 Linux 服务器操作系统该如何选择&#xff1f; 服务器操作系统的选择对一个企业IT和云服务影响很大&#xff0c;主推的操作系统在后期更换的成本很高&#xff0c;而且也有很大的迁移风险&#xff0c;所以企业在选择服务器操作系统时要尤为重视。 之前最流行的服务器…