`Controller.ExecuteCore()` 呼叫 `ActionInvoker.InvokeAction()` 進入 Action 執行管線。本文逐行解析 `InvokeAction` 原始碼,揭示授權過濾器、模型綁定、Action 執行、結果執行、異常處理完整生命週期。
public virtual bool InvokeAction(ControllerContext controllerContext, string actionName)
{
// ... 參數檢查 ...
ActionDescriptor actionDescriptor = FindAction(controllerContext, controllerDescriptor, actionName);
if (actionDescriptor != null)
{
FilterInfo filterInfo = GetFilters(controllerContext, actionDescriptor);
try
{
AuthorizationContext authContext = InvokeAuthorizationFilters(controllerContext, filterInfo.AuthorizationFilters, actionDescriptor);
if (authContext.Result != null)
{
InvokeActionResult(controllerContext, authContext.Result);
}
else
{
if (controllerContext.Controller.ValidateRequest)
ValidateRequest(controllerContext.HttpContext.Request);
IDictionary<string, object> parameters = GetParameterValues(controllerContext, actionDescriptor);
ActionExecutedContext postActionContext = InvokeActionMethodWithFilters(controllerContext, filterInfo.ActionFilters, actionDescriptor, parameters);
InvokeActionResultWithFilters(controllerContext, filterInfo.ResultFilters, postActionContext.Result);
}
}
catch (ThreadAbortException) { throw; }
catch (Exception ex)
{
ExceptionContext exceptionContext = InvokeExceptionFilters(controllerContext, filterInfo.ExceptionFilters, ex);
if (!exceptionContext.ExceptionHandled) throw;
InvokeActionResult(controllerContext, exceptionContext.Result);
}
return true;
}
return false; // 找不到 Action
}
Authorization Filters (OnAuthorization)
↓
Action Filters (OnActionExecuting)
↓
Action Method
↓
Action Filters (OnActionExecuted)
↓
Result Filters (OnResultExecuting)
↓
ActionResult.ExecuteResult()
↓
Result Filters (OnResultExecuted)
異常發生時跳轉至 Exception Filters (`OnException`),若 `ExceptionHandled=true` 則執行其指定結果,否則冒泡。