一个请求的生命周期 详解ASP.NET MVC应用程序请求生命周期
详解ASP.NET MVC应用程序请求生命周期
当一个ASP NET MVC应用程序提出请求 为了响应请求 包含一些请求执行流程步骤! 在ASP NET MVC应用程序Http request
和Http response 过程中 主要包含 个步骤:
)RouteTable(路由表)的创建
)UrlRoutingModule 请求拦截

)Routing engine 确定route
)route handler 创建相关的IHttpHandler实例
)IHttpHandler实例确定Controller(控制器)
)Controller执行
)一个视图引擎创建
) 视图呈现
主要流程图如下:
)RouteTable的创建
RouteTable的创建发生在mvc应用程序的启动 或者web应用程序池的重启!通常的程序 一个页面请求对应磁盘上的一个页面!如(x
对应到服务器磁盘上的文件index aspx)index aspx实际上是一个类 由IHttpHandler创建实例化
IHttpHandler包含一个
ProcessRequest方法 负责响应页面输出!
但是mvc application 是不同的 每一个请求映射到route route 定义在route table 在应用程序启动时创建!
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); } } )UrlRoutingModule 请求拦截
每一个Http 请求 都被UrlRoutingModule拦截 UrlRoutingModule提供了当前的HttpContext的
routingengine(路由引擎) HttpContext实例包含当前请求的所有数据 UrlRoutingModule控制着routing engine
提供了HttpContext数据到routing engine! UrlRoutingModule实现了IHttpModule接口 在nfig 文件进行
了注册!
UrlRoutingModule 具体的数据结构如下
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的注册 <Modules> <add name= UrlRoutingModule type= System Web Routing UrlRoutingModule
System Web Routing Version= Culture=neutral PublicKeyToken= BF AD E /> </Modules>
)Routing engine 确定route
routing engine基于当前HttpContext确定Route的处理 routing engine 指出route table里面匹配的route 并
在 IRouteHandler实例创建route处理!
)route handler 创建相关的IHttpHandler实例在route table里 每一个route 都与一个IHttpHandler对应 IHttpHandler基于当前的HttpContext数据负责创建一个Controller(控制器)!IHttpHandler是由当前活动的
IRouteHandler的GetHttpHandler所创建!
具体的细节如下
public interface IRouteHandler
{
// Methods IHttpHandler GetHttpHandler(RequestContext requestContext);
}
)IHttpHandler实例确定Controller(控制器)
在MVC应用程序中 MvcHandler实现了IHttpHandler Controller实例 是基于所输入的HttpContext
和Url参数 与route 对应的 ControllerFactory 创建一个controller ControllerContext包含上下文数据 传入到controller的Excute方法
触发 controller的逻辑处理!
MvcHandler主要有一个ControllerBuilder _controllerBuilder字段;
具体细节如下
public class MvcHandler : IHttpAsyncHandler IHttpHandler IRequiresSessionState { // 主要的Fields private ControllerBuilder _controllerBuilder; } ControllerBuilder类主要有一个方法GetControllerFactory public class ControllerBuilder { public IControllerFactory GetControllerFactory(); } 通过实现IControllerFactory 工厂 创建一个Controller
)Controller执行
所有的controller 逻辑调用执行时 actions请求被执行!当controller的逻辑被执行时 会返回一个
ActionResult 一个ActionResult实例 会触发呈现一个View(视图) 当触发发生时 一个视图引擎被创建 进行进一
步的处 理
)一个视图引擎创建
视图引擎实例会创建一个IView接口实例 返回一个ViewEngineResult实例
) 视图呈现
lishixinzhi/Article/program/net/201311/12318