MVC4 源碼分析(Visual studio 2012/2013)
HttpModule中重要的UrlRoutingModule
9:this.OnApplicationPostResolveRequestCache);
10:this.PostResolveRequestCache(context);
IRouteHandler routeHandler = routeData.RouteHandler; //根據路由數據創建出了MvcRouteHandler
IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);
根據MvcRouteHandler創建出了MvcHandler:IHttpHandler(MvcHandler實現了IHttpHandler接口,接下來就要進入MVC源代碼分析)
在MVC4源代碼src文件夾System.Web.Mvc類庫下
MVC4百度雲源代碼:鏈接:http://pan.baidu.com/s/1pLDvXB9 密碼:4tiv
Reflector7百度雲盤:鏈接:http://pan.baidu.com/s/1eSm9Y06 密碼:gyx0
1:routeHandler.GetHttpHandler(requestContext);
2:MvcHandler.cs ProcessRequest方法
通過工廠模式創建MVC中的Controller控制器,然后執行Execute方法
3:controller.Execute(RequestContext);
IController是接口,需要找具體實現類(之前通過工廠模式創建Controller控制器,優先去找Controller類)
Controller : ControllerBase //Controller並沒有實現IController接口,找其父類
ControllerBase : IController //ControllerBase實現了IController接口
4:ExecuteCore() //Controller類中
5:ActionInvoker.InvokeAction(ControllerContext, actionName)方法
ControllerActionInvoker : IActionInvoker //ControllerActionInvoker 實現了IActionInvoker 接口
6:InvokeActioin
1:InvokeActionMethodWithFilters
1.1:InvokeActionMethod
2:InvokeActionResultWithFilters
2.1:InvokeActionResultFilterRecursive
2.2:InvokeActionResult
7:actionResult.ExecuteResult(controllerContext);
ViewResult : ViewResultBase //ViewResult 並沒有實現ActionResult接口,找其父類
ViewResultBase : ActionResult //ViewResultBase實現了ActionResult接口
8:View.Render(viewContext, writer); 渲染View視圖【WebForm.aspx視圖引擎】
WebFormView : BuildManagerCompiledView //WebFormView 並沒有實現IView接口,找其父類
BuildManagerCompiledView : IView //BuildManagerCompiledView實現了IView接口
8.1:BuildManagerCompiledView (WebForm.aspx視圖引擎模式)
RenderView為抽象類,由其子類實現具體方法內容
執行ASP.NET 頁面生命周期ProcessRequest方法,把后續第13/第14等事件執行完畢,然后把Render渲染好的所有html代碼返回給瀏覽器
Application 19事件
ASP.NET MVC源碼分析
1:獲取ControllerFacotry,根據上下文反射Controller對象
在Mvchandler的PR方法中
2:調用controller.Execute方法
在MvcHandler的PR方法中
3:調用ActionInvoker.InvokeAction方法
當前Controller類 -->ControllerBase類的Execute方法-->Controller類的ExecuteCore方法
4:調用InvokeActionResultWithFilter
ActionInvoker對象為ControllerActionInvoker類的實例
5:調用actionResult.ExecuteResult
6:調用View.Render方法,將頁面渲染到輸出流中
ViewResult類-->ViewResultBase類
當一個asp.net mvc應用程序提出請求,為了響應請求,包含一些請求執行流程步驟!在asp.net mvc應用程序Http request和Http Response過程中,
主要包含8個步驟:
1>RouteTable(路由表)的創建
2>UrlRoutingModule 請求攔截
3>Routing engine 確定route
4>route handler 創建相關的IHttpHandler實例
5>IHttpHandler實例確定Controller(控制器)
6>Controller執行
7>一個視圖引擎創建
8>視圖呈現