8

我对 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>();
}

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

当我关闭该自动启动的浏览器窗口时,我的应用程序也会随之关闭,但我的IHostedService服务中有此方法:

public Task StopAsync(CancellationToken cancellationToken)
{
    ...
}

永远不会被调用。

我已经尝试过文档中提供的示例,但它表现出同样的问题——当我在 VS 中尝试时,清理工作从未完成。

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

BackgroundTasksSample> Application started. Press Ctrl+C to shut down.

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

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

我傻眼了,特别是因为我似乎是唯一一个有这个问题的人。

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

4

2 回答 2

5

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

于 2020-03-23T17:14:43.767 回答
5

我找到了解决方案。首先,我将引用自己:

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

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

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

于 2019-04-04T09:25:52.593 回答