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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:36:01