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

如何无中断部署Blazor Server新版本并保留现有会话内存状态?

Blazor Server 部署新版本保留会话(Circuit)状态的可行方案

Blazor Server 的会话状态默认绑定到当前运行的w3wp进程内存中,你需要的效果可以通过两种路径实现,分别对应无代码改动和彻底解决的场景:


方案1:IIS 重叠回收(无代码改动,优先推荐)

IIS 应用池的默认重叠回收机制完全匹配你的需求:触发回收时会先启动新进程处理所有新请求,旧进程会持续运行直到所有现有Circuit会话全部断开后再退出,完全不影响正在使用系统的用户。
你只需要确认以下配置即可:

  • 打开IIS管理器,找到对应环境的应用程序池,右键选择「高级设置」
  • 确认禁用重叠回收选项值为 False(系统默认就是False,没改过不用动)
  • 按需调整「进程模型 -> 空闲超时(分钟)」和「回收 -> 常规时间间隔(分钟)」,避免会话被提前回收
  • 部署时直接覆盖站点目录的文件即可,IIS检测到web.config变更会自动触发重叠回收,现有会话会在旧进程中正常运行直到用户主动关闭页面/会话超时,新请求全部进入新进程运行新版本代码

方案2:持久化会话状态(彻底解决进程重启丢失问题)

如果你的场景需要做到就算服务器意外崩溃、手动重启进程也不丢失会话状态,可以把Circuit状态从进程内存迁移到持久化存储中:

2.1 业务状态独立存储

把所有需要保留的业务状态不要存在组件的私有字段/属性中,统一存入分布式缓存、数据库等独立存储,组件初始化/会话重连时自动从存储中加载状态:

// 配置Blazor会话保留时长
builder.Services.AddServerSideBlazor(options =>
{
    // 断开后保留会话的最大数量
    options.DisconnectedCircuitMaxRetained = 200;
    // 断开后会话最多保留3分钟
    options.DisconnectedCircuitRetentionPeriod = TimeSpan.FromMinutes(3);
});

2.2 启用Circuit状态持久化

.NET 6 及以上版本支持直接序列化整个Circuit状态存入分布式缓存,进程重启后用户重连即可恢复完整会话:

// 首先配置分布式缓存,示例用Redis,也可以用数据库实现
builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = "你的Redis连接地址";
    options.InstanceName = "BlazorSession_";
});

// 启用Circuit持久化
builder.Services.AddServerSideBlazor()
    .AddCircuitOptions(options =>
    {
        options.StatePersistence = CircuitStatePersistence.Persisted;
    });

生产部署注意事项

  • 提前在staging环境验证重叠回收逻辑,确认旧会话不会被强制中断、新旧版本兼容
  • 静态资源更新建议加哈希后缀,避免旧会话加载新版本静态资源出现兼容性问题
  • 如果有接口、数据结构的不兼容变更,提前做好新旧版本兼容逻辑,避免旧会话调用接口报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:45:06