首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET MVC Action Filter 全解析:分類、執行順序與 OutputCache 實戰

     編輯:關於ASP.NET

Filter 是 MVC 橫切關注點的核心機制。本文系統梳理四大 Filter 類型、執行順序,並以 OutputCache 為例演示快取實戰與常見誤區。

四大 Filter 類型與執行順序

順序類型介面典型屬性用途
1Authorization FilterIAuthorizationFilter[Authorize], [RequireHttps]身分驗證、授權、SSL 強制
2Action FilterIActionFilter[HandleError], 自定義Action 前/後邏輯(日誌、效能監控)
3Result FilterIResultFilter[OutputCache]結果執行前/後(快取、壓縮、修改 ViewData)
4Exception FilterIExceptionFilter[HandleError]全域/局部異常捕獲、記錄、友善錯誤頁

關鍵原則:Authorization → Action → Result → Exception。同類型多個 Filter 依註冊順序執行(全域 → Controller → Action)。

OutputCache 實戰與陷阱

[OutputCache(Duration=20, VaryByParam="")]
public string Index() { return DateTime.Now.ToString(); }
  • Duration:快取秒數(伺服器端記憶體快取)。
  • VaryByParam:依查詢字串/表單參數區分快取版本。設為空字串 "" 表示忽略所有參數;切勿用 "*"(會為每個參數組合建立快取條目,導致記憶體洩漏)。
  • Location:Server(預設)、Client、Downstream、None。
  • NoStore=true:發送 Cache-Control: no-store,禁止任何快取(敏感資料必設)。

自定義 Action Filter 範本

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) { /* 結果後 */ }
}

註冊方式三選一

  1. 屬性裝飾:[LogActionFilter] 於 Action/Controller
  2. 全域註冊:GlobalFilters.Filters.Add(new LogActionFilter())(Global.asax)
  3. 依賴注入:FilterProviders.Providers.Add(new InjectionFilterProvider(container))

避坑提醒

  • OutputCache 快取的是 完整響應輸出,包含 HTML、Header。若頁面有用戶專屬內容(如「歡迎 XXX」),必須用 VaryByCustom 或移至 Client 快取。
  • 子動作(Html.Action)的 OutputCache 獨立於主頁快取。
  • 異常發生時,Exception Filter 執行後,Result Filter 不會 執行(除非異常被處理並返回正常結果)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved