*過程描述 當瀏覽器發出一個http請求後,該請求被UrlRoutingModule截獲,UrlRoutingModule根據請求上下文去系統路由表(RouteTable)中匹配,從中獲取一個RouteData,包含了請求的路由信息,特別是包含一個RouteHandler屬性,因為在global的A ...
*過程描述
當瀏覽器發出一個http請求後,該請求被UrlRoutingModule截獲,UrlRoutingModule根據請求上下文去系統路由表(RouteTable)中匹配,從中獲取一個RouteData,包含了請求的路由信息,特別是包含一個RouteHandler屬性,因為在global的Application_Start方法中我們註冊了mvc的路由規則,所以該RouteHandler屬性的類型是MvcRouteHandler(實現了IRouteHandler)。UrlRoutingModule根據RouteData的RouteHandler屬性又可以得到一個HttpHandler,該HttpHandler的類型是MvcHttpHandler(因為RouteHandler的類型是MvcRouteHandler),並由MvcHttpHandler來具體處理請求的一些邏輯。
MvcHttpHandler類實現了IHttpHandler,其核心方法是ProcessRequest,它也是IHttpHandler介面中唯一要實現的方法,該方法被用來處理請求。
在處理請求時,MvcHttpHandler會根據請求信息生成相應Controller的實例(所有Controller類最終會繼承一個IController介面,該介面中包含一個Execute方法,用來執行指定的請求上下文),該Controller的實例會根據請求信息調用指定的acton。在執行action的過程中又經歷了請求參數的模型綁定,操作過濾器的請求攔截處理和操作邏輯的執行。
Controller中Action返回給客戶端的都是ActionResult類型,ActionResult是一個抽象類,其實現主要包含兩類:ViewResult類和非ViewResult類(如JsonResult、ContentResult、FileResult等)。如果Action返回的是非ViewResult,則內容將直接被輸送到Response響應流中,顯示給客戶端,而如果返回的是ViewResult,則視圖引擎會找到需要被渲染的視圖,視圖被載入成WebViewPage<TModel>類型,並渲染生成Html,最終返回Html。
*細節補充
1.UrlRoutingModule中的方法為什麼會在請求中被調用
一個請求進入ASP.NET請求處理管道時,會經歷19個階段,即19個事件,其中的PostResolveRequestCache事件被UrlRoutingModule中的方法註冊,這樣自然在經歷PostResolveRequestCache事件時,會去調用UrlRoutingModule中的方法。其中UrlRoutingModule對象是ASP.NET根據在全局webconfig(C\Windows\Microsoft.NET\Framework\版本號\Config\Web.config)中的配置預先載入的。
UrlRoutingModule繼承了IHttpModule介面,該介面中的init方法被用來向上述19個事件中註冊事件處理程式。ASP.NET也是因為IHttpModule,可以實現拓展。
2.路由表中的路由規則是何時被註冊的,RouteData中RouteHandler屬性的類型為什麼是MvcRouteHandler?
路由表中的路由規則是在global中的Application_Start方法中被註冊的,此處註冊的方法是RouteConfig.RegisterRoutes(RouteTable.Routes),該方法內部調用了RouteCollection對象的MapRoute方法,而該方法內部其實已經定義了當前路由的RouteHandler為MvcRouteHandler。
*完整的請求處理圖
*參考文章
1.http://www.cnblogs.com/canfengfeixue/p/8035311.html
2.https://www.cnblogs.com/ensleep/p/5458270.html