(英文翻译)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 这个事件结束后,请求的结果就会被发送到客户的浏览器。

 

 

 

posted @ 2012-06-21 12:54  38号码农  阅读(245)  评论(0)    收藏  举报