*過程描述html
當瀏覽器發出一個http請求後,該請求被UrlRoutingModule截獲,UrlRoutingModule根據請求上下文去系統路由表(RouteTable)中匹配,從中獲取一個RouteData,包含了請求的路由信息,特別是包含一個RouteHandler屬性,由於在global的Application_Start方法中咱們註冊了mvc的路由規則,因此該RouteHandler屬性的類型是MvcRouteHandler(實現了IRouteHandler)。UrlRoutingModule根據RouteData的RouteHandler屬性又能夠獲得一個HttpHandler,該HttpHandler的類型是MvcHttpHandler(由於RouteHandler的類型是MvcRouteHandler),並由MvcHttpHandler來具體處理請求的一些邏輯。web
MvcHttpHandler類實現了IHttpHandler,其核心方法是ProcessRequest,它也是IHttpHandler接口中惟一要實現的方法,該方法被用來處理請求。瀏覽器
在處理請求時,MvcHttpHandler會根據請求信息生成相應Controller的實例(全部Controller類最終會繼承一個IController接口,該接口中包含一個Execute方法,用來執行指定的請求上下文),該Controller的實例會根據請求信息調用指定的acton。在執行action的過程當中又經歷了請求參數的模型綁定,操做過濾器的請求攔截處理和操做邏輯的執行。mvc
Controller中Action返回給客戶端的都是ActionResult類型,ActionResult是一個抽象類,其實現主要包含兩類:ViewResult類和非ViewResult類(如JsonResult、ContentResult、FileResult等)。若是Action返回的是非ViewResult,則內容將直接被輸送到Response響應流中,顯示給客戶端,而若是返回的是ViewResult,則視圖引擎會找到須要被渲染的視圖,視圖被加載成WebViewPage<TModel>類型,並渲染生成Html,最終返回Html。3d
*細節補充htm
1.UrlRoutingModule中的方法爲何會在請求中被調用對象
一個請求進入ASP.NET請求處理管道時,會經歷19個階段,即19個事件,其中的PostResolveRequestCache事件被UrlRoutingModule中的方法註冊,這樣天然在經歷PostResolveRequestCache事件時,會去調用UrlRoutingModule中的方法。其中UrlRoutingModule對象是ASP.NET根據在全局webconfig(C\Windows\Microsoft.NET\Framework\版本號\Config\Web.config)中的配置預先加載的。blog
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