中介軟體 (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();
服務註冊 (Services Registration)
啟動應用程式的服務容器 (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),處理用戶界面的請求。