Изящная остановка ASP.NET Core Web App (из отладчика Visual Studio), вопрос, связанный с IHostedService - PullRequest
1 голос
/ 03 апреля 2019

Я совершенно новичок в ASP.NET Core, поэтому, возможно, мне чего-то не хватает на 50 миль, потому что я потратил 3 часа на это безрезультатно.

Я создал веб-приложение из VS 2017, размещенное на Kestrel, которое работает под управлением IIS Express (все это по умолчанию при создании нового веб-приложения). Когда я нажимаю F5, приложение запускается, открывается мой браузер Chrome, и я вижу вывод «Привет, мир». Когда я закрываю это окно браузера, приложение закрывается.

Теперь мне нужны некоторые задачи, выполняемые в фоновом режиме, и мне нужно, чтобы эти задачи имели логику очистки - я обнаружил, что IHostedService позволяет мне это делать.

В документации указано:

Когда вы регистрируете IHostedService, .NET Core вызывает методы StartAsync () и StopAsync () вашего типа IHostedService во время запуска и остановки приложения соответственно.

Я сделал:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHostedService<MyBackgroundService>();
}

И служба запускается как положено, все хорошо. Чрезвычайно простые вещи. Но это никогда не останавливается, по крайней мере, изящно.

Когда я закрываю это автоматически запускаемое окно браузера, мое приложение закрывается вместе с ним, но этот метод в моей службе IHostedService:

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

никогда не вызывается.

Я попробовал пример , приведенный в документации , и он показывает ту же проблему - очистка никогда не выполняется, когда я пробую его в VS.

Я заметил необычную информацию из выходного канала под названием «Базовый веб-сервер ASP.NET»:

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

Это, очевидно, некоторое перенаправление с консоли, так как это приложение в первую очередь выглядит как консольное приложение. Так что мне интересно, не мешает ли VS, по-видимому, скрыть от меня консоль и помешать мне выполнить корректное завершение работы моего приложения?

Я также заметил небольшую иконку в трее IIS Express, на которой перечислены все запущенные мной приложения, а также кнопка «Стоп», которая, похоже, ничего не делает. Я предполагаю, что IIS Express здесь просто действует как своего рода прокси.

Я ошеломлен, тем более что я, кажется, единственный, у кого есть эта проблема.

Как мне правильно завершить мое веб-приложение?

1 Ответ

1 голос
/ 04 апреля 2019

Я нашел решение. Сначала я процитирую себя:

Я также заметил небольшую иконку в трее IIS Express, на которой перечислены все запущенные мной приложения, а также кнопка «Стоп», которая, похоже, ничего не делает. Я предполагаю, что IIS Express здесь просто действует как своего рода прокси.

На самом деле именно так и есть способ элегантно остановить ваше приложение Kestrel, которое размещено в IIS Express (это опция по умолчанию в VS).

По-видимому, в моем IIS Express произошла ... "ошибка", и команда Stop не работала - сообщения об ошибке не было, просто ничего не произошло. После закрытия всех экземпляров VS и уничтожения процесса dotnet.exe в диспетчере задач я снова открыл решение и, наконец, смог остановить приложение.

...