[译] 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网站的页面之后发生的任何事情. 为什么需要关心这些? ...
随机推荐
- 显示创建一个表的SQL语句
显示创建数据库中包的语句,从而可以方便的对表的结构进行修改和复制(当然还有其他的方式) 显示表结构: 显示创建表语句: show create table tablename;
- Wince 设备环境和画笔应用
本文主要讲到的是画笔应用,在Wince -06环境下,画笔应用很广泛,很有技巧,这里笔者要着重介绍. 设备环境可以用一下图表示,主要是让大家大致了解Wince -06的设备环境,下面在图形舍虚设计中会 ...
- poj 3352 边连通分量
思路与poj3177一模一样. #include<iostream> #include<cstdio> #include<cstring> #include< ...
- 移动平台的meta标签-----神奇的功效(转)
对于桌面平台web布局中大家对meta标签再熟悉不过了,它永远位于 head 元素内部,对做SEO的朋友一定对meta有种特殊的感情吧,今天我们就来说说移动平台的meta标签,在移动平台meta标签究 ...
- codevs4373 窗口==poj2823 Sliding Window
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 53676 Accepted: 15399 ...
- 减小iOS应用程序的大小
减小iOS应用程序的大小 本文译自:Reducing the size of my App Q: 怎样才能让我的程序安装包小一点,让程序的下载和安装更快速? A: 本文收集了一些减小程序安装包大小的相 ...
- 今天写了几个css属性
<!DOCTYPE html> <html> <head> <meta charset=UTF-8"> <title></t ...
- java开发:分享一下MemCached的使用
在项目开发中,有些不经常修改的数据,我们通常都会选择使用缓存.其中一种方式,就是memcached. windows系统中,我们需要下载并安装memcached. 地址如:D:\memcached\m ...
- SQL ser 跨实例访问数据库
SqlServer如何跨实例访问数据库 Exec sp_droplinkedsrvlogin LinkName,NullExec sp_dropserver LinkName go EXEC sp_a ...
- block回调具体例子
//main.m //// main.m// 回调//// Created by hehe on 15/9/10.// Copyright (c) 2015年 wang.hehe. All r ...