理解 ASP.NET Core: 實現 Application_Start 和 Application_End
在 ASP.NET 中兩個常用的處理節點是 Application_Start() 和 Application_End(),它是在第一個請求到達網站的時候被執行和網站停止服務的時候被執行。通常用來進行網站的初始化處理和網站的掃尾處理。
在 ASP.NET Core 中沒有了默認的請求處理管道,也沒有了 Global.asax,怎樣處理這兩個事件呢?
在中間件中並不方便處理,中間件將在每個請求到達服務器的時候處理。
這需要通過 ASP.NET Core 的應用程序生命周期來管理。
在 ASP.NET Core 中,網站作為 Host 中寄宿的一個服務,服務使用一個生命周期管理對象 IApplicationLifetime 暴露其生命周期。該對象提供了 3 個重要的事件。我們可以在需要的事件上注冊回調函數。
/// <summary>
/// Triggered when the application host has fully started and is about to wait
/// for a graceful shutdown.
/// </summary>
CancellationToken ApplicationStarted { get; }
/// <summary>
/// Triggered when the application host is performing a graceful shutdown.
/// Requests may still be in flight. Shutdown will block until this event completes.
/// </summary>
CancellationToken ApplicationStopping { get; }
/// <summary>
/// Triggered when the application host is performing a graceful shutdown.
/// All requests should be complete at this point. Shutdown will block
/// until this event completes.
/// </summary>
CancellationToken ApplicationStopped { get; }
在 GitHub 中查看 IApplicationLifetime 源碼
IApplicationLifetime 同樣可以通過注入而使用,例如,我們可以在 Configure() 方法中注入並使用該對象。
public void Configure(IApplicationBuilder app,
Microsoft.Extensions.Hosting.IHostApplicationLifetime applicationLifetime,
ILoggerFactory loggerFactory)
{
// use applicationLifetime
}
使用注入的對象注冊,這里注冊了服務啟動和停止事件。
public class Startup
{
private ILogger _logger;
public void Configure(
IApplicationBuilder app,
Microsoft.Extensions.Hosting.IHostApplicationLifetime applicationLifetime,
ILoggerFactory loggerFactory)
{
applicationLifetime.ApplicationStarted.Register(OnStartup);
applicationLifetime.ApplicationStopping.Register(OnShutdown);
...
// add logger providers
// loggerFactory.AddConsole()
...
_logger = loggerFactory.CreateLogger("StartupLogger");
}
private void OnStartup()
{
}
private void OnShutdown()
{
// use _logger here;
}
}
需要注意的是,這里的事件沒有使用 EventHandler,而是使用了 CancellationToken,原因是 CancellationToken 支持在多線程情況下使用。