尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Asp.Net Core SignalR的协议协商挑战

Asp.Net Core SignalR的协议协商挑战
📅 发布时间:2026/6/20 8:17:08

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。

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())

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

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

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

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

相关新闻

  • 251005
  • US$365.75 Mercedes-Benz Authorization License For CGDI A2 Key Programmer
  • 2025/10/3

最新新闻

  • 2026永州汽车贴膜门店实力排行 - 国麟测评
  • 金得力环保:木百叶定制品牌中的靠谱之选 - mypinpai
  • 2026黑龙江哈尔滨红肠哪家正宗?四家优质品牌总结 - 最新行业资讯
  • 深入解析CAN控制器:从寄存器位到消息调度与滤波机制
  • Siri要接入AI了,苹果手机上一句话让GPT写文案、DeepSeek写代码的时刻来了
  • 从M68HC11E实战解析8位MCU架构:寄存器、外设与低功耗设计

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号