如何无中断部署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
相关产品推荐
相关产品推荐

