** 作者 ** : Dino Esposito 、 Wintellect
** 时间 ** : 2003 年 8 月
** 应用于 ** : Microsoft ASP.NET
** 摘要 ** :
讨论关于建立 ASP.NET Web 页的事件模型和转化为 HTML 的各个过程的细节。 ASP.NET HTTP 运行时管理着把请求 URL 转换成一个页面类的具体实例的对象管道,接下来把这些实例转换成一般的 HTML 文本格式。本文对代表各个页面生命周期的事件、怎么控制页面执行、开发人员怎么干预这些标准行为的执行过程进行了讲解。
** 介绍 ** ** **
每当请求 IIS 容纳的 ASP.NET 页时,总是要把请求转交给了 ASP.NET HTTP 管道。 HTTP 管道是一组被控对象,这些对象按顺序处理请求并且把这些请求转换成一般 HTML 文本。 HTTP 管道的入口是 HttpRuntime 类。 ASP.NET 的底层结构为每一个应用程序域 ( AppDomain )的工作进程建立了一个这个类( HttpRuntime )的实例(注意,一个工作进程只能支持一个正在运行的 ASP.NET 应用域)。
HttpRuntime 类从内部程序池中选择一个 HttpApplcation 对象,并且在接收到请求的时候使它工作。 Http 应用管理程序的主要工作是寻找这样的类使之能够处理请求。例如:当请求一个 .aspx 资源时,处理句柄就是一个从 Page 继承类的实例。请求资源的类型和相关处理句柄的关系映射表被保存在应用程序的配置文件里。更确切的说,这个映射表就定义在 machie.config 里的
1<httphandlers> 一节里。但是,应用程序能在 web.config 里对这个 HTTP 处理句柄映射列表进行重定义。下面这行语句说明了定义 .aspx 资源请求的处理句柄:
2
3<add path="”*.aspx”" type="”System.Web.UI.PageHandlerFactroy”/" verb="”*”">
4
5一个扩展可以和一个句柄类联系起来,更一般说,是和一个句柄工厂类相联系。在所有情况下,负责处理请求的 HttpApplication 对象得到一个从 IHttpHandler 接口具体实现的对象。如果是根据 HTTP 句柄来处理资源和相关处理类的关系,则返回类是直接实现相关的接口的;如果资源是绑定到一个句柄工厂的话,将必须经过另外一个阶段:具体实现 IHttpHandlerFactory 接口的句柄工厂类的 GetHandler 方法将返回一个基于 IHttpHandler 的对象。
6
7Http 运行时怎么结束一个周期或关闭一个页面请求的进程呢? IHttpHandler 接口的 ProcessRequest 方法拥有这个功能。调用代表被请求页面的对象的该方法, ASP.NET 底层结构打开一个进程来为浏览器产生输出。
8
9** Page ** ** 类 ** ** **
10
11** **
12
13一个页面的 HTTP 处理句柄的类型取决于 URL 。当这个 URL 被首次访问,一个新的类将被构建并动态的编译成一个程序集。一个分析 aspx 文件的进程从 aspx 文件中分离出这个类的代码。在默认情况下,这个类被加入到一个叫做 asp 的名字空间里,并且把 URL 作为这个类的类名。例如,如果请求的 URL 是 page.aspx ,则这个类就是 ASP.Page_aspx 。这个类名,可以通过设置 @Page 预处理指令的 ClassName 属性来修改。
14
15HTTP 句柄的基础类是 Page 类。这个类定义了一组最小方法和属性集,这些方法和属性被所有的页面处理句柄所共享。 Page 类具体实现了 IHttpHandler 接口。
16
17在另外一种和上述相对应的情况中,实际处理页面的句柄的基础类并不是 Page 类,而是一个别的类。当使用后代码模式时,这个情况就发生了。后代码是一种将 C# 或 VB.NET 代码和页面分离的技术。页面代码是一组事件处理句柄和其他一些方法的集合,这些方法定义了页面的各种行为。这些代码可以以内联形式用 <script runat="server"></script></add></httphandlers>