asp.net应用程序生命周期总结

要想使asp.net应用程序达到预期的效果,了解整个asp.net应用程序的生命周期是非常重要的,只有了解的各个生命周期,服务器都对这个请求做出来何种响应,我们才能编写出合适的代码来更好的完成工作.

1.asp.net应用程序通常以客户端(浏览器)向web服务器(对于asp.net应用程序,通常为IIS)发起请求作为生命周期的起点.当IIS接收到请求后,会对请求的文件的文件扩展名进行检查,以确定这个请求应该交由哪个ISAPI扩展来进行处理.asp.net也是web服务器下的一种ISAPI扩展.然后会将该请求传递到合适的ISAPI扩展.asp.net仅处理那些已经映射到其上的文件扩展名,如:aspx,ashx,asmx,ascx等.如果文件扩展名尚未映射到asp.net上,则asp.net不会处理这个请求.如果要创建服务于特定文件扩展名的自定义处理程序,必须在 IIS 中将该扩展名映射到 ASP.NET,还必须在应用程序的 Web.config 文件中注册该处理程序。例如扩展名为aspx的文件名,IIS已经把*.aspx映射到了asp.net这个ISAPI扩展上,如下图所示ISAPI会根据不通的情况将这个请求交的以下的处理程序来对这个这个请求进行处理.

图-1

2.asp.net接收到请求之后,ApplicationManager类会创建一个应用程序域,在应用程序域中,将创建一个HostingEvironment的实例.

3.创建了应用程序域并对 HostingEnvironment 对象进行了实例化之后,ASP.NET 将创建并初始化核心对象,如 HttpContext、HttpRequest 和 HttpResponse。HttpContext 类包含特定于当前应用程序请求的对象,如 HttpRequest 和 HttpResponse 对象。HttpRequest 对象包含有关当前请求的信息,包括 Cookie 和浏览器信息。HttpResponse 对象包含发送到客户端的响应,包括所有呈现的输出和 Cookie。

4.初始化所有核心应用程序对象之后,将通过创建 HttpApplication 类的实例启动应用程序.如果应用程序具有 Global.asax 文件,则 ASP.NET 会创建 Global.asax 类(从 HttpApplication 类派生)的一个实例,并使用该派生类表示应用程序.

第一次在应用程序中请求 ASP.NET 页或进程时,将创建 HttpApplication 的一个新实例.不过,为了尽可能提高性能,可对多个请求重复使用 HttpApplication 实例.创建HttpApplication的实例时,将同时创建所有已配置的模块,即实现了IHttpModule接口的处理程序.然后调用HttpApplication 类的 Init 方法.对于每一个HttpApplacation实例都会调用一次该实例的Init方法.

一个HttpApplacation实例每次只能处理一个请求,而ASP.NET是支持一定的并发请求的,所以HttpApplication的实例在不够响应并发请求时会被创建多个来响应不同的请求,而每个HttpApplication实例在被创建后都会创建一组新的IHttpModule并调用IHttpModule的Init方法.

5.HttpAppliction的实例拥有一些事件和方法,其中Application_Start和Appcation_End,在整个应用程序的生命周期中只会执行一次.

6.Application_BeginRequest事件触发以后将请求发送给实现了IHttpHandler的处理程序中进行处理.

7.根据图-1所示,对于请求一个aspx文件扩展名的文件,ISAPI会交由System.Web.UI.PageHandlerFactory这个处理程序来处理,System.Web.UI.PageHandlerFactory实现了IHttpHandlerFactory接口.它创建从 Page 类继承并实现 IHttpHandler 接口的类的实例。 实例被动态地创建以处理针对 ASP.NET 文件的请求。 PageHandlerFactory 类是 ASP.NET 页的默认处理程序工厂实现.

IHttphandlerFactory接口有两个公开的成员:

GetHandler(),返回一个实现了IHttpHandler的类的实例.

ReleaseHandler,使工厂可以重用现有的处理程序实例,需要为其传递一个要重用的IHttpHandler对象。

通过System.Web.UI.PageHandlerFactory工厂,可以取得一个实现了IHttpHandler接口的处理程序.每个aspx页面都继承字System.Web.UI.Page类,System.Web.UI.Page类实现了IHttpHandler接口.故而对于扩展名为aspx的请求,最终都会传递到System.Web.UI.Page类中ProcessRequest(HttpContex context)中进行处理.

8.在System.Web.UI.Page类的ProcessRequest(HttpContex context)中,会依次触发以下的事件,以下为asp.net页的生存周期

  (1)Page的Init事件,初始化页面上的所有控件.依次触发PreInit,Init,InitCompelete等事件.

  (2)LoadPageStateFromPersistenceMedium(),将页面保存的ViewState状态信息加载到Page对象,ViewState中保存了页面上所有的服务器控件的值,由于每个服务器控件都拥有唯一的ID,通过ID来从ViewState中取得与服务器控件对应的值,并将ViewState中的值赋值给相对应的服务器控件.

  (3)加载页面,依次此触发PreLoad,Load,事件回发处理程序,LoadCompelete.

  (4)事件回发处理程序,即触发引发此次请求的控件的事件处理程序,如:button控件的Click事件.注意引发这个事件之后才会触发LoadCompelete.

  (5)触发PreRender事件.

  (7)保存ViewState,将控件上的值更新到ViewState中.保存ViewState之后触发SaveStateCompelete事件,

  (8)触发Render事件,渲染页面,并呈现.

  (9)Unload事件

9.至此,请求完成.触发Application_EndRequestion事件.如果整个应用程虚抛出未经处理的异常,我们可以在Application_Error中进行处理:

protected void Application_Error(object sender, EventArgs e)
{
        HttpApplication source = (HttpApplication)sender;
        Exception ex = source.Server.GetLastError();
        source.Context.Response.Write(ex.ToString()  + "<br/>");
        source.Server.ClearError(); 
}

10.触发Application_End事件,卸载应用程序.

以上即为我理解asp.net应用程序的生命周期.

posted @ 2011-08-21 12:36  .Sure  阅读(514)  评论(0编辑  收藏  举报