优雅地停止 ASP.NET Core Web App(从 Visual Studio 调试器中),一个与 IHostedService 相关的问题

bok*_*beg 8 c# visual-studio-2017 asp.net-core-2.1 asp.net-core-hosted-services

我对 ASP.NET Core 完全陌生,所以我可能在 50 英里之外遗漏了一些东西,因为我在这上面花了 3 个小时无济于事。

我在 VS 2017 中制作了一个 Web 应用程序,由 Kestrel 托管,它在 IIS Express 下运行(当你创建一个新的 Web 应用程序时,这是所有默认设置)。当我按 F5 时,应用程序启动,我的 Chrome 浏览器打开,我看到“hello world”式的输出。当我关闭此浏览器窗口时,应用程序终止。

现在,我需要在后台执行一些任务,并且需要这些任务具有清理逻辑 - 我发现这IHostedService允许我执行此操作。

该文件指出:

当您注册 IHostedService 时,.NET Core 将分别在应用程序启动和停止期间调用 IHostedService 类型的 StartAsync() 和 StopAsync() 方法。

我已经做好了:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHostedService<MyBackgroundService>();
}
Run Code Online (Sandbox Code Playgroud)

服务按预期启动,一切正常。极其简单的东西。但它永远不会停止,至少不会优雅地停止。

当我关闭那个自动启动的浏览器窗口时,我的应用程序也随之关闭,但是我的IHostedService服务中的这个方法:

public Task StopAsync(CancellationToken cancellationToken)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

永远不会被调用。

我已经尝试了文档中提供示例,它显示了相同的问题 - 在 VS 中尝试时从未完成清理。

我注意到来自名为“ASP.NET Core Web Server”的输出通道的特殊信息:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHostedService<MyBackgroundService>();
}
Run Code Online (Sandbox Code Playgroud)

这显然是来自控制台的一些重定向,因为这个应用程序首先似乎是一个控制台应用程序。所以我想知道 VS 是否通过看似对我隐藏了控制台来阻止我正常关闭我的应用程序?

我还注意到一个小的 IIS Express 托盘图标,它列出了我运行过的所有应用程序,并且它有一个似乎没有任何作用的停止按钮。我假设 IIS Express 在这里只是充当某种代理。

我傻眼了,尤其是因为我似乎是唯一遇到这个问题的人。

如何正确终止我的 Web 应用程序?

bok*_*beg 5

我找到了解决办法。首先,我要引用自己的话:

我还注意到一个小的 IIS Express 托盘图标,它列出了我运行过的所有应用程序,并且它有一个似乎没有任何作用的停止按钮。我假设 IIS Express 在这里只是充当某种代理。

实际上,有一种方法可以优雅地停止托管在 IIS Express 下的 Kestrel 应用程序(这是 VS 中的默认选项)。

显然,我的 IIS Express 有一个......“hickup”,并且停止命令不起作用 - 没有错误消息,只是什么也没发生。关闭所有 VS 实例并在任务管理器中杀死 dotnet.exe 进程后,我再次打开了解决方案,终于能够停止该应用程序。


Mif*_*ifo 5

我正在添加一个“答案”来补充@bokibeg 给出的答案。要停止在 Visual Studio 2019 中的 iis 中运行的项目,请转到系统托盘并右键单击 iis express 图标。然后选择正在运行的项目。将弹出一个带有停止站点按钮的菜单。 在此处输入图片说明