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。
3、MvcRouteHandler类有一个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调用了ActionInvoker的InvokerAction方法来调用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.负责启动Asp。Net运行时
2.托管环境和非托管环境的分界线
3.到达IsAPIRutime。PR(ecb)---》连接非托管与托管的入口
内部把ecb--》HttpWorkerRequest(包括:请求报文和响应)
通过HTTPRutime 。PR执行(WR)方法
此时--》WR包含---》HttpContext 1.Request 2.Response
4.通过HttpApplicationFactory获取一个HttpApplication对象
内部执行的方法:1.如果是第一次请求就把gloable文件变异成一个类型
2.调用application-Start()方法
3.通过HttpApplication的池获取一个HttpApplication对象(如果有空闲的HttpApplication就用没有就反射出来)负责管道的运作
5.在第七个和第八个事件之间: 根据请求地址创建页面对象或一般处理程序
6.整个管道流动是HttpContext在管道中的任何一个位置都可以获取请求报文的信息 最后一个步骤结束的时候HttpContext上下文中的Response就是给客户端的响应内容
7.第九个事件和第十个事件
1.根据cookie中的SessionId加载会话状态
8。11和12个事件:
页面的生命周期1.创建页面控件树 2.确定IsPostBack 3.初始化 4.加载ViewState (隐藏的拿出)处理回发数据找到对应改变的控件和被点击的控件 5.加载 6.触发改变的事件和点击事件 7.预渲染(最后的机会改变当前页面的控件状态) 8.保存页面状态 9.渲染 10.卸载
Asp.netWebForm和MVC的区别:
1.Aspx页面(HTML、Aspx控件)页面展示逻辑 ====View层
2.代码后置类的控制逻辑 Controller层(调用业务逻辑,处理用户的请求数据,把数据交给View展示)
3.Model====业务逻辑层、数据库访问层、数据模型层