在 ASP.NET MVC 的四大過濾器類型中,ActionFilter 直接應用於 Action 方法,能在目標方法執行前後攔截調用以執行額外操作。這是典型的 AOP(面向切面程式設計)實現方式,適合處理橫切關注點,如日誌記錄、效能監控、交易管理等。本文將深入探討多個 ActionFilter 應用於同一 Action 方法時的執行順序與機制。
所有 ActionFilter 必須實作 IActionFilter 介面,定義兩個關鍵方法:
public interface IActionFilter
{
void OnActionExecuting(ActionExecutingContext filterContext);
void OnActionExecuted(ActionExecutedContext filterContext);
}
ActionExecutingContext:繼承自 ControllerContext,包含 ActionDescriptor(Action 描述)、ActionParameters(參數字典)與 Result(回應結果)。在 OnActionExecuting 中對 Result 賦值將直接終止後續 Filter 及目標 Action 執行,實現短路機制。
ActionExecutedContext:同樣繼承自 ControllerContext,額外提供 Exception(執行異常)、ExceptionHandled(異常處理標記)、Canceled(是否中途取消)與 Result 屬性,供後續 Filter 修改最終回應。

執行流程分為三個階段:
ActionInvoker 依據 Filter 的 Order 與 Scope 屬性排序,建立 ActionExecutingContext,依序呼叫所有 Filter 的 OnActionExecuting。若任一 Filter 設定 Result,流程短路,跳過目標 Action 與剩餘前置 Filter。ActionResult 及可能拋出的異常。ActionExecutedContext(含執行結果、異常資訊),以相反順序呼叫所有 Filter 的 OnActionExecuted。此階段 Filter 可修改 Result 覆蓋原回應。最終以最後的 Result 作為請求回應。此「洋蔥模型」設計確保前置邏輯由外而內、後置邏輯由內而外執行,符合 AOP 切面包裹語意。