(英文翻译)Asp.net应用程序以及页面的生命周期
介绍
在今天这篇文章中,我将详细的阐述关于发送请求到结果展示到浏览器的整个过程。首先我们应该清楚的知道三个关于请求的对象:HttpModule,HttpHandler,Asp.net Page对象。以及在他们内部的事件执行序列。
两步
整个ASP.NET请求可以概括为下面两步,从用户发送请求到IIS:
1,ASP.NET初始化一个环境用来接收用户的请求。换句话说,ASP.NET创建了Application对象,Request,Response,和Context对象来接收用户的请求。
2,一旦环境初始化成功,ASP.NET请求就是触发一系列的事件,这些事件主要经过Modules,Handlers,Page对象来管理。我把这个请求的过程缩减为MHPM(Module,Handler,Page,Module)

初始化ASP.NET运行时的环境
第一步,用户发送请求到IIS,IIS将检测出使用哪个ISAPI扩展来接收这个请求。这主要是由文件的类型来决定的。举个例子,如果一个页面是.aspx页面,IIS就会把请求发送到aspnet_isasp.dll。
第二步,如果这是第一次请求这个网站,那么就有一个叫ApplicationManager的类来创建一个应用程序域(ApplicationDomain)用来运行这个网站。应用程序域是用来隔离两个网站的容器,可以保证两个网站互相之间运行不受影响。
第三步,由新创建的应用程序域创建一个HttpRuntime的运行时环境。一旦运行时环境创建成功。HttpRequest,HttpRespone对象也就跟着一起被创建了。
第四不,一旦所有的ASP.NET对象初始化完毕,HttpApplication会将请求发送到Global.asax文件,Global.asax继承于HttpApplication类。(备注:HttpApplication只在第一次请求时才会被初始化,以后的请求都会只使用这一个实例)
第五步,HttpApplication将请求交给ASP.NET PAGE的一些核心对象。
第六步,HttpApplication开始相应Module,Hander,Page的事件。整个过程称之为MHPM.

下面的图主要是解释IIS的工作机制

MHPM事件执行机制
当HTTPAPPLICAITO初始化后,它就是开始发送请求,这个请求主要经过三个步骤。HttpModule.HttpHandler,Page.当他们经过这三个过程的时,我们研发人员都可以去拦截这些事件,并且处理自己的逻辑。
首先,在接下去讲之前。让我们来明白HTTPMODULE和HTTPHANDLER区别。
如果你想在某种类型的文件被处理之前做一些逻辑上的改动,比如.aspx,.html类的文件,这个时候我们就应该使用HttpHandler。

如果你想在整个ASP.NET page的执行管道里面做一些逻辑处理,这个时候我们就应该使用HttpModule.换句话说,HttpModule是基于整个线程的。

下面一张图详细解释了整个请求的过程中HttpModule合HttpHandler处理的区别。

选择合适的时候做合适的事情
大家问的最多的是在哪个事件中放置我的逻辑代码?下面的清单的告诉我们结果:
| Section | Event | Description |
| HttpModule | BeginRequest |
一个新的请求第一次经过的事情就是这个事情,而且每次请求都会经过这个时间。 |
| HttpModule | AuthenticateRequest |
在这个事件中.ASP.NET开始验证用户。所有关于权限验证的代码都可以放到这里。 |
| HttpModule | AuthorizeRequest |
在这个事件中.ASP.NET开始验证用户。所有关于权限验证的代码都可以放到这里。 |
| HttpModule | ResolveRequestCache |
在ASP.NET中,页面一般被直接缓存在一个特定的路径。在这个时间http运行时会检查就缓存中获取数据还是从历史记录中获取页面的信息。 |
| HttpModule | AcquireRequestState |
通过这个事件,我们可以处理所有的Sesesion数据。 |
| HttpModule | PreRequestHandlerExecute |
在把权利移交给handler之前,你需要做的逻辑都可以放在这个事件里面。 |
| HttpHandler | ProcessRequest |
在这个事件我们可以为每个扩展写自己的逻辑处理代码。 |
| Page | Init |
通过这个事件我么可以做到以下几点: 1,创建自定义控件。2.任何初始化的设置。3,初始化Masterpage.在这个事件中我们是没有权限去处理ViewState和Postback的值的。 |
| Page | Load |
到了这个事件就表明所有的控件都加载完毕。你可以对初始化后的控件做一些UI上的改变。 |
| Page | Validate |
如果在你的页面中有验证的控件。那么就会在这个事件中进行验证。 |
| Page | Render |
在这个事件中你可以对即将返回给浏览器的HTML代码进行处理。 |
| Page | Unload |
将Page对象就内存中释放。 |
| HttpModule | PostRequestHandlerExecute |
任何当handler处理完以后的逻辑都可以放到这里。 |
| HttpModule | ReleaserequestState |
保存更新后的值。比如Session。 |
| HttpModule | UpdateRequestCache |
更新缓存。 |
| HttpModule | EndRequest | 这个事件结束后,请求的结果就会被发送到客户的浏览器。 |

浙公网安备 33010602011771号