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) 视图呈现
主要流程图如下:
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.负责启动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====业务逻辑层、数据库访问层、数据模型层
Asp.NetMVC和WebForm的请求生命周期的更多相关文章
- 详解ASP.NET MVC应用程序请求生命周期
------转载当一个ASP.NET MVC应用程序提出请求,为了响应请求,包含一些请求执行流程步骤! 在ASP.NET MVC应用程序Http request 和Http response 过程中, ...
- 详解ASP.NET MVC的请求生命周期
本文的目的旨在详细描述asp.net mvc请求从开始到结束的每一个过程. 我希望能理解在浏览器输入url并敲击回车来请求一个asp.net mvc网站的页面之后发生的任何事情. 为什么需要关心这些? ...
- (转)教你记住ASP.NET WebForm页面的生命周期
对于ASP.NET Webform的开发者,理解ASP.NET Webform的页面生命周期是非常重要的.主要是为了搞明白在哪里放置特定的方法和在何时设置各种页面属性.但是记忆和理解页面生命周期里提供 ...
- ASP.NET MVC的请求生命周期
我希望能理解在浏览器输入URL并敲击回车来请求一个ASP.NET MVC网站的页面之后发生的任何事情. 为什么需要关心这些?有两个原因.首先是因为ASP.NET MVC是一个扩展性非常强的框架.例如, ...
- 教你记住ASP.NET WebForm页面的生命周期
对于ASP.NET Webform的开发者,理解ASP.NET Webform的页面生命周期是非常重要的.主要是为了搞明白在哪里放置特定的方法和在何时设置各种页面属性.但是记忆和理解页面生命周期里提供 ...
- [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(四)
不使用特殊方法来处理请求生命周期事件 HttpApplication 类是全局应用类的基类,定义了可以直接使用的一般 C# 事件.那么使用标准 C# 事件还是特殊方法那就是个人偏好的问题了,如果喜欢, ...
- [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(三)
使用特殊方法处理请求生命周期事件 为了在全局应用类中处理这些事件,我们会创建一个名称以 Application_ 开头,以事件名称结尾的方法,比如 Application_BeginRequest.举 ...
- [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(二)
ASP.NET 请求生命周期 全局应用类也可以用来跟踪每个独立请求的生命周期,包括请求从 ASP.NET 平台传递到 MVC 框架.ASP.NET 框架会创建一个定义在 Global.asax 文件中 ...
- C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)
本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...
随机推荐
- 1、Python-HelloWorld
安装 环境下载 https://www.python.org/downloads/ IDE(PyCharm)下载 https://www.jetbrains.com/pycharm/download/ ...
- UVA - 12487 Midnight Cowboy(LCA+思维)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- tomcat运行时为什么不能删除war
tomcat启动时会监听webapps下的war文件,如果有新增就解压,如果有删除就删除项目
- tessaract ocr简介
Tesseract的历史Tesseract是一个开源的OCR引擎,惠普公司的布里斯托尔实验室在1984-1994年开发完成.起初作为惠普的平板扫描仪的文字识别引擎.Tesseract在1995年UNL ...
- Postfix 邮件服务 - DNS服务
DNS 服务 (系统需要配置静态 IP 地址) yum install bing* -y 一.配置 NDS 域名解析: 直接添加以下内容: [root@mail ~]# cat /etc/named. ...
- slice() 和splice()
splice() 方法与 slice() 方法的作用是不同的,splice() 方法会直接对数组进行修改. 1, splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目. splice ...
- ado.net 访问excel
1 类:OleDbConnection ... 2 connection string : Provider=Microsoft.ACE.OLEDB.12.0;Data Source={excelPa ...
- python技巧 switch case语句
不同于C语言和SHELL,python中没有switch case语句,关于为什么没有,官方的解释是这样的 使用Python模拟实现的方法: def switch_if(fun, x, y): ...
- 给bootstrap table设置行列单元格样式
1.根据单元格或者行内其他单元格的内容,给该单元格设置一定的css样式 columns: [{ field: 'index', title: '序号', align:"center" ...
- 【转】Python数据类型之“数字(numerics)”
[转]Python数据类型之“数字(numerics)” 上一节内容说的是“Python基本语法”,本节主要讲下Python中的数据类型. 存储在内存中的数据通常有两个属性: 在内存中的存放位置:这个 ...