You need to enable JavaScript to run this app. Win2016 IIS托管Blazor Server长时间挂起报错?如何修复及实现超时自动重载
优惠活动
大模型
产品
解决方案
定价
更多

Win2016 IIS托管Blazor Server长时间挂起报错?如何修复及实现超时自动重载

Blazor Server长时间挂起触发无响应报错的修复方案

该报错是Blazor Server内置的SignalR连接断开提示,核心成因是浏览器与服务器之间的实时通信连接因长时间无活动被中间环节、服务器配置强制切断,常见触发点包括IIS应用池空闲回收、WebSocket超时阈值过短、Blazor内置Circuit保护参数配置不合理。

一、调整Windows 2016环境下的IIS配置

  • 调整应用池空闲终止策略:打开IIS管理器,定位到托管Blazor应用对应的应用池,进入「高级设置」面板,将「空闲超时(分钟)」的默认值(20)调整为0(即永不触发空闲进程终止),同时将「空闲超时操作」设置为「挂起」,避免应用长时间无访问直接被回收导致连接中断。
  • 关闭应用池强制定时回收:在应用池「高级设置」的「回收」分类下,将「固定时间间隔(分钟)」的默认值(1740,约29小时)调整为0,避免固定周期强制回收进程,导致所有在线用户的连接被批量切断。
  • 开启并优化WebSocket配置:Windows Server 2016自带的IIS 10已内置WebSocket模块,直接在应用的功能视图中启用WebSocket协议即可;随后在配置编辑器中定位到system.webServer/webSocket节点,将WebSocket的默认超时阈值调整为30分钟以上,避免空闲连接被IIS自动清理。

二、优化Blazor Server的SignalR连接参数

在项目的服务注册入口(.NET 6及以上版本为Program.cs,.NET 5及更早版本为Startup.cs)中,为Blazor Server的Hub配置适配长连接场景的参数:

builder.Services.AddServerSideBlazor()
    .AddHubOptions(options =>
    {
        // 连接活性检测间隔:服务器定期发送心跳包,避免中间网络设备清理空闲连接
        options.KeepAliveInterval = TimeSpan.FromSeconds(15);
        // 连接超时判定阈值:超过该时长未收到客户端消息则判定连接断开
        options.ClientTimeoutInterval = TimeSpan.FromSeconds(60);
    });

参数适配说明:

  • KeepAliveInterval为必配项,长挂场景下如果没有周期性心跳包,防火墙、反向代理会自动切断长时间无数据传输的连接
  • ClientTimeoutInterval需要根据公网环境的网络波动情况合理拉长,避免短暂网络抖动就触发连接断开提示

三、实现会话超时后的自动重载效果

Blazor默认的断开提示需要用户手动点击重载按钮,要实现自动重载,只需要在_Host.cshtml中自定义Blazor的重连逻辑,替换默认的断开处理流程:

  1. 在页面的body区域添加自定义的断开提示元素
<div id="disconnect-tip" style="display: none; padding: 2rem; text-align: center;">
    <p>应用连接已断开,<span id="countdown-text"></span>后将自动重载</p>
</div>
  1. 替换Blazor默认的启动逻辑,添加自动重载的倒计时处理
<script src="_framework/blazor.server.js"></script>
<script>
    window.blazor.start({
        reconnectionHandler: {
            onConnectionDown: (options, error) => {
                // 连接断开后展示提示框
                document.getElementById('disconnect-tip').style.display = 'block';
                let countdown = 8;
                const tipEl = document.getElementById('countdown-text');
                // 启动倒计时
                const timer = setInterval(() => {
                    tipEl.innerText = countdown;
                    if (countdown <= 0) {
                        clearInterval(timer);
                        // 倒计时结束后自动刷新页面
                        window.location.reload();
                    }
                    countdown--;
                }, 1000);
            },
            onConnectionUp: () => {
                // 重连成功则隐藏提示框
                document.getElementById('disconnect-tip').style.display = 'none';
            }
        }
    });
</script>

配置注意事项:

  • 自动重载的倒计时建议设置为5-10秒,时间太短容易因为短暂网络抖动触发频繁刷新,打断用户正常操作
  • 如果不希望自动重载,可以在断开提示中添加手动触发的重载按钮,替换自动刷新的逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 02:06:05