HttpApplication对象
HttpApplication是一个基类,代表运行中的ASP.NET应用程序。运行中的ASP.NET应用程序由动态创建的继承于HttpApplication的类来表示。如果global.asax存在,那么通过解析其内容,可以创建动态生成的应用程序类的源代码。如果global.asax可用,应用程序类便会被创建,并根据它命名为ASP.global_asax。否则,会使用基类HttpApplication。 HttpApplication派生类的实例负责管理分配给它的请求的整个生命周期。只有在该请求处理完毕后,该实例才会被重用。HttpApplication维护着一系列HTTP模块对象,这些对象可以对请求的内容进行筛选,甚至还可以进行修改。在请求穿越管道的过程中,可能随时会调用已注册的模块。 HttpApplication对象能判断代表被请求资源的对象类型(一般可能是ASP.NET页面、Web服务或用户控件)。随后,HttpApplication使用相应的处理程序工厂获取代表被请求资源的对象。工厂可能使用现有的程序集,实例化被请求资源的类的实例,也可能先动态创建所需程序集,然后再实例化该对象。处理程序工厂对象是实现IHttpHandlerFactory接口的类的实例,负责返回处理HTTP请求的托管对象——HTTP处理程序。一个ASP.NET页面只是一个处理程序对象(即,实现IHttpHandler接口的类的实例)。
页面工厂
HttpApplication类会确定要处理的请求的对象类型,并委托与该类型相关的处理程序工厂创建其新的实例。如果被请求的资源是页面,会发生什么情况呢? 一旦HttpApplication对象掌管了请求,就必须选择一个合适的处理程序,并创建该处理程序的实例。对于面向页面的请求,对应的工厂名为PageHandlerFactory。为找到合适的处理程序,HttpApplication会读取配置文件<httpHandlers>区段中的信息。
几个主要的已注册处理程序:
处理程序工厂不会在每次调用被请求资源时都进行编译操作。已编译代码被存储在Web服务器的ASP.NET临时目录中,只要相应资源文件没有被更改,便会被一直重用下去(这种效果得益于对“工厂模式”的使用)。 因此,接到请求时,页面处理工厂会创建代表被请求页面的对象实例。如前所述,页面对象继承于System.Web.UI.Page类,而该类实现了IHttpHandler接口。页面对象会被返回应用程序工厂,随后被传回给HttpRuntime对象。最后的步骤由ASP.NET运行库完成,ASP.NET运行库会调用IHttpHandler的页面对象的ProcessRequest方法。这会使页面执行用户定义的代码,并为浏览器生成标记。
页面的处理指令
页面指令的处理用于配置执行该页面的运行时环境。在ASP.NET中,指令可以位于页面的任何位置,但良好且常见的习惯是将其置于文件的开始部分。除此,页面指令的名称是不区分大小写的,且指令的属性(attribute)值也不必加引号。@Page是ASP.NET中最重要的也是最常用的指令。列出了所有ASP.NET指令。
除@Page、@PreviousPageType、@Master、@MasterType和@Control外,所有指令都可以在页面和控件中声明。@Page和@Control是互斥的:@Page仅能用在.aspx文件中,而@Control指令仅能用在.ascx文件中。@Master用于定义一种非常特殊的页面——母版页(master page)。 处理指令的语法较特殊,但对于所有指令类型都是一致的。多个属性(attribute)必须用空白分割,属性与值间的等号(=)两边不能有空白,如下所示:
<%@ Directive_Name attribute="value" [attribute="value" … ] %>
每种指令都有自己类型化的属性集合。将错误类型的值赋给一个属性,或在某个属性中使用错误的属性,都会导致编译错误。
要点:指令的属性内容总是以纯文本的形式被解析。然而,对于某些属性,应包含能够被解析为特定.NET Framework类型的值。当ASP.NET页面被解析时,所有指令属性 会被提取,并存储在一个字典中。属性的名称和数目必须与该指令所对应模式相匹配。只要用字符串表示的属性值能够被转换为目标类型,那么它便是有效的。例如,如果某个属性只接受布尔(Boolean)类型的值,则只有true和false是有效的。
Page类
在.NET Framework中,Page类提供了ASP.NET应用程序从.aspx文件创建的所有对象的基本行为。Page类在System.Web.UI命名空间中进行了定义,该类派生自TemplateControl并实现了IHttpHandler接口:
public class Page : TemplateControl, IhttpHandler
具体说来,TemplateControl是抽象类,为ASP.NET页面和用户控件提供了一组基本的功能。在继承层次的上一层,我们会发现Control类。它定义了由ASP.NET服务器端元素(页面、控件和用户控件)共享的属性、方法和事件。 从一个实现INamingContainer的类(TemplateControl)派生,Page还充当其所有组成控件的“命名容器”。在.NET Framework中,控件的命名容器是实现INamingContainer接口的第一父控件。对于任何一个实现命名容器接口的类,ASP.NET会创建一个新的虚拟命名空间,以便确保控件树中的所有子控件有唯一的名称(对于GataGrid之类的迭代式数据绑定控件和用户控件,这是一个非常重要的特性)。 Page类还实现了IHttpHandler接口的方法,从而可以充当一种特定类型(针对.aspx文件)的HTTP请求处理程序。IHttpHandler接口的关键成员为ProcessRequest方法,ASP.NET会调用该方法发起对页面的处理,真正地对请求进行处理。
提示:INamingContainer是一个没有方法的标志性接口。然而仅仅因为它的存在,才使得ASP.NET运行库创建额外的命名空间,对实现它的页面(或控件)的子控件进行命名。Page类是所有页面控件的命名容器,当然,本身实现INamingContainer接口的控件或实现该接口的子控件除外。
内部对象