You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Server站点IIS本地刷新缓慢:WebSocket协议切换101响应问题

问题描述

开发Blazor Server站点时,本地IIS测试环境下页面加载、运行速度正常,但页面刷新时速度极慢;使用Visual Studio内置服务器运行则无此问题。经排查,问题与SignalR的refreshGrHub直接相关:移除该Hub后,页面刷新速度恢复正常。

IIS日志显示,保留refreshGrHub时会返回101协议切换响应(切换至WebSocket):

2024-08-13 13:27:30 ::1 GET /refreshGrHub id=CfYEGcWIaUhzrewhY1kBlQ 8080 - ::1 Microsoft+SignalR/8.0+(8.0.7+2f1db20456007c9515068a35a65afdf99af70bc6;+Windows+NT;+.NET;+.NET+8.0.7) - 101 0 64 7

移除Hub后无此101响应。使用Windows 11系统,需明确WebSocket协议切换缓慢的原因及解决办法。


原因分析
  1. IIS WebSocket模块未正确启用/兼容:Windows 11上的IIS默认可能未开启WebSocket模块,或模块版本与.NET 8 SignalR不匹配,导致协议握手过程出现延迟。
  2. Hub初始化逻辑阻塞:refreshGrHub的构造函数或OnConnectedAsync方法中存在同步阻塞操作(如同步数据库查询、本地文件IO),页面刷新时重建SignalR连接会触发这些阻塞逻辑,拖慢整个刷新流程。
  3. IIS配置冲突:站点绑定的端口、主机头设置,或存在的URL重写规则,可能干扰SignalR的WebSocket路由解析,导致协议切换耗时增加。
  4. 安全软件拦截:Windows Defender或第三方杀毒软件可能对WebSocket握手请求进行额外扫描,造成延迟。

解决办法
  • 启用并验证IIS WebSocket模块

    1. 打开「控制面板」→「程序和功能」→「启用或关闭Windows功能」。
    2. 展开「Internet Information Services」→「万维网服务」→「应用程序开发功能」,勾选WebSocket协议,确定后重启IIS。
    3. 打开IIS管理器,选中目标站点→「模块」,确认WebSocketModule已存在。
  • 优化Hub初始化逻辑

    1. 检查refreshGrHub的构造函数和OnConnectedAsync方法,将所有同步阻塞操作替换为异步版本(比如用await _dbContext.Set<T>().ToListAsync()替代同步查询)。
    2. 避免在连接建立时执行重型操作,可将非必要初始化逻辑延迟到首次消息发送时处理。
  • 调整IIS与SignalR配置

    1. 在站点的web.config中添加WebSocket相关配置,明确传输优先级:
      <configuration>
        <system.webServer>
          <webSocket enabled="true" />
        </system.webServer>
        <appSettings>
          <add key="SignalR:WebSocketEnabled" value="true" />
          <add key="SignalR:TransportPriority" value="WebSocket, ServerSentEvents, LongPolling" />
        </appSettings>
      </configuration>
      
    2. 确保站点应用程序池为集成模式,.NET CLR版本匹配.NET 8(选择「无托管代码」或对应.NET 8版本)。
  • 排除安全软件干扰

    1. 临时关闭Windows Defender实时保护,测试刷新速度是否恢复;若恢复,将站点目录和IIS进程(w3wp.exe)添加到Defender排除列表。
    2. 检查第三方杀毒软件的网络监控规则,排除站点使用的端口(如测试用的8080)。
  • 排查SignalR连接日志
    在项目Program.cs中启用SignalR详细日志,定位协议切换阶段的具体耗时点:

    builder.Logging.AddFilter("Microsoft.AspNetCore.SignalR", LogLevel.Debug);
    builder.Logging.AddFilter("Microsoft.AspNetCore.Http.Connections", LogLevel.Debug);
    

    运行站点后查看日志,确认延迟发生的具体环节。


内容的提问来源于stack exchange,提问作者vagelis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:02:43