Middleware flow

中介軟體 (Middleware) 流程

Program.cs

1.UseExceptionHandler:捕捉錯誤,並引導到錯誤頁面

  • 穩健性:必須放在最前面,才能捕獲後續所有中介軟體(包括靜態檔案、路由、身份驗證、業務邏輯)拋出的任何未處理異常。

if (app.Environment.IsDevelopment())

{
    // 在開發環境使用詳細的錯誤頁面
   app.UseDeveloperExceptionPage();
}
else
{
    // 給客戶端看的錯誤頁面
   app.UseExceptionHandler(“/Error”);
}

2.UseHttpLogging:紀錄系統各種動作的日誌

  • 可追溯性: 記錄 HTTP 請求和回應的所有細節(標頭、狀態碼等)。這是除錯、性能分析和安全審計的關鍵。

3.UseStaticFiles:可以讀取圖片、CSS、JS 等靜態資源。

  • 性能優化: 必須放在身份驗證和路由之前。如果請求的是 .css.jpg,這個中介軟體直接返回檔案,避免執行耗時的身份驗證或路由匹配,極大地提高了靜態資源的處理效率。

  • app.UseStaticFiles();

4.UseRouting : 設定路由,引導到指定的頁面

  • 流程起點: 它在身份驗證之前執行,因為身份驗證和授權需要知道它們要檢查的是哪個終端點,才能查看該終端點上是否有 [Authorize] 屬性。

  • 導航核心: 根據請求的 URL(例如 /api/users),匹配到對應的終點 (Endpoint)。它只是識別路徑,但不執行終點。

5.UseAuthentication:驗證身分

  • 身分確認: 檢查請求中是否有有效的憑證(例如 Cookie 或 Bearer Token),並建立用戶的身份 Principal。它只確認「你是誰」。

  • 位置必須在授權 之前,因為你必須先知道「使用者是誰」,才能檢查「他能做什麼」。

  • app.UseAuthentication();

6.UseAuthorization:驗證授權

  • 執行檢查: 必須在 UseAuthentication 之後,終端點執行之前,檢查已驗證身份的用戶是否有權限執行被請求的操作或存取該頁面。它檢查「你能做什麼」。
  • app.UseAuthorization();

7.UseWhen:設定條件,進行特定動作。

  • 條件分支: 允許你根據請求的特定條件(例如,只對以 /admin 開頭的路徑執行特定的日誌記錄),插入一段特定的中介軟體邏輯。

app.UseWhen(context => context.Request.Path.StartsWithSegments(“/admin”), appBuilder =>

{
    // 這裡可以放只有 /admin 路徑才需要的特殊Middleware
   appBuilder.Use(async (context, next) =>
   {
       Console.WriteLine($”[ADMIN LOG] 警告:偵測到管理員路徑存取!”);
       await next.Invoke();
   });
});

8.Map(Controllers、CRUD):執行最後邏輯。

  • 業務終點: 這是整個流程的終點,也是應用程式的核心業務邏輯所在。例如,執行控制器 (Controller) 裡面的方法、查詢資料庫等。

app.MapControllers(); // 註冊所有的 API Controller

app.MapRazorPages(); // 註冊所有的 Razor Pages

# Use 通用操作: 允許你插入自定義的、雙向的中介軟體,可以在請求進入和回應離開時都執行操作。

app.Use(async (context, next) =>

{
    await next.Invoke(); // 請求進入處理核心

    // 當響應傳回時,執行以下邏輯:
   if (context.Response.StatusCode == 404)
   {
       Console.WriteLine($”[WARN] 找不到資源的路:{context.Request.Path}”);
   }
});

app.Run();

啟動應用程式的服務容器 (Service Container)

var builder = WebApplication.CreateBuilder(args);

註冊認證服務 

builder.Services.AddAuthentication();

  • 功能啟用: 告訴 DI 容器,我們需要使用認證功能(如 Cookie、JWT Token 等),並配置相關的提供者。

註冊授權服務

builder.Services.AddAuthorization();

  • 功能啟用: 告訴 DI 容器,我們需要使用授權策略(如 Role-Based, Policy-Based),以檢查用戶權限。

註冊日誌記錄服務

builder.Services.AddHttpLogging(options => 

{ … });

  • 配置: 準備好日誌記錄器。配置日誌選項,定義需要記錄哪些請求細節,讓 UseHttpLogging 中介軟體可以執行其職責。

註冊 API 控制器

builder.Services.AddControllers(); 

  • 核心組件: 註冊所有 Web API 控制器,讓系統知道如何處理來自客戶端的 API 請求。

註冊頁面 (Blazor 或 Razor Pages)

builder.Services.AddRazorPages();

  • 核心組件: 註冊所有基於伺服器的頁面渲染組件(Razor Pages 或 Blazor),處理用戶界面的請求。

發佈留言