ASP.NET頁(yè)面對(duì)象模型:Page類介紹
ASP.NET頁(yè)面對(duì)象模型簡(jiǎn)介
Microsoft Internet 信息服務(wù) (IIS) 所收到的對(duì)某 Microsoft ASP.NET 頁(yè)面的每個(gè)請(qǐng)求都被移交給 ASP.NET HTTP 管線。HTTP 管線由一系列托管對(duì)象組成,這些對(duì)象按順序處理該請(qǐng)求,并完成從 URL 到普通 HTML 文本的轉(zhuǎn)換。HTTP 管線的入口點(diǎn)是 HttpRuntime 類。ASP.NET 基礎(chǔ)結(jié)構(gòu)為輔助進(jìn)程中所承載的每個(gè) AppDomain 創(chuàng)建此類的一個(gè)實(shí)例(請(qǐng)注意,該輔助進(jìn)程為當(dāng)前正在運(yùn)行的每個(gè) ASP.NET 應(yīng)用程序維護(hù)一個(gè)不同的 AppDomain)。
HttpRuntime 類從內(nèi)部池中選取一個(gè) HttpApplication 對(duì)象,并讓其處理該請(qǐng)求。HTTP 應(yīng)用程序管理器所完成的主要任務(wù)就是找出將實(shí)際處理該請(qǐng)求的類。如果請(qǐng)求 .aspx 資源,則處理程序就是一個(gè)頁(yè)面處理程序 — 即某個(gè)繼承自 Page 的類的一個(gè)實(shí)例。資源類型和處理程序類型之間的關(guān)聯(lián)關(guān)系存儲(chǔ)于該應(yīng)用程序的配置文件中。更準(zhǔn)確地說(shuō),在 machine.config 文件的 < httpHandlers> 部分中定義默認(rèn)的一組映射關(guān)系。然而,應(yīng)用程序也可以在本地的 web.config 文件中自定義自己的 HTTP 處理程序列表。下面的程序行舉例說(shuō)明了定義用于 .aspx 資源的 HTTP 處理程序的代碼。
- < add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
擴(kuò)展名可關(guān)聯(lián)到一個(gè)處理程序類,或者更普遍地關(guān)聯(lián)到一個(gè)處理程序工廠 (handler factory) 類。在所有情況下,負(fù)責(zé)處理請(qǐng)求的 HttpApplication 對(duì)象都會(huì)獲得一個(gè)實(shí)現(xiàn) IHttpHandler 接口的對(duì)象。如果根據(jù) HTTP 處理程序來(lái)解析關(guān)聯(lián)資源/類,那么所返回的類將直接實(shí)現(xiàn)該接口。如果資源綁定到處理程序工廠,則需要另外一個(gè)步驟。處理程序工廠類實(shí)現(xiàn) IHttpHandlerFactory 接口,而該接口的 GetHandler 方法返回一個(gè)基于 IHttpHandler 的對(duì)象。
HTTP 運(yùn)行時(shí)如何能完成整個(gè)循環(huán)并處理頁(yè)面請(qǐng)求呢?IHttpHandler 接口特別提供了 ProcessRequest 方法。通過(guò)對(duì)代表所請(qǐng)求頁(yè)面的對(duì)象調(diào)用此方法,ASP.NET 基礎(chǔ)結(jié)構(gòu)啟動(dòng)相應(yīng)過(guò)程,從而針對(duì)瀏覽器生成輸出。
ASP.NET頁(yè)面對(duì)象模型:Page類
特定頁(yè)面的 HTTP 處理程序類型取決于 URL。當(dāng)***調(diào)用 URL 時(shí),將構(gòu)建一個(gè)新類并將該類動(dòng)態(tài)地編譯成一個(gè)程序集。用于檢查 .aspx 來(lái)源的語(yǔ)法分析過(guò)程的輸出結(jié)果就是該類的源代碼。該類被定義為 ASP 命名空間的一部分,并被賦予一個(gè)與原始 URL 相似的名稱。例如,如果 URL 終結(jié)點(diǎn)是 page.aspx,則類名稱為 ASP.Page_aspx。但是,也可通過(guò)編程設(shè)置 @Page 指令的 ClassName 屬性來(lái)控制類的名稱。
HTTP 處理程序的基類是 Page。此類定義了所有頁(yè)面處理程序所共享的方法和屬性的最小集合。Page 類中實(shí)現(xiàn) IHttpHandler 接口。
在某些情況下,實(shí)際處理程序的基類并非 Page,而是一個(gè)不同的類。例如,如果使用了代碼隱藏,就會(huì)出現(xiàn)這種情況。代碼隱藏是一種開(kāi)發(fā)方法,它將頁(yè)面所需的代碼封裝到一個(gè)單獨(dú)的 C# 或 Microsoft Visual Basic.NET 類中。頁(yè)面的代碼就是一組事件處理程序和幫助器方法,用以實(shí)際創(chuàng)建該頁(yè)面的行為??梢岳?< script runat=server> 標(biāo)記將這種代碼定義為內(nèi)聯(lián)代碼,或者也可將其放到一個(gè)外部類 — 代碼隱藏類中。代碼隱藏類是一種繼承自 Page 的類,但這種類具有一些額外的方法因而比較特殊。如果指定,代碼隱藏類就用作 HTTP 處理程序的基類。
還有一種情況,即當(dāng)應(yīng)用程序配置文件的 < pages> 部分中重新定義了 PageBaseType 屬性時(shí),HTTP 處理程序也不是基于 Page 的。
- < pages PageBaseType="Classes.MyPage, mypage" />
PageBaseType 屬性指出了包含頁(yè)面處理程序的基類的類型以及程序集。派生自 Page 的這個(gè)類可自動(dòng)給處理程序賦予一組自定義和擴(kuò)展的方法和屬性。
以上就對(duì)ASP.NET頁(yè)面對(duì)象模型做了一些簡(jiǎn)單的介紹。
【編輯推薦】