优雅地停止ASP.NET Core Web App(从Visual Studio调试器中),这是一个与IHostedService相关的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优雅地停止ASP.NET Core Web App(从Visual Studio调试器中),这是一个与IHostedService相关的问题相关的知识,希望对你有一定的参考价值。
我对ASP.NET Core是全新的,所以我可能错过了50英里的东西,因为我花了3个小时就此无济于事。
我在VS 2017中创建了一个Web应用程序,由Kestrel托管,在IIS Express下运行(当您创建一个新的Web应用程序时,它都是默认的)。当我按下F5应用程序启动时,我的Chrome浏览器打开,我看到'hello world'-esque输出。当我关闭此浏览器窗口时,应用终止。
现在,我需要在后台进行一些任务,我需要这些任务来清理逻辑 - 我发现IHostedService
允许我这样做。
文件说明:
注册IHostedService时,.NET Core将分别在应用程序启动和停止期间调用IHostedService类型的StartAsync()和StopAsync()方法。
我已经做好了:
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<MyBackgroundService>();
}
服务按预期开始,一切都很好。非常简单的东西。但它永远不会停止,至少不会优雅。
当我关闭自动启动的浏览器窗口时,我的应用程序随之关闭但在我的IHostedService
服务中使用此方法:
public Task StopAsync(CancellationToken cancellationToken)
{
...
}
永远不会被称为。
我已经尝试了example provided in documentation并且它展示了同样的问题 - 当我在VS中尝试时,清理工作从未完成。
我注意到一个名为“ASP.NET Core Web Server”的输出通道的特殊信息:
BackgroundTasksSample> Application started. Press Ctrl+C to shut down.
这显然是从控制台重定向,因为这个应用程序似乎首先是一个控制台应用程序。所以我想知道VS是否是,似乎隐藏了我的控制台,阻止我执行我的应用程序的优雅关闭?
我还注意到一个小的IIS Express托盘图标,其中列出了我运行的任何应用程序,并且它有一个似乎没有做任何事情的停止按钮。我假设IIS Express在这里只是作为某种代理。
我傻眼了,特别是因为我似乎是唯一有这个问题的人。
如何正确终止我的Web应用程序?
我找到了解决方案。首先,我要引用自己的话:
我还注意到一个小的IIS Express托盘图标,其中列出了我运行的任何应用程序,并且它有一个似乎没有做任何事情的停止按钮。我假设IIS Express在这里只是作为某种代理。
实际上,正确的方法是优雅地停止在IIS Express下托管的Kestrel应用程序(这是VS中的默认选项)。
显然,我的IIS Express有一个......“hickup”,并且Stop命令不起作用 - 没有错误信息,根本没有发生任何事情。关闭所有VS实例并在任务管理器中杀死dotnet.exe进程后,我再次打开了解决方案,最终能够停止应用程序。
以上是关于优雅地停止ASP.NET Core Web App(从Visual Studio调试器中),这是一个与IHostedService相关的问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 ASP.NET Core 6 Minimal API 在 Azure 中停止 Web 应用程序时未调用 BackgroundService StopAsync
在 Asp.Net Core App 中访问 Web.config 设置?
在 Azure 上部署 Asp.NET Core Web App