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 应用程序?
我找到了解决办法。首先,我要引用自己的话:
我还注意到一个小的 IIS Express 托盘图标,它列出了我运行过的所有应用程序,并且它有一个似乎没有任何作用的停止按钮。我假设 IIS Express 在这里只是充当某种代理。
实际上,有一种方法可以优雅地停止托管在 IIS Express 下的 Kestrel 应用程序(这是 VS 中的默认选项)。
显然,我的 IIS Express 有一个......“hickup”,并且停止命令不起作用 - 没有错误消息,只是什么也没发生。关闭所有 VS 实例并在任务管理器中杀死 dotnet.exe 进程后,我再次打开了解决方案,终于能够停止该应用程序。