1. 程式人生 > >MVC中從路由到Controller運行機制

MVC中從路由到Controller運行機制

base get net soft quest info 響應 當前 font

下圖中每個箭頭的左側對應的右側方法為對象調用方法的過程:

技術分享圖片

由於UrlRoutingModule這個HttpModule被註冊到Web應用中,所有對每個抵達的請求來說,當代表當前應用的HttpApplication對象的PostResolveRequestCache事件被觸發的時候,UrlRoutingModule會利用RouteTable表示的路由表(實際上RouteTable的靜態屬性Routes返回的RouteCollection對象代表這個路由表)針對當前請求實施路由解析。

具體來說,UrlRoutingModule會調用路由表的RouteCollection對象的GetRouteData方法,如果定義在某個Route對象上的路由規則與當前請求相匹配,那麽該方法執行結束自後會返回一個包含目標Controller和Action名稱的路由變量的RouteData對象。

接下來UrlRoutingModule通過RouteData對象那個的RouteHandler屬性得到匹配Route對象采用的RouteHandler對象,默認情況下這是一個MvcRouteHandler對象。UrlRoutingModule就調用這個MvcRouteHandler對象的GetHttpHandler方法得到一個MvcHandler對象。UrlRoutingModule隨之調用當前HttpContext的RemapHandler方法對得到的HttpHandler(MvcHandler)對象實施映射,那麽此HttpHandler將最終接管當前請求的處理。

對於MvcHandler來說,當它被用來處理當前請求的時候,它會利用RouteData對象得到目標Controller的名稱,並借助於主場的ControllerFactory來激活對應的Controller對象。目標Controller被激活之後,它的Execute方法被MvcHandler調用。

如果被激活的Controller對象的類型是ControllerBase的子類,當它的Execute方法被執行的時候,它會調用ActionInvoker對象的InvokeAction方法來執行目標Action方法並對當前請求予以響應。默認采用的ActionInvoker是一個ControllerActionInvoker對象,當它的InvokeAction方法被執行的時候,它會利用註冊的ModelBinder采用Model綁定的方式生成目標Action方法的參數列表,並利用ActionExecutor對象以“表達式樹”的方式執行目標Action方法。

目標Action方法執行之後總是會返回一個ActionResult(對於返回類型不是ActionResult的Action方法來說,ASP.NET MVC總是會將執行的結果轉換成一個ActionResult對象),ControllerActionInvoker會通過執行此ActionResult對象來對請求作最終的響應。

MVC中從路由到Controller運行機制