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 请求生命周期(二)的更多相关文章

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

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

  2. $Django orm增删改字段、建表 ,单表增删改查,Django请求生命周期

    1 orm介绍  ORM是什么   ORM 是 python编程语言后端web框架 Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM.  一 ...

  3. django请求生命周期流程与路由层相关知识

    目录 请求生命周期流程图 路由层之路由匹配 无名有名分组 反向解析 无名有名分组反向解析 路由分发 名称空间 请求生命周期流程图 django请求生命周期流程图 路由层之路由匹配 我们都知道,路由层是 ...

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

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

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

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

  6. [译] ASP.NET 生命周期 – ASP.NET 上下文对象(六)

    使用 HttpApplication 对象 ASP.NET 框架中的许多类都提供了许多很方便的属性可以直接映射到 HttpContext 类中定义的属性.这种交叠有一个很好的例子就是 HttpAppl ...

  7. [译] ASP.NET 生命周期 – ASP.NET 上下文对象(五)

    ASP.NET 上下文对象 ASP.NET 提供了一系列对象用来给当前请求,将要返回到客户端的响应,以及 Web 应用本身提供上下文信息.间接的,这些上下文对象也可以用来回去核心 ASP.NET 框架 ...

  8. [译] ASP.NET 生命周期 – ASP.NET 应用生命周期(一)

    概述 ASP.NET 平台定义了两个非常重要的生命周期.第一个是 应用生命周期  (application life cycle),用来追踪应用从启动的那一刻到终止的那一刻.另一个就是 请求生命周期 ...

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

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

随机推荐

  1. linux命令行操作快捷键

    在shell命令终端中,Ctrl+n相当于方向向下的方向键,Ctrl+p相当于方向向上的方向键. 在命令终端中通过它们或者方向键可以实现对历史命令的快速查找.这也是快速输入命令的技巧. 在命令终端中可 ...

  2. 多tab页框架的使用场合

    多tab页框架适合应用于功能较少的场合,例如邮箱后台之类的. 对于一些业务功能多且复杂的场合就不适用.打开过多的tab页容易给用户造成混乱,页面的跳转也存在一定的难度. 一种新技术不能完全取代旧技术, ...

  3. cent0s7 显卡驱动导致重启黑屏

    由于 CentOS7.0 版本与前面的 CentOS6.5 及之前的版本的模式变更方法有很大 的不同,以前的版本中我们可以在vi /etc/inittab 文件中将id:5:initdefault 更 ...

  4. JavaScript “\”替换成 “\\”

    str=str.replace(/\\/g,'\\\\');

  5. 今天用css做了一个QQ登录页面

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. MyBatis(3.2.3) - Integration with Spring

    MyBatis-Spring is a submodule of the MyBatis framework, which provides seamless integration with the ...

  7. jQuery实现CheckBox全选、全不选

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 常用DOM笔记

    1,获取元素方法: (1),获取单个,返回一个元素 element.getElementById()//最快,实时 element.querySelector() (2)获取多个,返回一组 eleme ...

  9. EFFECTIVE JAVA 第十一章 系列化

    EFFECTIVE  JAVA  第十一章  系列化(将一个对象编码成一个字节流) 74.谨慎地实现Serializable接口 *实现Serializable接口付出的代价就是大大降低了“改变这个类 ...

  10. Gitlab 与 Git Windows 客户端一起使用的入门流程

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3824934.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...