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) 视图呈现

主要流程图如下:

aaarticlea/png;base64,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" alt="" />

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

 

Asp.NetMVC和WebForm的请求生命周期的更多相关文章

  1. 详解ASP.NET MVC应用程序请求生命周期

    ------转载当一个ASP.NET MVC应用程序提出请求,为了响应请求,包含一些请求执行流程步骤! 在ASP.NET MVC应用程序Http request 和Http response 过程中, ...

  2. 详解ASP.NET MVC的请求生命周期

    本文的目的旨在详细描述asp.net mvc请求从开始到结束的每一个过程. 我希望能理解在浏览器输入url并敲击回车来请求一个asp.net mvc网站的页面之后发生的任何事情. 为什么需要关心这些? ...

  3. (转)教你记住ASP.NET WebForm页面的生命周期

    对于ASP.NET Webform的开发者,理解ASP.NET Webform的页面生命周期是非常重要的.主要是为了搞明白在哪里放置特定的方法和在何时设置各种页面属性.但是记忆和理解页面生命周期里提供 ...

  4. ASP.NET MVC的请求生命周期

    我希望能理解在浏览器输入URL并敲击回车来请求一个ASP.NET MVC网站的页面之后发生的任何事情. 为什么需要关心这些?有两个原因.首先是因为ASP.NET MVC是一个扩展性非常强的框架.例如, ...

  5. 教你记住ASP.NET WebForm页面的生命周期

    对于ASP.NET Webform的开发者,理解ASP.NET Webform的页面生命周期是非常重要的.主要是为了搞明白在哪里放置特定的方法和在何时设置各种页面属性.但是记忆和理解页面生命周期里提供 ...

  6. [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(四)

    不使用特殊方法来处理请求生命周期事件 HttpApplication 类是全局应用类的基类,定义了可以直接使用的一般 C# 事件.那么使用标准 C# 事件还是特殊方法那就是个人偏好的问题了,如果喜欢, ...

  7. [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(三)

    使用特殊方法处理请求生命周期事件 为了在全局应用类中处理这些事件,我们会创建一个名称以 Application_ 开头,以事件名称结尾的方法,比如 Application_BeginRequest.举 ...

  8. [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(二)

    ASP.NET 请求生命周期 全局应用类也可以用来跟踪每个独立请求的生命周期,包括请求从 ASP.NET 平台传递到 MVC 框架.ASP.NET 框架会创建一个定义在 Global.asax 文件中 ...

  9. C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)

    本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...

随机推荐

  1. 多目标遗传算法 ------ NSGA-II (部分源码解析)父、子种群合并 merge.c

    /* Routine for mergeing two populations */ # include <stdio.h> # include <stdlib.h> # in ...

  2. windows单机环境下配置tomcat集群

    场景:我们在平常联系中,需要涉及到tomcat中,但是电脑不够怎么办,肯定是在自己的电脑上模拟集群,就是装多个tomcat,这时候需要稍微配置下.如果是多个服务器,那不用配置,直接怼!!! 这里介绍的 ...

  3. __weak 修饰符

    在 HAL 库中,很多回调函数前面使用__weak 修饰符,这里我们有必要给大家讲解__weak 修饰符的作用. weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一 ...

  4. Hibernate添加日志--log4j

    需要导入 slf4j-log4j12-1.6.2.jar slf4j-api-1.6.2.jar log4j-1.2.16.jar 三个jar文件 编写properties文件,建议将日志输出级别设置 ...

  5. u-boot移植(十三)---代码修改---裁剪及环境变量 二

    一.错误处理 上一节遇到一个错误: print一下: 发现我们在jz2440.h中静态写的网络参数都没有写进去. dm9000 address not set. dm9000的地址未设置. 这里对应两 ...

  6. dp填表法,刷表法

    填表法:利用上一状态推当前 刷表法:利用当前推关联,利用刷表法较为便捷,向上边界较容易处理,处理在本次循环中的影响

  7. 【BZOJ】3282: Tree(lct)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3282 复习了下lct,发现两个问题.. 1:一开始我以为splay那里直接全部rot(x)就好了,然 ...

  8. div背景半透明

    例子: html: <div class="erp-mask-a" > <div class="erp-mask-cell-a"> he ...

  9. USB摄像头无法正常读取问题

    opencv读取摄像头或者视频一种是早期版本的IplImage结构体,图片就存在结构体指针IplImage*中,另一种是Mat类,两者在操作上略有差异,且opencv2都兼容这两个版本,前面的博客也说 ...

  10. python技巧 switch case语句

    不同于C语言和SHELL,python中没有switch case语句,关于为什么没有,官方的解释是这样的 使用Python模拟实现的方法: def switch_if(fun, x, y):    ...