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====业务逻辑层、数据库访问层、数据模型层

 

 

 

 

posted @ 2016-09-05 20:23  石shi  阅读(750)  评论(0编辑  收藏  举报