ActionDescriptor 描述控制器內的單一 Action 方法,包含參數、篩選器、選擇器等元數據。非同步版本 AsyncActionDescriptor 則服務於 AsyncController 的非同步動作。本文將逐一剖析。
public abstract class ActionDescriptor : ICustomAttributeProvider
{
public virtual object[] GetCustomAttributes(bool inherit);
public virtual object[] GetCustomAttributes(Type attributeType, bool inherit);
public virtual bool IsDefined(Type attributeType, bool inherit);
public virtual IEnumerable<FilterAttribute> GetFilterAttributes(bool useCache);
public abstract ParameterDescriptor[] GetParameters();
public abstract object Execute(ControllerContext controllerContext, IDictionary<string, object> parameters);
public virtual ICollection<ActionSelector> GetSelectors();
public virtual FilterInfo GetFilters();
public abstract string ActionName { get; }
public abstract ControllerDescriptor ControllerDescriptor { get; }
public virtual string UniqueId { get; }
}
ActionSelector 委派集合,用於依 ControllerContext 判斷 Action 是否匹配(如 HTTP 動詞、Ajax 請求等)。FilterInfo,含四類篩選器集合:ActionFilters、AuthorizationFilters、ExceptionFilters、ResultFilters。public delegate bool ActionSelector(ControllerContext controllerContext);
預設回傳空集合,開發者可透過 ActionMethodSelectorAttribute 衍生類別(如 HttpPostAttribute)參與選擇邏輯。
public abstract class AsyncActionDescriptor : ActionDescriptor
{
public abstract IAsyncResult BeginExecute(ControllerContext controllerContext, IDictionary<string, object> parameters, AsyncCallback callback, object state);
public abstract object EndExecute(IAsyncResult asyncResult);
public override object Execute(ControllerContext controllerContext, IDictionary<string, object> parameters);
}
Execute 覆寫後直接拋出 InvalidOperationException,強制非同步動作必須走 BeginExecute/EndExecute 流程。
ActionDescriptor 統籌 Action 執行所需的所有元數據,其非同步對應版本確保非同步動作走正確管線,是 MVC 請求處理管線的關鍵樞紐。