HttpApplication對象
HttpApplication是一個(gè)基類(lèi),代表運行中的ASP.NET應用程序。運行中的ASP.NET應用程序由動(dòng)態(tài)創(chuàng )建的繼承于HttpApplication的類(lèi)來(lái)表示。如果global.asax存在,那么通過(guò)解析其內容,可以創(chuàng )建動(dòng)態(tài)生成的應用程序類(lèi)的源代碼。如果global.asax可用,應用程序類(lèi)便會(huì )被創(chuàng )建,并根據它命名為ASP.global_asax。否則,會(huì )使用基類(lèi)HttpApplication。 HttpApplication派生類(lèi)的實(shí)例負責管理分配給它的請求的整個(gè)生命周期。只有在該請求處理完畢后,該實(shí)例才會(huì )被重用。HttpApplication維護著(zhù)一系列HTTP模塊對象,這些對象可以對請求的內容進(jìn)行篩選,甚至還可以進(jìn)行修改。在請求穿越管道的過(guò)程中,可能隨時(shí)會(huì )調用已注冊的模塊。 HttpApplication對象能判斷代表被請求資源的對象類(lèi)型(一般可能是ASP.NET頁(yè)面、Web服務(wù)或用戶(hù)控件)。隨后,HttpApplication使用相應的處理程序工廠(chǎng)獲取代表被請求資源的對象。工廠(chǎng)可能使用現有的程序集,實(shí)例化被請求資源的類(lèi)的實(shí)例,也可能先動(dòng)態(tài)創(chuàng )建所需程序集,然后再實(shí)例化該對象。處理程序工廠(chǎng)對象是實(shí)現IHttpHandlerFactory接口的類(lèi)的實(shí)例,負責返回處理HTTP請求的托管對象——HTTP處理程序。一個(gè)ASP.NET頁(yè)面只是一個(gè)處理程序對象(即,實(shí)現IHttpHandler接口的類(lèi)的實(shí)例)。
頁(yè)面工廠(chǎng)
HttpApplication類(lèi)會(huì )確定要處理的請求的對象類(lèi)型,并委托與該類(lèi)型相關(guān)的處理程序工廠(chǎng)創(chuàng )建其新的實(shí)例。如果被請求的資源是頁(yè)面,會(huì )發(fā)生什么情況呢? 一旦HttpApplication對象掌管了請求,就必須選擇一個(gè)合適的處理程序,并創(chuàng )建該處理程序的實(shí)例。對于面向頁(yè)面的請求,對應的工廠(chǎng)名為PageHandlerFactory。為找到合適的處理程序,HttpApplication會(huì )讀取配置文件<httpHandlers>區段中的信息。
幾個(gè)主要的已注冊處理程序:
處理程序工廠(chǎng)不會(huì )在每次調用被請求資源時(shí)都進(jìn)行編譯操作。已編譯代碼被存儲在Web服務(wù)器的ASP.NET臨時(shí)目錄中,只要相應資源文件沒(méi)有被更改,便會(huì )被一直重用下去(這種效果得益于對“工廠(chǎng)模式”的使用)。 因此,接到請求時(shí),頁(yè)面處理工廠(chǎng)會(huì )創(chuàng )建代表被請求頁(yè)面的對象實(shí)例。如前所述,頁(yè)面對象繼承于System.Web.UI.Page類(lèi),而該類(lèi)實(shí)現了IHttpHandler接口。頁(yè)面對象會(huì )被返回應用程序工廠(chǎng),隨后被傳回給HttpRuntime對象。最后的步驟由ASP.NET運行庫完成,ASP.NET運行庫會(huì )調用IHttpHandler的頁(yè)面對象的ProcessRequest方法。這會(huì )使頁(yè)面執行用戶(hù)定義的代碼,并為瀏覽器生成標記。
頁(yè)面的處理指令
頁(yè)面指令的處理用于配置執行該頁(yè)面的運行時(shí)環(huán)境。在A(yíng)SP.NET中,指令可以位于頁(yè)面的任何位置,但良好且常見(jiàn)的習慣是將其置于文件的開(kāi)始部分。除此,頁(yè)面指令的名稱(chēng)是不區分大小寫(xiě)的,且指令的屬性(attribute)值也不必加引號。@Page是ASP.NET中最重要的也是最常用的指令。列出了所有ASP.NET指令。
除@Page、@PreviousPageType、@Master、@MasterType和@Control外,所有指令都可以在頁(yè)面和控件中聲明。@Page和@Control是互斥的:@Page僅能用在.aspx文件中,而@Control指令僅能用在.ascx文件中。@Master用于定義一種非常特殊的頁(yè)面——母版頁(yè)(master page)。 處理指令的語(yǔ)法較特殊,但對于所有指令類(lèi)型都是一致的。多個(gè)屬性(attribute)必須用空白分割,屬性與值間的等號(=)兩邊不能有空白,如下所示:
<%@ Directive_Name attribute="value" [attribute="value" … ] %>
每種指令都有自己類(lèi)型化的屬性集合。將錯誤類(lèi)型的值賦給一個(gè)屬性,或在某個(gè)屬性中使用錯誤的屬性,都會(huì )導致編譯錯誤。
要點(diǎn):指令的屬性?xún)热菘偸且约兾谋镜男问奖唤馕?。然而,對于某些屬性,應包含能夠被解析為特?NET Framework類(lèi)型的值。當ASP.NET頁(yè)面被解析時(shí),所有指令屬性 會(huì )被提取,并存儲在一個(gè)字典中。屬性的名稱(chēng)和數目必須與該指令所對應模式相匹配。只要用字符串表示的屬性值能夠被轉換為目標類(lèi)型,那么它便是有效的。例如,如果某個(gè)屬性只接受布爾(Boolean)類(lèi)型的值,則只有true和false是有效的。
Page類(lèi)
在.NET Framework中,Page類(lèi)提供了ASP.NET應用程序從.aspx文件創(chuàng )建的所有對象的基本行為。Page類(lèi)在System.Web.UI命名空間中進(jìn)行了定義,該類(lèi)派生自TemplateControl并實(shí)現了IHttpHandler接口:
public class Page : TemplateControl, IhttpHandler
具體說(shuō)來(lái),TemplateControl是抽象類(lèi),為ASP.NET頁(yè)面和用戶(hù)控件提供了一組基本的功能。在繼承層次的上一層,我們會(huì )發(fā)現Control類(lèi)。它定義了由ASP.NET服務(wù)器端元素(頁(yè)面、控件和用戶(hù)控件)共享的屬性、方法和事件。 從一個(gè)實(shí)現INamingContainer的類(lèi)(TemplateControl)派生,Page還充當其所有組成控件的“命名容器”。在.NET Framework中,控件的命名容器是實(shí)現INamingContainer接口的第一父控件。對于任何一個(gè)實(shí)現命名容器接口的類(lèi),ASP.NET會(huì )創(chuàng )建一個(gè)新的虛擬命名空間,以便確??丶?shù)中的所有子控件有唯一的名稱(chēng)(對于GataGrid之類(lèi)的迭代式數據綁定控件和用戶(hù)控件,這是一個(gè)非常重要的特性)。 Page類(lèi)還實(shí)現了IHttpHandler接口的方法,從而可以充當一種特定類(lèi)型(針對.aspx文件)的HTTP請求處理程序。IHttpHandler接口的關(guān)鍵成員為ProcessRequest方法,ASP.NET會(huì )調用該方法發(fā)起對頁(yè)面的處理,真正地對請求進(jìn)行處理。
提示:INamingContainer是一個(gè)沒(méi)有方法的標志性接口。然而僅僅因為它的存在,才使得ASP.NET運行庫創(chuàng )建額外的命名空間,對實(shí)現它的頁(yè)面(或控件)的子控件進(jìn)行命名。Page類(lèi)是所有頁(yè)面控件的命名容器,當然,本身實(shí)現INamingContainer接口的控件或實(shí)現該接口的子控件除外。
內部對象
聯(lián)系客服