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 选译]

转载于:https://www.cnblogs.com/levid-gc/p/5174440.html

[译] ASP.NET 生命周期 – ASP.NET 请求生命周期(二)相关推荐

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

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

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

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

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

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

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

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

  5. 【转】Asp.net的生命周期之应用程序生命周期

    参考:http://msdn.microsoft.com/zh-cn/library/ms178473(v=vs.100).aspx 参考:http://www.cnblogs.com/JimmyZh ...

  6. Asp.net的生命周期之应用程序生命周期

    参考:http://msdn.microsoft.com/zh-cn/library/ms178473(v=vs.100).aspx 参考:http://www.cnblogs.com/JimmyZh ...

  7. atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較...

    atitit.提升开发效率---使用server控件生命周期  asp.net 11个阶段  java jsf 的6个阶段比較 例如以下列举了server控件生命周期所要经历的11个阶段. (1)初始 ...

  8. ASP.NET的网页代码模型及生命周期

    第4章  ASP.NET的网页代码模型及生命周期 从本章开始,就进入了ASP.NET应用程序开发的世界.在了解了C#的结构,以及面向对象的概念后,就可以从面向对象的思想开发ASP.NET应用程序.在A ...

  9. 【Step by Step】编写代码验证一个ASP.NET应用程序和页面的生命周期

    我们知道ASP.NET Page的生命周期实际上是ASP.NET Application的生命周期的一部分.这个周期经历了HTTP Module => HTTP Handler => AS ...

最新文章

  1. 自定义Spark Partitioner提升es-hadoop Bulk效率
  2. hive实现not in
  3. 1-3 交换变量(算法竞赛入门经典)
  4. 药房管理(信息学奥赛一本通-T1075)
  5. 商品WEB开发的商品定单与存储过程的应用
  6. ZZ_MODIFIED_GEEBINF 不可用
  7. CSS中可以让文字在水平和垂直方向上重叠的两个属性
  8. Mastering Oracle SQL学习笔记(join句法专题第六部份)
  9. win server 2008 r2设置teamviewer13无人值守和开机自启动
  10. linux进入别人电脑,怎么进入别人电脑--局域网【详解】
  11. ros系统能用c语言编程,ROS操作系统学习(十一)参数的使用与编程方法
  12. VHDL学习:两种方式实现四选一选择器
  13. kgtemp文件转mp3工具
  14. c语言求最大质数,【C语言】求解素数(质数)的N种境界
  15. 用HTML和CSS制作一个带图片的旋转立方体
  16. 驰骋山海间,天地亦征途——记2022云创大数据优秀员工西域狂野自驾之旅
  17. 程序员的饭碗和杯具 .
  18. AIGC在营销图片生成技术综述
  19. Flutter 跨平台框架中的 Widgets,你了解多少?
  20. Java011-数组及其常见问题

热门文章

  1. 设计模式—工厂模式(思维导图)
  2. 数据结构—二叉排序树
  3. 操作系统—吸烟者问题
  4. Unity3D实践4:带有出入特效的提示框
  5. bzoj 3450: Tyvj1952 Easy(概率DP)
  6. 简单排序(插入排序法)
  7. c#开发大全、系列文章、精品教程
  8. kong 自建一个具有健康检查功能的http/tcp负载均衡器,配置流量权重,自动/手动目标健康,流量统一认证、鉴权、限流限速、修正,监控、日志等功能
  9. java扫描指定主机的端口socket服务
  10. jquery可见性过滤选择器:hidden、:visible