接續上篇,本文探討剩餘兩個組件:ControllerDescriptor 與 ActionDescriptor 的同步/非同步特性,五大組件執行方式有嚴格對應關係。
ReflectedControllerDescriptor:同步版本,由 ControllerActionInvoker 建立ReflectedAsyncControllerDescriptor:非同步版本,由 AsyncControllerActionInvoker 建立兩者描述的皆為繼承自 Controller 或 AsyncController 的類別,而非直接實作介面。

自訂兩種 ActionInvoker 並覆寫 GetControllerDescriptor,搭配繼承 Controller 的 FooController 與 BarController,在 Action 中輸出 Descriptor 類型,證實對應關係。
public class FooController : Controller
{
protected override IActionInvoker CreateActionInvoker() { return new FooActionInvoker(); }
public void Index()
{
var cd = ((FooActionInvoker)this.ActionInvoker).GetControllerDescriptor(ControllerContext);
Response.Write(cd.GetType().FullName);
}
}