☕ NEW! 完成新手任務即可參加抽獎!LINE 星巴克禮券等你拿,名額有限!        🎉 推廣活動:邀請好友註冊 DevLearn,累積推薦抽 LINE 星巴克禮券! 活動詳情 →        🔥 活動期間 2026/4/1 - 5/31 |已有 0 人參加       
concept-backend 中級

Middleware vs Filter:什麼時候用哪個?

執行順序

HTTP Request 進來
  ↓
Middleware 1(最外層)
  ↓
Middleware 2
  ↓
Middleware 3(路由、認證、授權...)
  ↓
[進入 MVC 管線]
  ↓
  Authorization Filter
  ↓
  Resource Filter(Before)
  ↓
  Action Filter(Before)
  ↓
  Controller Action 執行
  ↓
  Action Filter(After)
  ↓
  Result Filter
  ↓
  Resource Filter(After)
  ↓
[離開 MVC 管線]
  ↓
Middleware 3, 2, 1(反向回程)
  ↓
HTTP Response 出去

關鍵差異

Middleware Filter
作用範圍 所有 Request(包含靜態檔案) 只有 MVC/API Action
能存取什麼 HttpContext ActionContext、ModelState、ActionArguments
適合做什麼 日誌、CORS、壓縮、認證 驗證、授權、快取、例外處理
可以短路嗎 ✅ 不呼叫 next() ✅ 設定 Result
執行順序控制 註冊順序決定 可以設定 Order
可以用 DI 嗎 建構函式注入 支援(用 ServiceFilter)

選擇指南

要處理所有 HTTP 請求? → Middleware
  例:全域日誌、CORS、Response 壓縮、速率限制

只處理 MVC Action? → Filter
  例:模型驗證、授權檢查、Action 計時

需要存取 ModelState? → Filter
需要存取 ActionArguments? → Filter
需要在路由之前執行? → Middleware

實際案例

// Middleware:記錄每個 Request 的時間(包含靜態檔案)
app.Use(async (context, next) => {
    var sw = Stopwatch.StartNew();
    await next();
    Console.WriteLine($"{context.Request.Path} took {sw.ElapsedMilliseconds}ms");
});

// Filter:檢查 Action 的模型是否有效
public class ValidateModelFilter : IActionFilter {
    public void OnActionExecuting(ActionExecutingContext context) {
        if (!context.ModelState.IsValid)
            context.Result = new BadRequestObjectResult(context.ModelState);
    }
    public void OnActionExecuted(ActionExecutedContext context) { }
}

簡單記法:Middleware 管 HTTP 層面,Filter 管 MVC 層面。

💡 大家的想法 · 0

載入中...
💬 即時聊天室 🟢 0 人在線
😀 😎 🤓 💻 🎮 🎸 🔥
➕ 新問題
📋 我的工單
💬 LINE 社群
🔒
需要註冊才能使用此功能
註冊帳號即可解鎖測驗、遊戲、簽到、筆記下載等所有功能,完全免費!
免費註冊