實現 Application_Start 和 Application_End
阿新 • • 發佈:2020-11-26
# 理解 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 個重要的事件。我們可以在需要的事件上註冊回撥函式。
```csharp
///
/// Triggered when the application host has fully started and is about to wait
/// for a graceful shutdown.
///
CancellationToken ApplicationStarted { get; }
///
/// Triggered when the application host is performing a graceful shutdown.
/// Requests may still be in flight. Shutdown will block until this event completes.
///
CancellationToken ApplicationStopping { get; }
///
/// 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.
///
CancellationToken ApplicationStopped { get; }
```
[在 GitHub 中檢視 IApplicationLifetime 原始碼](https://github.com/dotnet/aspnetcore/blob/release/5.0/src/Hosting/Abstractions/src/IApplicationLifetime.cs)
IApplicationLifetime 同樣可以通過注入而使用,例如,我們可以在 Configure() 方法中注入並使用該物件。
```csharp
public void Configure(IApplicationBuilder app,
Microsoft.Extensions.Hosting.IHostApplicationLifetime applicationLifetime,
ILoggerFactory loggerFactory)
{
// use applicationLifetime
}
```
使用注入的物件註冊,這裡註冊了服務啟動和停止事件。
```csharp
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;
}
}
```
見:https://stackoverflow.com/questions/41675577/where-can-i-log-an-asp-net-core-apps-start-stop-error-events
需要注意的是,這裡的事件沒有使用 EventHandler,而是使用了 CancellationToken,原因是 CancellationToken 支援在多執行緒情況下使用。