ASP.NET Core 3.0+ 必须使用 IHostApplicationLifetime,因 IApplicationLifetime 已被移除;它适用于所有 Generic Host 场景,其 ApplicationStarted、Stopping、Stopped 三阶段有明确触发时机和资源清理约束。
IHostApplicationLifetime 而不是 IApplicationLifetime
ASP.NET Core 3.0+ 已彻底移除 IApplicationLifetime,所有新项目必须用 IHostApplicationLifetime。如果你在升级旧项目时发现 IApplicationLifetime 注入失败或类型找不到,不是配置问题,而是它已被废弃——直接换为 IHostApplicationLifetime 即可。
这个接口由 HostBuilder 创建的 IHost 提供,适用于所有基于 Generic Host 的场景(Web、Worker Service、Console Host),不局限于 Web 应用。
IHostApplicationLifetime.ApplicationStarted 在应用真正就绪、中间件链已构建完成、监听器已启动后触发(此时 HTTP 请求可被接收)IHostApplicationLifetime.ApplicationStopping 在收到终止信号(如 Ctrl+C、dotnet stop、K8s SIGTERM)后立即触发,但仍在处理已有请求IHostApplicationLifetime.ApplicationStopped 在所有 ApplicationStopping 回调执行完毕、所有 IAsyncDisposable 资源释放完成后才触发ApplicationStopping 里能安全做哪些事?不能做哪些事?这是最容易出错的阶段:你以为还有足够时间清理,其实没有。
CancellationTokenSource、关闭自定义后台任务、记录日志、调用 await _httpClient.PostAsync(...)(但必须设超时)Task.Wait())、调用未设超时的同步网络请求、写入未缓冲的文件流(可能卡住)、依赖其他正在销毁的 Scoped 服务(它们可能已 Disposed)ApplicationStopping 的 CancellationToken 会在超时(默认 5 秒)后强制触发 ApplicationStopped,不会等你手动完成public class GracefulShutdownService : IHostedService
{
private readonly IHostApplicationLifetime _lifetime;
private readonly ILogger _logger;
public GracefulShutdownService(IHostApplicationLifetime lifetime, ILogger logger)
{
_lifetime = lifetime;
_logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_lifetime.ApplicationStopping.Register(OnStopping);
return Task.CompletedTask;
}
private void OnStopping()
{
_logger.LogInformation("Application is stopping. Initiating graceful shutdown...");
// ✅ 正确:用独立 token 控制超时,避免拖垮整个生命周期
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(3));
try
{
_cleanupTask?.Wait(cts.Token); // 假设 cleanupTask 是一个可等待的清理任务
}
catch (OperationCanceledException)
{
_logger.LogWarning("Cleanup timed out.");
}
}
public Task StopAsync(CancellationToken canc
ellationToken) => Task.CompletedTask;
}
ApplicationStarted 里获取 IServiceScope 很危险?因为此时 DI 容器虽已构建完成,但 Scoped 生命周期的服务尚未被任何请求激活,IServiceScope 的创建和释放机制还未进入常规轨道。强行在这里解析 Scoped 服务,可能导致:
DbContext)提前初始化并持有连接,而后续请求可能复用或冲突HttpContext 的服务(如 IUrlHelper)抛出 InvalidOperationException: No service for type 'Microsoft.AspNetCore.Http.HttpContext' has been registered.
正确做法是:只在 ApplicationStarted 中触发「无依赖」的初始化逻辑(如预热缓存、加载配置快照),或改用 IHostedService.StartAsync —— 它在相同时机执行,但明确支持依赖注入和作用域管理。
ApplicationStopping 不触发的常见原因Kubernetes 或 Docker 默认发送的是 SIGTERM,但 .NET 进程若未正确注册信号处理器,或被包装脚本拦截,会导致 ApplicationStopping 完全不执行。
dotnet YourApp.dll,而非 sh -c "dotnet..." 等间接调用(会丢失信号传递)DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 —— 极少数情况下会影响信号注册(罕见,但值得排查)STOPSIGNAL SIGTERM,并确保 docker stop 使用默认超时(10 秒),给 ApplicationStopping 留出时间Program.cs 开头加日志验证信号捕获:Console.CancelKeyPress += (s, e) =>
{
Console.WriteLine("CancelKeyPress received");
e.Cancel = true; // 防止进程立即退出,让 Host 自己处理
};最隐蔽的问题是:你在 ApplicationStopping 里 await 了一个没设超时的异步操作,而容器平台只等 10 秒就发 SIGKILL —— 此时回调看似“没执行”,其实是执行了一半就被强杀了。
# linux
# docker
# 处理器
# app
# ai
# microsoft
# kubernetes
# c#
# 作用域
# .net
# 为什么
# 中间件
# for
# 接口
# Generic
# console
# 异步
# 数据库
# http
# 你在
# 已被
# 适用于
# 回调
# 移除
# 的是
# 是一个
# 这是
# 在这里
# 什么时候
相关文章:
建站之星后台密码遗忘或太弱?如何重置与强化?
如何快速生成可下载的建站源码工具?
C#如何在一个XML文件中查找并替换文本内容
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
图册素材网站设计制作软件,图册的导出方式有几种?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
建站之星安装后界面空白如何解决?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
装修招标网站设计制作流程,装修招标流程?
建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析
建站之星收费标准详解:套餐费用及年费价格表一览
成都响应式网站开发,dw怎么把手机适应页面变成网页?
如何快速搭建个人网站并优化SEO?
免费网站制作appp,免费制作app哪个平台好?
如何零成本快速生成个人自助网站?
如何获取PHP WAP自助建站系统源码?
婚礼视频制作网站,学习*后期制作的网站有哪些?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
移民网站制作流程,怎么看加拿大移民官网?
Swift中switch语句区间和元组模式匹配
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
如何用景安虚拟主机手机版绑定域名建站?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
如何快速使用云服务器搭建个人网站?
网站制作模板下载什么软件,ppt模板免费下载网站?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
如何在景安云服务器上绑定域名并配置虚拟主机?
北京网站制作公司哪家好一点,北京租房网站有哪些?
如何在建站之星绑定自定义域名?
如何制作一个表白网站视频,关于勇敢表白的小标题?
b2c电商网站制作流程,b2c水平综合的电商平台?
建站主机如何选?性能与价格怎样平衡?
定制建站流程步骤详解:一站式方案设计与开发指南
如何制作网站标识牌,动态网站如何制作(教程)?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
如何通过cPanel快速搭建网站?
定制建站价位费用解析与套餐推荐全攻略
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
宝塔建站助手安装配置与建站模板使用全流程解析
如何通过商城自助建站源码实现零基础高效建站?
如何通过虚拟主机快速完成网站搭建?
开封网站制作公司,网络用语开封是什么意思?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
*请认真填写需求信息,我们会在24小时内与您取得联系。