[译] ASP.NET 生命周期 – ASP.NET 请求生命周期(二)
ASP.NET 请求生命周期
全局应用类也可以用来跟踪每个独立请求的生命周期,包括请求从 ASP.NET 平台传递到 MVC 框架。ASP.NET 框架会创建一个定义在 Global.asax 文件中的 MvcApplication 类的实例,并使用它当中定义的事件来引导请求,直到产生响应并发送到浏览器中。这些事件并不直接供应用开发者使用,它们是供 ASP.NET 框架执行请求处理的。
请求生命周期是由一系列事件描述的,而这些事件描述了一个请求从接收到响应发出的整个过程。在我们创建自己的模块或者处理器的时候,我们就会使用到这些事件,我们也可以使用这些事件来调试因 ASP.NET 组件之间交互引起的复杂问题。MVC 框架中包含了一个模块和一个处理器。模块是用来阻塞请求来查看文件,处理器是用来定位 controller 和 action 方法的组件。
理解请求生命周期
Application_Start 和 Application_End 方法并不会在 MvcApplication 实例中被调用。相反,ASP.NET 框架会触发一系列的事件,这些事件用来描述 请求生命周期 :
名称 | 描述 |
BeginRequest | 当新的请求接收到时触发的第一个事件。 |
AuthenticateRequest PostAuthenticateRequest |
在核实谁当前请求的用户的时候,AuthenticateRequest 事件会被触发。当所有的事件处理器处理完之后,PostAuthenticateRequest 会被触发。 |
AuthorizeRequest PostAuthorizeRequest |
在授权请求的时候会触发 AuthorizeRequest。当所有的事件处理器处理完成之后,PostAuthorizeRequest 会触发。 |
ResolveRequestCache PostResolveRequestCache |
当从缓存的数据中解析请求的时候会触发 ResolveRequestCache。当事件处理器处理完成之后,会触发 PostResolveRequestCache 事件。 |
MapRequestHandler PostMapRequestHandler |
当 ASP.NET 框架想要为请求定位一个处理器的时候会触发 MapRequestHandler 事件。一旦处理器选中之后就会触发 PostMapRequestHandler 事件。 |
AcquireRequestState PostAcquireRequestState |
在获取与当前请求相关的状态数据(比如会话状态)的时候触发 AcquireRequestState 事件。当所有的时间处理器处理完毕之后,PostAcquireRequestState 会被触发。 |
PreRequestHandlerExecute PostRequestHandlerExecute |
在处理器被要求处理请求之前和之后立即调用这两个事件。 |
ReleaseRequestState PostReleaseRequestState |
当关联当前请求的状态数据在请求处理的过程中不再需要的时候就会触发 ReleaseRequestState。当事件处理器完成请求的时候,PostReleaseRequestState 事件就会触发。 |
UpdateRequestCache | 在模块负责缓存并更新它们状态的时候触发本事件。 |
LogRequest PostLogRequest |
这个事件触发的时候提供了记录当前请求详细信息的机会。当所有的事件处理完成之后,PostLogRequest 会被触发。 |
EndRequest | 在当前请求处理完毕并且响应准备发送到浏览器之前触发这个事件。 |
PreSendRequestHandlers | 仅在 HTTP 报文头发送到浏览器之前触发这个事件。 |
PreSendRequestContent | 在响应报文头发送出去而响应内容没有发送到浏览器之前触发这个事件。 |
Error | 在错误发生的时候会触发这个事件,这可能发生在请求处理的任何一个节点上。 |
HttpApplication 对象的请求生命周期:ASP.NET 框架会创建多个 MvcApplication 类的实例来处理请求,这些实例也可以反复使用以便在它们的生命中可以处理多个请求。ASP.NET 框架有绝对的自由在需要的时候创建 MvcApplication 类的实例,在不需要的时候也可以销毁这些实例。这就意味着,我们编写的全局应用类 必须 能够让多个实例并存,并且这些实例可以在一个时间内用来连续处理多个请求,因此,我们仅需要担心的就是怎么存取它们共享的数据对象。
ASP.NET 框架触发的事件描绘了一个请求的处理生命周期的图表。我们可以在全局应用类,一个模块,或者一个处理器中处理这些事件。
理解模块与处理器
接下来,我将会向你展示如何在全局应用类中直接响应请求生命周期的事件。这对于了解生命周期事件是一个很好的开始,但这仅仅适用于简单的请求上的交互。任何复杂的请求处理功能都倾向于使用很多的生命周期事件,这就意味着全局应用类很快就会变得杂乱不堪。ASP.NET 框架为了解决这样的问题引入了 模块,它是一个自包含的类,可以接收到生命周期中的事件并且可以监测和处理请求。许多重要的 ASP.NET 平台服务都依赖于模块功能来在其生命周期之前能够预处理请求。举个例子,比如状态数据与安全服务,需要使用到模块来响应事件,比如 AcquireRequestState 和 AuthencticateRequest 会在 MVC 框架处理这个请求之前为其添加数据。模块可以与请求进行互动,包括与其相关联的响应——生命周期中的任何一个节点。
ASP.NET 框架同样支持一个组件叫做 处理器。处理器负责给一个请求生成对应的响应。处理器对于 MVC 框架就是负责定位 controller 和 action 方法来服务请求并渲染 action 方法指定的视图的模块。ASP.NET 框架可以支持多个处理器,这就是为什么可以将多种开发框架混合起来放在一起的原因,比如 MVC, Web API, 和 Web Forms。处理器与四个请求生命周期相关。MapRequestHandler 和 PostMapRequestHandler 事件会分别在为一个请求选中好处理器之前和之后触发,PreRequestHandlerExecute 和 PostRequestHandlerExecute 事件会分别在要求为当前请求生成一个响应的之前和之后执行。
在这里介绍模块和处理器有助于更详细地描述请求生命周期:
图 1 - 向生命周期中添加请求处理过程图表
不要担心这很复杂,在解释了这些事件是怎么被处理的,多个 ASP.NET 平台服务是怎么实现的之后,这一切都会变得很明朗。
注意到,全局应用类即会被应用实例化,也会被请求生命周期实例化。不仅 ASP.NET 框架会创建多个实例来同时服务请求,也会创建多个实例来支持每一个生命周期。
[根据 Adam Freeman – Pro ASP.NET MVC 5 Platform 选译]
[译] ASP.NET 生命周期 – ASP.NET 请求生命周期(二)的更多相关文章
- C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)
本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...
- $Django orm增删改字段、建表 ,单表增删改查,Django请求生命周期
1 orm介绍 ORM是什么 ORM 是 python编程语言后端web框架 Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM. 一 ...
- django请求生命周期流程与路由层相关知识
目录 请求生命周期流程图 路由层之路由匹配 无名有名分组 反向解析 无名有名分组反向解析 路由分发 名称空间 请求生命周期流程图 django请求生命周期流程图 路由层之路由匹配 我们都知道,路由层是 ...
- [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(四)
不使用特殊方法来处理请求生命周期事件 HttpApplication 类是全局应用类的基类,定义了可以直接使用的一般 C# 事件.那么使用标准 C# 事件还是特殊方法那就是个人偏好的问题了,如果喜欢, ...
- [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(三)
使用特殊方法处理请求生命周期事件 为了在全局应用类中处理这些事件,我们会创建一个名称以 Application_ 开头,以事件名称结尾的方法,比如 Application_BeginRequest.举 ...
- [译] ASP.NET 生命周期 – ASP.NET 上下文对象(六)
使用 HttpApplication 对象 ASP.NET 框架中的许多类都提供了许多很方便的属性可以直接映射到 HttpContext 类中定义的属性.这种交叠有一个很好的例子就是 HttpAppl ...
- [译] ASP.NET 生命周期 – ASP.NET 上下文对象(五)
ASP.NET 上下文对象 ASP.NET 提供了一系列对象用来给当前请求,将要返回到客户端的响应,以及 Web 应用本身提供上下文信息.间接的,这些上下文对象也可以用来回去核心 ASP.NET 框架 ...
- [译] ASP.NET 生命周期 – ASP.NET 应用生命周期(一)
概述 ASP.NET 平台定义了两个非常重要的生命周期.第一个是 应用生命周期 (application life cycle),用来追踪应用从启动的那一刻到终止的那一刻.另一个就是 请求生命周期 ...
- 详解ASP.NET MVC的请求生命周期
本文的目的旨在详细描述asp.net mvc请求从开始到结束的每一个过程. 我希望能理解在浏览器输入url并敲击回车来请求一个asp.net mvc网站的页面之后发生的任何事情. 为什么需要关心这些? ...
随机推荐
- javaweb学习总结五(内省、beanUtils工具包)
一:内省的概念 1:内省是反射的一种特例,由于在反射中频繁的操作javabean,所以为了方便反射 javabean,sun公司开发出一套API提高效率. 2:javaBean,就是用来封装客户端请求 ...
- MapReduce中使用SequenceFile的方式上传文件到集群中
如果有很多的小文件,上传到HDFS集群,每个文件都会对应一个block块,一个block块的大小默认是128M,对于很多的小文件来说占用了非常多的block数量,就会影响到内存的消耗, MapRedu ...
- Scala中的偏函数与部分应用函数
Scala中有PartialFunction的概念, 同时还要一个概念叫Partial Applied Function. 前者译作偏函数, 后者译作"偏应用函数"或"部 ...
- hdu1560 搜索
从原串的最大长度开始枚举,当某个长度的值能保存所有串时,即成功.对每个长度进行深搜,每次取某个串的第一个. #include<iostream> #include<cstdio> ...
- poj 2492 并查集
思路:当a,b的根节点find(a)与find(b)不同时,就直接将这两个数连接起来.由于每个树的根节点的kind值一定为0,所以,对于a,b的kind值相同,我们就讲其中一个根的kind值变为1,当 ...
- SQL Server 2005中约束
在SQL Server 2005中有6种约束:主键约束(primary key constraint).惟一性约束(unique constraint).检查约束(check constraint). ...
- SharePoint手机App巅峰对决:rShare 挑战 SharePlus
真是个移动的时代,当我们去百度,Bing,雅虎等搜索引擎,搜索关键字比如“SharePoint iOS”, “SharePoint 安卓”, “SharePoint iPhone”,“SharePoi ...
- CSS3 垂直树状图——运用 :before 和 :after
直接上图(原网址),还有步骤想详解视频.自己CSS3练习demo. [demo] [HTML] <div class="tree"> <ul> <li ...
- Android之帧动画
MySurfaceView类: package com.fm; import android.content.Context; import android.graphics.Bitmap; impo ...
- BUG修改纪录
刚进入现在的公司,接手了一个遗留的项目,BUG频出,最近一个星期都在加班改BUG,身心疲惫,为了 现在,将来不会再被相同BUG困扰,特来纪录一下. 1.数据库设计字段时,对于int等类型最好设置默认值 ...