优雅地停止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

使用ASP.NET CORE SignalR实现APP扫描登录

如何优雅地关闭 ASP.Net(非核心)

使用 MSAL 保护 ASP.Net Core Web API 和 Angular App