zoukankan      html  css  js  c++  java
  • Asp.NetMVC和WebForm的请求生命周期

    1.MVC的执行过程

      用户  ----》控制器---》ViewData进行传值---》视图(进行显示)

     2.Controller中的Action 主要进行的作用:

       1.处理用户的请求Request和Response

       2.调用业务逻辑层

       3.把数据传给View进行展示 

    3.ViewModel的作用:

    1.页面需要的字段实例化

    2.跟页面的表单和展示的内容相关

    4.Asp。Net MVC 的应用周期

        1.生命周期就是Http发出请求开始,到得到相应结束

        执行过程中每个控件的角色:

         1. UrlRoutingModule: 应用程序的入口(发起一给请求,会被UrlRoutingModule拦截)

             1. 1UrlRoutingModule实现了接口IHttpModule   UrlRouting module会从路由表中选择一个相匹配的路由规则。

             1.2 UrlRouting module选择匹配规则 

           1.2.1.在App_Start文件夹下面有一个RouteConfig.cs类  主要是给路由表添加路由规则  里面有RoutCollection属性(路由规则的匹配有顺序,多个进行匹配,只匹配第一个)

        2.RouteHandler    生成MvcHander

             2.1 MvcRouteHandler实现了IRouteHandler 接口

           2.2 主要是用来获取对MvcHandler的引用

           2.3  MvcHandler实现了IhttpHandler接口。

           2.4  MvcRouteHandler 被创建的时候,就会调用PostResolveRequestCache()方法。

     PostResolveRequestCache()方法主要做的工作如下:

    1、PostResolveRequestCache()是在UrlRoutingModule类里面,UrlRoutingModule类里面有一个RoutCollection属性,而这个属性有一个GetRouteData()方法,

      我们看到PostResolveRequestCache()方法中恰好调用了GetRouteData()这个方法,然后返回了一个RouteData对象。

    2、RouteData里面有一个IRouteHandler类型的属性RouteHandler ,而调用GetRouteData()返回的RouteData对象里的RouteHandler就是MvcRouteHandler

    3MvcRouteHandler类有一个GetHttpHandler方法,返回的是一个IHttpHandler类型的对象,返回的就是对MvcHandler对象的引用,绑定到一个MvcHandler的实例。

    3.MvcHandler

        MvcHandler就是最终对request进行处理。

        我们可以看到MvcHandler就是一个普通的Http  Handler.我们知道一个http handler需要实现一个ProcessRequest()的方法,这个方法就是处理request的核心。所以MvcHandler实现了ProcessRequest()方法。

    调用了一个ProcessRequestInit()方法,

     在ProcessRequestInit()方法中首先创建了ControllerFactory()的对象 factory.然后ControllerFactory创建了相关Controller的实例.最终调用了Controller的Excute()方法。

    4.ControllerFactory   ControllerFactory实现了接口IControllerFactory.

       controller对象实际上使用ActionInvoker来调用Action方法的,当Controller对象被  创建后,会执行Controller对象的基类ControllerBase类里面的Excute方法。Excute方法又调用了ExcuteCore()方法。Controller类里面实现了ExcuteCore()方法。ExcuteCore调用了ActionInvokerInvokerAction方法来调用Action方法。

      

    5.ActionInvoker  方法有很重要的责任来查找Controller中的Action方法并且调用。

      ActionInvoker是一个实现了IActionInvoker接口的对象:

      Controller类里面暴露了一个ActionInvoker 属性,会返回一个ControllerActionInvoker 。ActionInvoker通过CreateActionInvoker()方法来创建ControllerActionInvoker对象。

    ActionInvoker类需要匹配Controller中详细的Action来执行,而这些详细的信息是由ControllerDescriptor 提供的。ControllerDescriptor 和ActionDescriptor在ActionInvoker中扮演重要的角色。这两个分别是对Controler和Action的详细描述。ControllerDescriptor 描述了Controller的相关信息比如name,action,type等。

    ActionDescriptor 描述了Action相关的详情,比如name,controller,parameters,attributes和fiflters等。

    ActionDescriptor 中一个中要的方法就是FindAction(),这个方法返回一个ActionDescriptor 对象,所以ActionInvoker知道该调用哪个Action。

    6. ActionResult

    所有的Action方法有一个特性,就是返回一个ActionResult类型的数据。

    ExecuteResult()是一个抽象方法,所以不同的子类可以提供不同的ExecuteResult()实现。

    ActionResult执行后响应输出到客户端。

    7. ViewEngine

      ViewResult几乎是大部分应用程序的返回类型,主要通过ViewEngine引擎来展示view的。ViewEngine可能主要就是生成Html元素的引擎。Framwork提供了2种引擎,Razor View Engine 和Web Form View Engine.如果你想自定义引擎,你可以创建一个引擎只要实现IViewEngine接口即可。

    IViewEngine 有下面几个方法:

    1、FindPartialView :当controller需要返回一个PartialView的时候,FindPartialView方法 就会被调用。

    2、FindView 

    3、ReleaseView :主要用来有ViewEngine释放资源

    当ViewResult的方法ExecuteResult被调用后,ViewResultBase 的ExecuteResult 方法被调用,然后ViewResultBase 调用ViewResult的FindView 。紧接着ViewResult 返回ViewEngineResult,之后ViewEngineResult调用Render()方法来绘制html输出响应。

    另一种解释:

    当一个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方法调用的数据!

    Asp.NetWebForm的执行过程:

    1.发送一个请求:到达http.sys  内核模块(存放发送过来的请求---内存队列)

    2.w3vc服务---》初始化应用程序池(工作进程)

       2.1静态文件:读取出来直接封装成响应报文,然后返回给客户端

       2.2  a.aspx(启动asp.net运行时)

          通过一个插件:asp.net-isapi.dll(动态连接库)作用:

           1.负责启动AspNet运行时

           2.托管环境和非托管环境的分界线

    3.到达IsAPIRutimePRecb---》连接非托管与托管的入口

    内部把ecb--》HttpWorkerRequest(包括:请求报文和响应)

    通过HTTPRutime PR执行(WR)方法

     此时--》WR包含---》HttpContext  1.Request  2.Response

    4.通过HttpApplicationFactory获取一个HttpApplication对象

      内部执行的方法:1.如果是第一次请求就把gloable文件变异成一个类型

                                   2.调用applicationStart()方法

                                   3.通过HttpApplication的池获取一个HttpApplication对象(如果有空闲的HttpApplication就用没有就反射出来)负责管道的运作

    5.在第七个和第八个事件之间:  根据请求地址创建页面对象或一般处理程序

    6.整个管道流动是HttpContext在管道中的任何一个位置都可以获取请求报文的信息   最后一个步骤结束的时候HttpContext上下文中的Response就是给客户端的响应内容

    7.第九个事件和第十个事件

        1.根据cookie中的SessionId加载会话状态

    81112个事件:

      页面的生命周期1.创建页面控件树   2.确定IsPostBack  3.初始化   4.加载ViewState (隐藏的拿出)处理回发数据找到对应改变的控件和被点击的控件    5.加载     6.触发改变的事件和点击事件    7.预渲染(最后的机会改变当前页面的控件状态   8.保存页面状态   9.渲染    10.卸载

    Asp.netWebFormMVC的区别:

    1.Aspx页面(HTMLAspx控件)页面展示逻辑   ====View

    2.代码后置类的控制逻辑     Controller层(调用业务逻辑,处理用户的请求数据,把数据交给View展示)

    3.Model====业务逻辑层、数据库访问层、数据模型层

     

     

  • 相关阅读:
    PHP浮点数引起的四舍五入问题
    几项有用的JQUERY代码
    php5.5新特性之yield理解
    【转】循环、迭代、遍历和递归
    phpexcel导入excel文件报the filename xxx is not recognised as an OLE file错误。
    php缩放gif和png格式透明背景变成黑色的解决方法
    javascript统计输入文本的简易方法
    分享几个实用的jquery工具函数
    thinkphp中ajax技术
    正斜杠与反斜杠
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/5843504.html
Copyright © 2011-2022 走看看