Filter 是 MVC 橫切關注點的核心機制。本文系統梳理四大 Filter 類型、執行順序,並以 OutputCache 為例演示快取實戰與常見誤區。
| 順序 | 類型 | 介面 | 典型屬性 | 用途 |
|---|---|---|---|---|
| 1 | Authorization Filter | IAuthorizationFilter | [Authorize], [RequireHttps] | 身分驗證、授權、SSL 強制 |
| 2 | Action Filter | IActionFilter | [HandleError], 自定義 | Action 前/後邏輯(日誌、效能監控) |
| 3 | Result Filter | IResultFilter | [OutputCache] | 結果執行前/後(快取、壓縮、修改 ViewData) |
| 4 | Exception Filter | IExceptionFilter | [HandleError] | 全域/局部異常捕獲、記錄、友善錯誤頁 |
關鍵原則:Authorization → Action → Result → Exception。同類型多個 Filter 依註冊順序執行(全域 → Controller → Action)。
[OutputCache(Duration=20, VaryByParam="")]
public string Index() { return DateTime.Now.ToString(); }
Duration:快取秒數(伺服器端記憶體快取)。VaryByParam:依查詢字串/表單參數區分快取版本。設為空字串 "" 表示忽略所有參數;切勿用 "*"(會為每個參數組合建立快取條目,導致記憶體洩漏)。Location:Server(預設)、Client、Downstream、None。NoStore=true:發送 Cache-Control: no-store,禁止任何快取(敏感資料必設)。public class LogActionFilter : ActionFilterAttribute {
public override void OnActionExecuting(ActionExecutingContext filterContext) {
// Action 前:記錄參數、IP、用戶
Log.Debug($"Action {filterContext.ActionDescriptor.ActionName} 開始");
}
public override void OnActionExecuted(ActionExecutedContext filterContext) {
// Action 後:記錄耗時、結果、例外
Log.Debug($"Action 結束,耗時 {sw.ElapsedMs}ms");
}
public override void OnResultExecuting(ResultExecutingContext filterContext) { /* 結果前 */ }
public override void OnResultExecuted(ResultExecutedContext filterContext) { /* 結果後 */ }
}
[LogActionFilter] 於 Action/ControllerGlobalFilters.Filters.Add(new LogActionFilter())(Global.asax)FilterProviders.Providers.Add(new InjectionFilterProvider(container))OutputCache 快取的是 完整響應輸出,包含 HTML、Header。若頁面有用戶專屬內容(如「歡迎 XXX」),必須用 VaryByCustom 或移至 Client 快取。Html.Action)的 OutputCache 獨立於主頁快取。