События отслеживания запуска и остановки приложения ASP.NET Core

IApplicationLifetime — это новый интерфейс в ASP.NET Core. С его помощью можно корректно обрабатывать моменты запуска и завершения ASP.NET приложения.

Интерфейс определен следующим образом:

namespace Microsoft.AspNetCore.Hosting
{
  public interface IApplicationLifetime
  {
    CancellationToken ApplicationStarted { get; }

    CancellationToken ApplicationStopping { get; }

    CancellationToken ApplicationStopped { get; }

    void StopApplication();
  }
}

Интерфейс по умолчанию пристутствует в DI-контейнере, поэтому его можно инжектировать в том месте, где это необходимо, например в классе Startup:

public class Startup
{
  public void Configure(IApplicationBuilder app,
                        IHostingEnvironment env,
                        IApplicationLifetime applicationLifetime,
                        ILoggerFactory loggerFactory)
  {
  }
}

Или в контроллере:

public class HomeController : Controller
{
  public HomeController(IApplicationLifetime applicationLifetime)
  {
  }

IApplicationLifetime содержит три свойства CancellationToken:

  • ApplicationStarted − срабатывает когда хост приложения полностью запущен.
  • ApplicationStopping − срабатывает когда хост приложения инициирует процедуру завершения. В этот момент запросы от пользователей могут всё ещё обрабатываться.
  • ApplicationStopped − срабатывает после завершения приложения. В этот момент все запросы от пользователей обработаны.

Используя CancellationToken можно зарегистрировать обработчик:

public class Startup
{
  public void Configure(IApplicationBuilder app,
                        IHostingEnvironment env,
                        IApplicationLifetime applicationLifetime,
                        ILoggerFactory loggerFactory)
  {
    applicationLifetime.ApplicationStarted.Register(OnApplicationStarted);
    applicationLifetime.ApplicationStopping.Register(OnApplicationStopping);
    applicationLifetime.ApplicationStopped.Register(OnApplicationStopped);
  }

  protected void OnApplicationStarted()
  {
  }

  protected void OnApplicationStopping()
  {
  }

  protected void OnApplicationStopped()
  {
  }
}

ApplicationStopping и ApplicationStopped блокируют дальнейшее завершение приложения до тех пор, пока не исполнен обработчик.

Дополнительно IApplicationLifetime имеет метод StopApplication(). С его помощью можно инициировать процесс завершения приложения.

public class HomeController : Controller
{
  private readonly IApplicationLifetime _applicationLifetime;

  public HomeController(IApplicationLifetime applicationLifetime)
  {
    _applicationLifetime = applicationLifetime;
  }

  public IActionResult Shutdown()
  {
    _applicationLifetime.StopApplication();
    return View();
  }