詳解ASP.NET MVC應用程序請求生命周期
當一個ASP.NET MVC應用程序提出請求,為了響應請求,包含一些請求執(zhí)行流程步驟! 在ASP.NET MVC應用程序Http request
和Http response 過程中,主要包含8個步驟:
1)RouteTable(路由表)的創(chuàng)建
2)UrlRoutingModule 請求攔截
3)Routing engine 確定route
4)route handler 創(chuàng)建相關的IHttpHandler實例
5)IHttpHandler實例確定Controller(控制器)
6)Controller執(zhí)行
7)一個視圖引擎創(chuàng)建
8) 視圖呈現(xiàn)
主要流程圖如下:
1)RouteTable的創(chuàng)建
RouteTable的創(chuàng)建發(fā)生在mvc應用程序的啟動 或者web應用程序池的重啟!通常的asp.net程序,一個頁面請求對應磁盤上的一個頁面!如(http://localhost/index.aspx
對應到服務器磁盤上的文件index.aspx)index.aspx實際上是一個類,由IHttpHandler創(chuàng)建實例化。IHttpHandler包含一個
ProcessRequest方法,負責響應頁面輸出!
但是mvc application 是不同的,每一個請求映射到route,route 定義在route table,在應用程序啟動時創(chuàng)建!
RouteTable的在應用程序的具體使用如下
- public class MvcApplication : System.Web.HttpApplication
- {
- public static void RegisterRoutes(RouteCollection routes)
- {
- routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
- routes.MapRoute(
- "Default", // Route name
- "{controller}/{action}/{id}", // URL with parameters
- new { controller = "Home", action = "Index", id = "" } // Parameter defaults
- );
- routes.MapRoute(
- "Account", // Route name
- "{controller}/{action}/{id}", // URL with parameters
- new { controller = "Account", action = "LogOn", id = "" } // Parameter defaults
- );
- }
- protected void Application_Start()
- {
- RegisterRoutes(RouteTable.Routes);
- }
- }
2)UrlRoutingModule 請求攔截
每一個Http 請求 都被UrlRoutingModule攔截,UrlRoutingModule提供了當前的HttpContext的routing engine(路由引擎)。HttpContext實例包含當前請求的所有數(shù)據(jù)。UrlRoutingModule控制著routing engine,提供了HttpContext數(shù)據(jù)到routing engine! UrlRoutingModule實現(xiàn)了IHttpModule接口,在web.config 文件進行了注冊!
UrlRoutingModule 具體的數(shù)據(jù)結(jié)構如下:
- public class UrlRoutingModule : IHttpModule
- {
- // 主要的 Methods
- protected virtual void Init(HttpApplication application);
- private void OnApplicationPostMapRequestHandler(object sender, EventArgs e);
- private void OnApplicationPostResolveRequestCache(object sender, EventArgs e);
- public virtual void PostMapRequestHandler(HttpContextBase context);
- public virtual void PostResolveRequestCache(HttpContextBase context);
- void IHttpModule.Init(HttpApplication application);
- // Properties
- public RouteCollection RouteCollection { get; set; }
- }
- UrlRoutingModule 在WebConfig的注冊
- <httpModules>
- <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule,
- System.Web.Routing, Version=3.5.0.0,
- Culture=neutral,PublicKeyToken=31BF3856AD364E35"/>
- </httpModules>
3)Routing engine 確定route
routing engine基于當前HttpContext確定Route的處理。routing engine 指出route table里面匹配的route ,并在IRouteHandler實例創(chuàng)建route處理!
4)route handler 創(chuàng)建相關的IHttpHandler實例在route table里,每一個route 都與一個IHttpHandler對應。IHttpHandler基于當前的HttpContext數(shù)據(jù)負責創(chuàng)建一個Controller(控制器)!IHttpHandler是由當前活動的IRouteHandler的GetHttpHandler所創(chuàng)建!
具體的細節(jié)如下
- public interface IRouteHandler
- {
- // Methods
- IHttpHandler GetHttpHandler(RequestContext requestContext);
- }
5)IHttpHandler實例確定Controller(控制器)
在MVC應用程序中,MvcHandler實現(xiàn)了IHttpHandler,Controller實例,是基于所輸入的HttpContext 和Url參數(shù)與route 對應的,ControllerFactory 創(chuàng)建一個controller,ControllerContext包含上下文數(shù)據(jù),傳入到controller的Excute方法,觸發(fā)controller的邏輯處理!
MvcHandler主要有一個ControllerBuilder _controllerBuilder字段;
具體細節(jié)如下
- public class MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState
- {
- // 主要的Fields
- private ControllerBuilder _controllerBuilder;
- }
- ControllerBuilder類主要有一個方法GetControllerFactory
- public class ControllerBuilder
- {
- public IControllerFactory GetControllerFactory();
- }
通過實現(xiàn)IControllerFactory 工廠 創(chuàng)建一個Controller
6)Controller執(zhí)行
所有的controller 邏輯調(diào)用執(zhí)行時,actions請求被執(zhí)行!當controller的邏輯被執(zhí)行時,會返回一個ActionResult。一個ActionResult實例,會觸發(fā)呈現(xiàn)一個View(視圖),當觸發(fā)發(fā)生時,一個視圖引擎被創(chuàng)建,進行進一步的處理
7)一個視圖引擎創(chuàng)建
視圖引擎實例會創(chuàng)建一個IView接口實例,返回一個ViewEngineResult實例,
8) 視圖呈現(xiàn)
IView實例編譯請求視圖,提供Render方法調(diào)用的數(shù)據(jù)!
原文標題:MVC 請求生命周期
鏈接:http://www.cnblogs.com/skyyang/archive/2010/04/02/1702769.html
【編輯推薦】