.NET Core 中的中間件(Middleware)詳解

什麼是中間件?

在 .NET Core 應用程序中,中間件是一系列組件,它們形成了一個請求處理管道。每個中間件都可以:

  1. 處理傳入的 HTTP 請求
  2. 處理傳出的 HTTP 響應
  3. 呼叫管道中的下一個中間件
  4. 在管道中的下一個中間件完成處理後執行某些操作

中間件的概念類似於一條組裝線,每個工人(中間件)都對產品(請求/響應)進行某些操作。

中間件的工作原理

中間件在 .NET Core 應用程序中按照特定的順序執行。這個順序很重要,因為它決定了哪個中間件先處理請求,以及響應如何被處理。

工作流程如下:

  1. 當應用程序接收到 HTTP 請求時,請求進入中間件管道。
  2. 每個中間件組件可以:
    • 執行一些操作
    • 將請求傳遞給下一個中間件
    • 或者短路請求(不再傳遞給後續中間件)
  3. 一旦請求到達管道的末端,它會開始返回。
  4. 響應會再次通過所有中間件,讓每個中間件有機會處理或修改響應。

這個過程可以用下面的示意圖來表示:

1
2
Request → Middleware 1 → Middleware 2 → Middleware 3 → Application Logic
Response ← Middleware 1 ← Middleware 2 ← Middleware 3 ← Application Logic

常見的中間件

.NET Core 提供了許多內建的中間件,以下是一些常見的例子:

  1. 認證中間件: 處理用戶認證,確保只有授權的用戶可以訪問某些資源。

  2. CORS中間件: 處理跨源資源共享(CORS),允許或限制來自不同域的請求。

  3. 靜態文件中間件: 處理靜態文件的請求,如 HTML、CSS、JavaScript 和圖片等。

  4. 路由中間件: 根據 URL 將請求導向正確的控制器和操作。

  5. 異常處理中間件: 捕獲並處理應用程序中發生的異常。

  6. 響應壓縮中間件: 壓縮響應以減少傳輸的數據量,提高性能。

如何使用中間件

在 .NET Core 應用程序中,中間件通常在 Startup.cs 文件的 Configure 方法中配置。以下是一個簡單的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}

在這個例子中,我們可以看到幾個常見中間件的使用,它們按照特定的順序添加到請求處理管道中。

自定義中間件

除了使用內建的中間件,開發者還可以創建自定義的中間件來滿足特定的需求。自定義中間件通常包含:

  1. 一個公共構造函數,帶有一個類型為 RequestDelegate 的參數。
  2. 一個名為 InvokeInvokeAsync 的公共方法,返回一個 Task

以下是一個簡單的自定義中間件示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SimpleMiddleware
{
private readonly RequestDelegate _next;

public SimpleMiddleware(RequestDelegate next)
{
_next = next;
}

public async Task InvokeAsync(HttpContext context)
{
// 在請求處理之前的邏輯
await _next(context);
// 在請求處理之後的邏輯
}
}

結論

中間件是 .NET Core 應用程序中非常強大和靈活的組件。通過理解和正確使用中間件,開發者可以更好地控制請求處理流程,實現諸如認證、日誌記錄、異常處理等功能,從而構建更加健壯和高效的應用程序。

在設計 .NET Core 應用程序時,合理安排中間件的順序和選擇適當的中間件組合是非常重要的。這不僅會影響應用程序的功能,還會影響其性能和可維護性。