zoukankan      html  css  js  c++  java
  • 详解ASP.NET MVC应用程序请求生命周期

    ------转载
    当一个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) 视图呈现

    主要流程图如下:

       主要流程图

    1)RouteTable的创建

    RouteTable的创建发生在mvc应用程序的启动 或者web应用程序池的重启!通常的asp.net程序,一个页面请求对应磁盘上的一个页面!如(http://localhost/index.aspx

    对应到服务器磁盘上的文件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);  
      }  
      } 

    2)UrlRoutingModule 请求拦截

    每一个Http 请求 都被UrlRoutingModule拦截,UrlRoutingModule提供了当前的HttpContext的routing engine(路由引擎)。HttpContext实例包含当前请求的所有数据。UrlRoutingModule控制着routing engine,提供了HttpContext数据到routing engine! UrlRoutingModule实现了IHttpModule接口,在web.config 文件进行了注册!

    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的注册  
     <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实例创建route处理!

    4)route handler 创建相关的IHttpHandler实例在route table里,每一个route 都与一个IHttpHandler对应。IHttpHandler基于当前的HttpContext数据负责创建一个Controller(控制器)!IHttpHandler是由当前活动的IRouteHandler的GetHttpHandler所创建!

    具体的细节如下

    public interface IRouteHandler  
    {  
    // Methods  
    IHttpHandler GetHttpHandler(RequestContext requestContext);  
    } 
     

    5)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

    6)Controller执行

    所有的controller 逻辑调用执行时,actions请求被执行!当controller的逻辑被执行时,会返回一个ActionResult。一个ActionResult实例,会触发呈现一个View(视图),当触发发生时,一个视图引擎被创建,进行进一步的处理

    7)一个视图引擎创建

    视图引擎实例会创建一个IView接口实例,返回一个ViewEngineResult实例,

    8) 视图呈现

    IView实例编译请求视图,提供Render方法调用的数据!

    原文标题:MVC 请求生命周期

    链接:http://www.cnblogs.com/skyyang/archive/2010/04/02/1702769.html

     更多 :

    HttpApplication事件执行顺序(转)

  • 相关阅读:
    BUUCTF | SQL COURSE 1
    BUUCTF | 高明的黑客
    element el-upload自定义上传显示进度条,多文件上传进度
    100行代码实现vue表单校验功能(小白自编)
    element-ui中validateField怎么验证部分表单字段的正确与否
    react解析html的dangerouslySetInnerHTML
    【Hyper-V】与【VirtualBox】【VMware】冲突的解决方法
    迁移到webpack4:从webpack.optimize.CommonsChunkPlugin到config.optimization.splitChunk,以及有个搜出来的中文解决办法是错的
    React 如何解析从后台读取的内容是html格式代码(带样式)
    Vue的elementUI实现自定义主题
  • 原文地址:https://www.cnblogs.com/tianma3798/p/3660677.html
Copyright © 2011-2022 走看看