如何在Blazor Server服务关闭前执行指定的Checksum()方法?
Blazor Server 服务端关闭前执行
Checksum()方法的实现方案 正确实现逻辑
使用IHostApplicationLifetime的ApplicationStopping令牌即可实现需求,该令牌是.NET通用主机提供的标准应用生命周期回调,会在服务端触发优雅关闭流程时优先执行,覆盖服务端主动关闭、应用池回收、正常进程停止等全场景。
完整代码示例(.NET 6+ 顶层语句 Program.cs)
情况1:Checksum为静态方法
var builder = WebApplication.CreateBuilder(args); // 原有Blazor Server服务注册逻辑保留 builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(); var app = builder.Build(); // 注册应用停止回调 var lifetime = app.Services.GetRequiredService<IHostApplicationLifetime>(); lifetime.ApplicationStopping.Register(() => { // 执行校验和方法 Checksum(); }); // 原有中间件配置逻辑保留 app.UseStaticFiles(); app.UseRouting(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); app.Run();
情况2:Checksum封装在DI容器的服务中
如果你的校验和逻辑需要依赖其他注入服务,需要手动创建作用域获取服务实例:
lifetime.ApplicationStopping.Register(() => { // 创建DI作用域避免生命周期错误 using var scope = app.Services.CreateScope(); var checksumService = scope.ServiceProvider.GetRequiredService<IChecksumService>(); checksumService.Checksum(); });
之前实现未生效的常见原因
- 调试方式错误:Visual Studio默认的「停止调试」操作会直接强制终止进程,跳过优雅关闭流程,因此断点不会命中。测试时请用
dotnet run命令启动项目,在启动的控制台窗口按下Ctrl + C触发优雅关闭,即可触发回调。 - 异步方法未等待:如果你的
Checksum()是异步实现,必须在回调内同步等待执行完成,否则进程会在方法执行完前退出,示例:ChecksumAsync().Wait(); - 生命周期不匹配:
Circuit是单用户会话的生命周期,仅对应用户连接断开场景,和整个服务端应用的生命周期无关,因此无法满足需求。
补充说明
只有优雅关闭场景会触发该回调,强制结束进程(比如任务管理器杀进程、服务器断电)不会触发,这是操作系统层面的限制,所有应用层逻辑都无法规避。部署到IIS、Docker等环境时,平台的标准停止操作(比如IIS应用池回收、docker stop命令)都会触发优雅关闭流程,回调可正常执行。
内容的提问来源于stack exchange,提问作者MAERT
相关产品推荐
相关产品推荐

