Asp.Net Core SignalR的协议协商挑战
文章目录
- 前言
- 一、协议协商的原理
- 二、常见的协商问题及解决办法
- 1.跨域资源共享(CORS)问题
- 2.身份验证和授权问题
- 3.传输方式不兼容问题
- 4.路由配置错误
- 5.代理和负载均衡器问题
- 6.自定义协商(高级)
- 总结
前言
在ASP.NET Core SignalR 里,协议协商是客户端和服务器建立连接时的重要步骤
一、协议协商的原理
- SignalR 客户端和服务器在建立连接时,会经历以下协商步骤:
- 客户端向服务器发送一个 HTTP GET 请求,请求路径为/negotiate。
- 服务器返回客户端支持的传输方式(像 WebSocket、Server-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。
- 粘性会话(Sticky Sessions):
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.mzph.cn/news/928211.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
湖南省交通建设质量安全监督管理局网站西安电商网站
GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版
以三个点的当前位置作为状态,广度优先遍历,找到终点即为最短次数。
注意:
一次可以移动多个点,但是每个点只能移动一步。在同一次中…
【光照】Unity如何在Cubemap中采样反射信息?
Cubemap是游戏渲染中常用的技术,由6个2D纹理组成立方体,用于环境映射、反射和折射效果。其核心原理是利用方向向量进行纹理采样,通过反射公式R=I-2*dot(N,I)*N计算反射向量。Unity URP通过PLATFORM_SAMPLE_TEXTUREC…
US$365.75 Mercedes-Benz Authorization License For CGDI A2 Key Programmer
Mercedes-Benz Authorization License For CGDI A2 Key ProgrammerFor CGDI A2 Key Programmer1. Activate BENZ authorization to unlock Mercedes IMMO capabilities.2. No Need Shipping. License authorization on…
移动端网站建设的意义为什呢网站打开wordpress很慢
目录 引言1 智能家居的崭新时代2 无人驾驶的崭新时代3 虚拟现实的扩展与改进4 人工智能的综合应用5 云计算的可持续性结语 引言
时光荏苒,科技的飞速发展已经成为当今社会的标志之一。在这个数字化时代,云计算已经成为推动技术革新和生活方式改变的关键…
深入解析:TCP三次握手/四次握手-TCP/IP四层模型-SSL/TLS-HTTP-HTTPS
深入解析:TCP三次握手/四次握手-TCP/IP四层模型-SSL/TLS-HTTP-HTTPSpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…
2025测振仪厂家最新企业品牌推荐排行榜,自动诊断测振仪,防爆测振仪,智能测振仪,诊断故障测振仪推荐!
在工业生产领域,设备振动监测是保障生产安全、提升生产效益的关键环节,测振仪作为核心监测工具,其性能与品质直接影响设备故障诊断的准确性和及时性。当前市场上测振仪品牌数量众多,产品质量参差不齐,部分品牌存在…
西安建站价格谷歌seo关键词排名优化
目录 一、方法一 采用qrcodejs2生成1.1、安装二维码插件qrcodejs21.2、在vue文件中,引入生成二维码插件1.3、构建二维码对象qrCodeDiv 一、方法二 -采用qrcode生成2.1、安装qrcode2.2、页面引入2.3、方法里边使用2.4、options 三、方法三 vue-qr3.1、安装3.2、页面引…
DeepSeek 赋能教育新生态,智能教育机器人开启智慧教学新篇章 - 详解
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
深入解析:第1天:认识RNN及RNN初步实验(预测下一个数字)
深入解析:第1天:认识RNN及RNN初步实验(预测下一个数字)2025-10-05 11:35
tlnshuju
阅读(0)
评论(0) 收藏
举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importan…
如何创建一个属于自己的网站什么叫手机网站
涉及技术:
1.使用NMdbus4 库
2.ushort[]转int
记得之前刚学习的时候,是ushort[] → Hex字符串→byte[] → 翻转byte[] →BitConverter.ToInt32(),饶了一大圈;实际上可以直接转;这里也有小细节:使用BitCo…
2025 铜覆钢厂家最新企业品牌推荐排行榜单,铜覆钢接地棒,铜覆钢圆钢,铜覆钢扁钢,铜覆钢圆线公司推荐
在当今的电力、石油化工、通讯等众多领域,铜覆钢圆钢作为重要的接地材料,其质量与性能直接关系到相关工程的安全与稳定。然而,当前铜覆钢圆钢行业却面临着诸多问题。市场上产品质量参差不齐,部分生产商为追求利润,…
【JNI】JNI环境搭建
1 前言
JNI (Java Native Interface) 是 JDK 提供的一种机制,用于实现 Java 代码与其他语言(主要是 C 和 C++)编写的本地代码之间的交互。
JNI 接口详见 JDK 安装目录中的 include/jni.h 文件,Android…
JDBC - Wrapper接口
java.sql.Wrapper
javax.sql.DataSource
java.sql.Connection
java.sql.Statement
java.sql.ResultSet
java.sql.ResultSetMetaData
java.sql.DatabaseMetaData
java.sql.ParameterMetaData
asp做网站基本过程商标设计图片
在之前写过一篇关于虚拟环境使用的文章,但是还没有好好的介绍一下 Python 的用户环境,原因是自己一直没遇到要使用 用户环境 的使用场景,所以就一直懒得写。恰巧这两天,自己遇到了一个使用用户环境的体验可以完爆虚拟环境的案例&a…
深入解析:[论文阅读]Poisonprompt: Backdoor attack on prompt-based large language models
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
fasthx fastapi服务器端渲染看框架
fasthx fastapi服务器端渲染看框架fasthx 是一个fastapi 的服务器端渲染框架
包含的特性基于装饰器的语法
内置htmx
支持任何模版引擎,htmy,jinja2,dominate
对于装饰器路路由渲染引擎支持访问所有依赖
支持异步以及…
vue: 报错: vue ResizeObserver loop completed with undelivered notifications.
一,报错信息:
vue ResizeObserver loop completed with undelivered notifications.
如图:我没有专门截图,转一张别人发的二,原因
ResizeObserver 警告解释这条警告源于 ResizeObserver 的实现机制。它表示监听了 D…