欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
領(lǐng)先技術(shù)-ASP.NET 頁(yè)面的服務(wù)器端 by Dino Esposito
領(lǐng)先技術(shù)-ASP.NET 頁(yè)面的服務(wù)器端
作為一名 ASP.NET 開(kāi)發(fā)人員,您可能非常清楚 ASP.NET 如何處理 .aspx 資源中的代碼,如何對標記進(jìn)行分析并將其動(dòng)態(tài)轉換成 Visual Basic® 或 C# 類(lèi),等等。但是接下來(lái)呢?ASP.NET 生成的文件保存在哪里?如何利用它們滿(mǎn)足頁(yè)面請求?從上個(gè)月起,我開(kāi)始關(guān)注這一過(guò)程。在本月的內容中,我將對服務(wù)器上所發(fā)生的操作進(jìn)行分析,以便您能夠避免某些常見(jiàn)的問(wèn)題隱患。 我將討論 ASP.NET 臨時(shí)文件的存儲以及動(dòng)態(tài)生成的用于為頁(yè)面響應提供服務(wù)的類(lèi)的源代碼。此外,我還將構建一個(gè)可以與任何 ASP.NET 2.0 或 ASP.NET AJAX(原代號為“Atlas”)應用程序一同使用的資源管理器工具,以查看和調試您的頁(yè)面執行的實(shí)際代碼。但在此之前,您需要了解幾個(gè)事項。(和上月專(zhuān)欄一樣,本部分內容主要以那些沒(méi)有文檔記錄的 ASP.NET 工作原理細節為基礎來(lái)展開(kāi)。這些實(shí)施細節在未來(lái)的 Microsoft® .NET Framework 版本中可能會(huì )發(fā)生變化。)
Temporary ASP.NET Files 文件夾中保存的是什么內容?
ASP.NET 頁(yè)面請求的處理過(guò)程需要使用一些臨時(shí)文件。當您在 Web 服務(wù)器上安裝 ASP.NET 2.0 時(shí),所創(chuàng )建的文件夾層次結構如下:%WINDOWS%\Microsoft.NET\Framework\v2.0.50727
這里的版本號指的是 ASP.NET 2.0 的零售版。ASP.NET 的每個(gè)發(fā)布版本(包括每個(gè)過(guò)渡性的內部版本)都有一個(gè)唯一的版本號,并且會(huì )創(chuàng )建不同的文件夾樹(shù),以便支持不同版本的并行執行。因此,您務(wù)必要指定您的應用程序所適用的 ASP.NET 版本,這一點(diǎn)極為重要。在 ASP.NET 1.x 和 ASP.NET 2.0 下運行的應用程序基于物理形式上獨立的文件夾。在 Microsoft.NET\Framework 文件夾下,您會(huì )找到與已安裝的 ASP.NET 版本數相同數量的 vX.X.XXXX 子文件夾(請參見(jiàn)圖 1)。
圖 1 ASP.NET 1.0、1.1、2.0 和 3.0 運行庫文件 (單擊該圖像獲得較小視圖)
圖 1 ASP.NET 1.0、1.1、2.0 和 3.0 運行庫文件 (單擊該圖像獲得較大視圖)
在已安裝版本的根文件夾下,您會(huì )看到許多子目錄。CONFIG 文件夾包含計算機配置文件,其中包括 machine.config 和用于所有站點(diǎn)的基本 web.config 文件。名為 ASP.NETWebAdminFiles 的文件夾包含構成網(wǎng)站管理工具的源文件,您可從 Visual Studio® 2005 內部運行該工具。最后,Temporary ASP.NET Files 文件夾包含為頁(yè)面和資源提供服務(wù)而創(chuàng )建的所有臨時(shí)文件和程序集。要找到為您的 Web 頁(yè)面動(dòng)態(tài)創(chuàng )建的文件,您需要查看此文件夾子樹(shù)。請注意,Temporary ASP.NET Files 目錄是存放動(dòng)態(tài)創(chuàng )建的文件的默認位置,但可以使用 web.config 文件中的 <compilation> 部分按應用程序對其進(jìn)行配置:<compilation tempDirectory="d:\MyTempFiles" />
當應用程序第一次在計算機上執行時(shí),在臨時(shí)文件目錄下就會(huì )創(chuàng )建一個(gè)新的子文件夾。編譯子文件夾的名稱(chēng)與應用程序的 IIS 虛擬目錄的名稱(chēng)相同。如果您只是使用 Visual Studio 2005 內嵌的 Web 服務(wù)器測試應用程序,那么子文件夾會(huì )采用該 Web 應用程序的根文件夾的名稱(chēng)。如果您從 Web 服務(wù)器的根文件夾調用頁(yè)面,您將在根子文件夾下找到它們的臨時(shí)文件(請參見(jiàn)圖 2)。
圖 2 Web 測試服務(wù)器上的 WebApp (單擊該圖像獲得較小視圖)
圖 2 Web 測試服務(wù)器上的 WebApp (單擊該圖像獲得較大視圖)
在應用程序的編譯子文件夾下,有一組使用散列名稱(chēng)的目錄。此處顯示了通??梢哉业脚R時(shí)文件的路徑。(最后兩個(gè)目錄包含的是假名稱(chēng),但實(shí)際顯示的就是這樣的名稱(chēng)。)\v2.0.50727\Temporary ASP.NET Files\MyWebApp\3678b103\e60405c7
您可以使用以下語(yǔ)句,以編程的方式檢索指定應用程序的臨時(shí)文件所在的子文件夾的路徑:Dim tempFilesFolder As String = HttpRuntime.CodegenDir
ASP.NET 會(huì )定期在應用程序發(fā)生改變、需要重新編譯時(shí)清理編譯文件夾并刪除陳舊的資源,但 Temporary ASP.NET Files 目錄下的子樹(shù)的大小可能會(huì )顯著(zhù)地增加,在測試計算機上更是如此。 作為管理員,您應密切關(guān)注 Temporary ASP.NET Files 下的目錄,并確保所有目錄都是與當前活動(dòng)的應用程序有關(guān)的。如果您無(wú)意間刪除了一個(gè)處于活動(dòng)狀態(tài)的應用程序的子樹(shù),不必驚慌。您將丟失所有預編譯的頁(yè)面和資源并會(huì )將應用程序重置到其最初的編譯狀態(tài);但下一個(gè)請求將觸發(fā)對每個(gè)頁(yè)面或一批頁(yè)面(具體取決于配置)執行新的編譯過(guò)程,因此最終不會(huì )丟失任何信息或頁(yè)面,只不過(guò)用戶(hù)在處理下一個(gè)請求時(shí)將感覺(jué)到首次命中延遲?,F在,我們來(lái)看某一應用程序的編譯文件夾的內容。
保留文件
對于應用程序中的每個(gè)頁(yè)面,頁(yè)面編譯進(jìn)程會(huì )生成一個(gè)下述名稱(chēng)的文件:[page].aspx.[folder-hash].compiled
[page] 占位符代表 .aspx 資源的名稱(chēng)。[folder-hash] 占位符是一個(gè)散列值,它使文件名保持唯一,避免與原本屬于其他文件夾的同名文件混淆。這種文件稱(chēng)為保留文件,因為它們包含有重要的信息,這些信息可幫助 ASP.NET 運行庫快速檢索程序集以及檢索將用于為頁(yè)面請求提供服務(wù)的 HTTP 處理程序的類(lèi)型名稱(chēng)。此外,保留文件還包含一個(gè)文件散列值,用于檢測自從上次訪(fǎng)問(wèn)后文件的內容是否發(fā)生了改變。
構成某一應用程序的所有 .aspx 頁(yè)面在同一個(gè)臨時(shí)文件夾中進(jìn)行編譯,即使它們名稱(chēng)相同且位于不同的文件夾中也是如此處理。這一點(diǎn)如何實(shí)現?假設您的應用程序包含兩個(gè)名為 test.aspx 的頁(yè)面,位于不同的文件夾 - Folder1 和 Folder2 中。兩個(gè)頁(yè)面將在同一臨時(shí)文件夾中進(jìn)行編譯,但可以通過(guò)它們的散列值對其進(jìn)行區分,由于散列值是根據路徑信息而不只是文件名計算出來(lái)的,因此它們的散列值是不同的。因而最終,兩個(gè) test.aspx 頁(yè)面的保留文件名只在文件夾散列值部分有所不同:Test.aspx.cdcab7d2.compiled
Test.aspx.9d86a5d7.compiled
散列值的內部存儲緩存使 ASP.NET 運行庫可以識別任何指定頁(yè)面 URL 的散列值并快速找到相應的保留文件。如果沒(méi)有找到保留文件,ASP.NET 會(huì )動(dòng)態(tài)編譯頁(yè)面。當您部署沒(méi)有預編譯的應用程序時(shí)就會(huì )發(fā)生這種情況。另一方面,當您對一個(gè)站點(diǎn)進(jìn)行預編譯時(shí),每個(gè)組成頁(yè)面的保留文件被創(chuàng )建并放置在 Bin 文件夾中。
保留文件為純 XML 文件。圖 3 顯示了一個(gè)示例保留文件的內容。
圖 4 具體列出了文件的屬性。<fileDeps> 部分列出了當前頁(yè)面所依賴(lài)的文件。對任何依存關(guān)系所做的任何改動(dòng)都將導致頁(yè)面重新編譯。FileHash 值代表依存關(guān)系狀態(tài)的快照,而 Hash 代表當前頁(yè)面文件狀態(tài)的快照。值得注意的是,當您停止或重新啟動(dòng) Web 應用程序時(shí),完全基于文件更改通知來(lái)檢測文件動(dòng)態(tài)更改的機制會(huì )失敗。按照散列值保存頁(yè)面和依存關(guān)系的狀態(tài),使您可以隨時(shí)檢測到更改。
類(lèi)型 (Type) 屬性設置動(dòng)態(tài)創(chuàng )建的類(lèi)(將用于為請求提供服務(wù))的名稱(chēng)。默認情況下,類(lèi)型名稱(chēng)是 ASP.[page]_aspx,其中 [page] 代表頁(yè)面文件的名稱(chēng)。但是請注意,您可以通過(guò)設置您的 .aspx 文件的 @Page 指令中的 ClassName 屬性來(lái)更改此名稱(chēng)。根命名空間不會(huì )更改,因此類(lèi)型名稱(chēng)可以是 ASP.[ClassName]。
程序集 (Assembly) 屬性指示動(dòng)態(tài)創(chuàng )建的程序集的名稱(chēng),該程序集包含用于為請求提供服務(wù)的頁(yè)面類(lèi)。此類(lèi)程序集的名稱(chēng)和內容取決于 web.config 文件的 <compilation> 部分中的設置。
默認情況下,應用程序頁(yè)面以批處理模式編譯,這意味著(zhù) ASP.NET 會(huì )嘗試在一個(gè)程序集中容納盡可能多的未編譯頁(yè)面。使用 maxBatchSize 和 maxBatchGeneratedFileSize 屬性可以限制一個(gè)程序集中封裝的頁(yè)面數量以及程序集的總大小。默認情況下,每個(gè)批處理編譯將擁有不超過(guò) 1000 個(gè)頁(yè)面,并且所有程序集都不大于 1MB。一般來(lái)說(shuō),當第一次編譯大量頁(yè)面時(shí),您不應讓用戶(hù)等待太長(cháng)時(shí)間。同時(shí),您不應該在內存中加載大型程序集而只是為一個(gè)小頁(yè)面來(lái)提供服務(wù),或者為每個(gè)頁(yè)面啟動(dòng)編譯。 maxBatchSize 和 maxBatchGeneratedFileSize 屬性可幫助您在首次命中延遲和內存使用之間找到良好的平衡。 如果您選擇站點(diǎn)預編譯(請參閱本雜志 2006 年 1 月 Fritz Onion 的Extreme ASP.NET 專(zhuān)欄),那么您不必擔心首次命中延遲,但您仍應考慮最佳的批處理參數,以避免 Web 服務(wù)器的內存過(guò)載。
當批處理開(kāi)啟時(shí),應用程序中的前 1000 個(gè)頁(yè)面(實(shí)際數量取決于 maxBatchSize)被編譯為名為 App_Web_[random] 的程序集,其中 [random] 是由八個(gè)字符組成的隨機序列。 如果關(guān)閉批處理,則每個(gè)頁(yè)面將產(chǎn)生各自的程序集。程序集的名稱(chēng)如下:App_Web_[page].aspx.[folder-hash].[random].dll
要關(guān)閉批處理,可向 web.config 文件添加以下內容: <compilation batch="false" />
如果您對一個(gè)示例應用程序的編譯文件夾進(jìn)行查看,您會(huì )找到名稱(chēng)中包含 CBMResult 的附帶保留文件,還有一個(gè)具有相同名稱(chēng)的 .ccu 文件,如下所示:test.aspx.cdcab7d2.compiled
test.aspx.cdcab7d2_CBMResult.ccu
test.aspx.cdcab7d2_CBMResult.compiled
列表中的第一個(gè)文件是保留文件。那么其他兩個(gè)作何用途? CCU 代表代碼編譯單元 (Code Compile Unit),是指用于生成動(dòng)態(tài)頁(yè)面類(lèi)的源代碼而創(chuàng )建的 CodeDOM 樹(shù)。 CCU 文件是二進(jìn)制文件,包含經(jīng)序列化的頁(yè)面 CodeDOM 樹(shù)。CBMResult 文件是保留文件,用于檢查 CCU 是否最新、其所在的位置以及它基于哪些文件。
CBMResult 文件由與 ClientBuildManager 類(lèi)通信的模塊(例如,Visual Studio 2005 設計器和 IntelliSense®)來(lái)使用。這些模塊查詢(xún)頁(yè)面的結構來(lái)獲取語(yǔ)句結束信息。CCU 文件會(huì )保留準備為這些請求提供服務(wù)的頁(yè)面的最新 CodeDOM 結構副本。
頁(yè)面類(lèi)動(dòng)態(tài)源代碼
正如上面提到的,.aspx 資源被解析為 Visual Basic 或 C# 類(lèi)。該類(lèi)繼承自 System.Web.UI.Page,或者很可能繼承自某個(gè)從 System.Web.UI.Page 繼承而來(lái)的類(lèi)。事實(shí)上,在大多數常見(jiàn)情形下,動(dòng)態(tài)頁(yè)面類(lèi)具有以下原型:Namespace ASP
Public Class test_aspx
Inherits Test : Implements System.Web.IHttpHandler
End Class
End Namespace
在此例中,Test 類(lèi)在頁(yè)面的代碼文件類(lèi)中定義,它包括您在頁(yè)面的附帶類(lèi)文件中寫(xiě)入的任何事件處理程序和幫助器例程。在您使用 Visual Studio 2005 時(shí)可能已經(jīng)注意到,此代碼文件類(lèi)缺少頁(yè)面成員的定義。對于您在 .aspx 源文件中找到的每個(gè) runat=server 標記,在代碼文件中應定義有相應類(lèi)型的成員。ASP.NET 運行庫系統會(huì )生成 Test 分部類(lèi),包含所有這些成員以及兩個(gè)額外的屬性 - Profile 和 ApplicationInstance。圖 5 顯示了參與為某一 .aspx 資源的請求提供服務(wù)的類(lèi)集。
圖 5 中的類(lèi)跨兩個(gè)不同的源文件。第一個(gè)包含分部類(lèi),用于完善代碼文件中的類(lèi)和由此派生出的用于為請求提供服務(wù)的實(shí)際頁(yè)面類(lèi)。第二個(gè)文件是您在項目中創(chuàng )建的代碼文件的副本。這些文件根據程序集名稱(chēng)而命名。名稱(chēng)的結構如下:[assembly].X.vb。(如果您使用 C#,則為 .cs)X 為從 0 開(kāi)始的遞增索引值,可確保文件名唯一。
如果您查看示例 test.aspx 頁(yè)面的編譯文件夾的內容,您會(huì )發(fā)現創(chuàng )建了第三個(gè)文件,如下例中所示:Namespace __ASP
Friend Class FastObjectFactory_app_web_test_aspx_cdcab7d2_xg83msu0
Private Sub New()
MyBase.New
End Sub
Shared Function Create_ASP_test_aspx() As Object
Return New ASP.test_aspx
End Function
End Class
End Namespace
類(lèi)名稱(chēng)是以字符串 FastObjectFactory 為前綴的頁(yè)面程序集的名稱(chēng)。該類(lèi)具有一個(gè)名為 Create_XXX 的共享函數(如果以 C# 編寫(xiě)則為靜態(tài)函數),其中的 XXX 是要實(shí)例化的頁(yè)面類(lèi)的名稱(chēng)。顧名思義,這是一個(gè)幫助器類(lèi),ASP.NET 運行庫利用其來(lái)加速頁(yè)面實(shí)例的創(chuàng )建 - 這是一個(gè)非常常見(jiàn)的操作。與編譯一個(gè)頁(yè)面相比,創(chuàng )建這種類(lèi)所花費的時(shí)間非常短。另一方面,使用工廠(chǎng)類(lèi)比使用 Activator.CreateInstance 間接創(chuàng )建對象要快得多。
根據批處理編譯設置,工廠(chǎng)類(lèi)的內容會(huì )有所變化。在默認情況下,當批處理開(kāi)啟時(shí),工廠(chǎng)類(lèi)包含與批處理頁(yè)面相同數量的 Create_XXX 函數。工廠(chǎng)類(lèi)的名稱(chēng)與批處理程序集的名稱(chēng)相同:' Used to serve test.aspx
Shared Function Create_ASP_test_aspx() As Object
Return New ASP.test_aspx
End Function
' Used to serve default.aspx
Shared Function Create_ASP_default_aspx() As Object
Return New ASP.default_aspx
End Function
如果批處理關(guān)閉,則工廠(chǎng)類(lèi)與單個(gè)頁(yè)面程序集的名稱(chēng)相同,并且只包含一個(gè)共享函數 - 具體頁(yè)面的 facotry。在這種情況下,應用程序中的每個(gè)頁(yè)面將有自己的工廠(chǎng)類(lèi)。
運行庫公共 API
借助上面討論的信息,探究編譯文件夾的內容就不是非常困難了。但通過(guò)一個(gè)工具來(lái)幫助您快速找到您所需的信息還是非常方便。 我待會(huì )兒將設計一個(gè)用來(lái)導航動(dòng)態(tài)生成的 ASP.NET 應用程序源代碼的資源管理器工具,但首先我們來(lái)看一看 .NET Framework 2.0 中的一些運行庫 API。特別是,以下兩個(gè)類(lèi)可能是您更希望了解的:HttpRuntime 和 ClientBuildManager。
HttpRuntime 類(lèi)具有大量共享屬性,可返回關(guān)于包括當前應用程序的 Bin 文件夾、ASP.NET 安裝路徑、編譯文件夾和當前 AppDomain ID 在內的各種系統路徑的信息。您還可以使用以下代碼輕松獲取當前 AppDomain 中加載的程序集列表:Dim listOfAssemblies() As Assembly
listOfAssemblies = AppDomain.CurrentDomain.GetAssemblies()
此代碼并非特定于 ASP.NET,但當從 ASP.NET 應用程序內部調用時(shí),它將返回包含 AppDomain 中的程序集的數組,其中包括為您的頁(yè)面生成的所有程序集。
ClientBuildManager 類(lèi)沒(méi)有多少信息一類(lèi)的屬性,CodeGenDir 屬性除外,該屬性返回與 HttpRuntime 的 CodeGenDir 屬性相同的信息。但 ClientBuildManager 具有許多讀取配置信息(如支持的瀏覽器)的方法和預編譯應用程序的方法。Get 是該類(lèi)中的一個(gè)方法,它返回一列應用程序的目錄(在這些目錄中監視那些會(huì )引發(fā)關(guān)閉 AppDomain 應用程序的重要更改)。這些目錄是:App_Browsers、App_Code、App_GlobalResources、App_WebReferences 和 Bin。
構建資源管理器工具
對于調試,能夠快速訪(fǎng)問(wèn)正在運行的頁(yè)面的源代碼和其他運行時(shí)信息往往非常有用。任何提供這種功能的工具都必須與所有 ASP.NET 應用程序兼容,并且只要求進(jìn)行有限的配置或根本無(wú)需配置。Nikhil Kothari 出色的Web Development Helper 工具如果能夠提供 ASP.NET 運行庫信息,那就非常完美了。該工具作為瀏覽器幫助對象 (BHO) 來(lái)實(shí)現,BHO 是一種用于 Microsoft Internet Explorer® 用戶(hù)界面的基于 COM 的插件。BHO 對于我在本專(zhuān)欄中構建的監視工具將是非常好的宿主環(huán)境,但可惜我偷了些懶,并沒(méi)有這樣做。因此我將我的工具編寫(xiě)為位于頁(yè)面和瀏覽器之間的一個(gè) HTTP 模塊,它可查找查詢(xún)字符串,如果是顯式調用就可發(fā)揮作用。在 ASP.NET 應用程序中安裝 HTTP 模塊只需在 web.config 中增加一行語(yǔ)句,而且可以非常容易地開(kāi)啟和關(guān)閉安裝:<httpModules>
<add name="AspExplorerModule" type="Samples.AspExplorerModule" />
</httpModules>
圖 6 顯示了 Explorer HTTP 模塊的大部分代碼。該模塊注冊使用 PostMapRequestHandler 應用程序事件并與頁(yè)面類(lèi)掛接。PostMapRequestHandler 事件會(huì )在 ASP.NET 運行庫確定了為請求提供服務(wù)所需的 HTTP 處理程序對象時(shí)觸發(fā)。如果請求的查詢(xún)字符串中包含 source=true 參數,并且處理程序是從 System.Web.UI.Page 繼承的一個(gè)類(lèi),那么模塊將開(kāi)始工作。
ASP Explorer 模塊會(huì )與頁(yè)面類(lèi)掛接,并為 PreRenderComplete 事件注冊其自己的處理程序。這樣的設計使得 HTTP 模塊不會(huì )改變請求的運行時(shí)處理,也不會(huì )干預頁(yè)面的編譯。當查詢(xún)字符串指定了 source 參數并將其設置為 true 時(shí),模塊就會(huì )發(fā)揮作用。如圖 6 中所示,模塊所要做的就是使用不太常見(jiàn)的“頁(yè)面”類(lèi)方法 SetRenderMethodDelegate 為頁(yè)面注冊呈現委派 (rendering delegate)。當為頁(yè)面指定了呈現委派時(shí),所封裝的方法會(huì )替代標準呈現處理。換言之,一旦安裝了該模塊,如果使用 test.aspx 進(jìn)行調用,您將看到頁(yè)面的標準輸出;如果您使用 test.aspx?source=true 進(jìn)行調用,您將看到模塊可收集的所有與頁(yè)面有關(guān)的運行時(shí)信息。
ASP Explorer 源代碼定義了一個(gè)類(lèi),以映射當前頁(yè)的保留文件的內容。它會(huì )讀取保留文件,并復制圖 7 所示的類(lèi)中的所有信息。SourceFiles 屬性是設計用于包含頁(yè)面使用的所有源文件的一個(gè)集合。此集合包含從編譯文件夾獲得的保留文件中所沒(méi)有的信息。特別是其中包括與某個(gè)頁(yè)面相關(guān)的 .vb 或 .cs 格式的所有源文件,這些文件名以動(dòng)態(tài)頁(yè)面程序集的名稱(chēng)開(kāi)頭。GetWebPageInfo 方法(請參見(jiàn)圖 6)捕獲所有信息并為 source 模式的請求構建輸出內容。頁(yè)面輸出包括運行時(shí)信息和動(dòng)態(tài)頁(yè)面類(lèi)的源代碼。圖 8 顯示了實(shí)際運行中的 ASP Explorer。
圖 8 實(shí)際運行中的 ASP Explorer 模塊 (單擊該圖像獲得較小視圖)
圖 8 實(shí)際運行中的 ASP Explorer 模塊 (單擊該圖像獲得較大視圖)
示例頁(yè)面分析
既然有了可使用的工具,那么讓我們簡(jiǎn)要查看一下 ASP.NET 為每個(gè) .aspx 文件生成的代碼的結構。值得注意的是,如果沒(méi)有 ASP.NET 運行庫提供的分析和編譯工具,您就必須親自編寫(xiě)代碼來(lái)運行 ASP.NET 頁(yè)面!
動(dòng)態(tài)頁(yè)面類(lèi)(圖 5 中的 test_aspx 類(lèi))改寫(xiě)了 System.Web.UI.Page 類(lèi)中的幾個(gè)方法:FrameworkInitialize、ProcessRequest 和 GetTypeHashCode。ProcessRequest 沒(méi)有什么變化,它只是調用它的基類(lèi)方法。GetTypeHashCode 返回頁(yè)面的散列代碼,該代碼可唯一標識頁(yè)面的控件層次結構。當對頁(yè)面進(jìn)行編譯時(shí),會(huì )動(dòng)態(tài)計算散列值,并將其作為常量插入到源文件。
最值得關(guān)注的是對 FrameworkInitialize 的改寫(xiě)。該方法控制頁(yè)面的控件樹(shù)的創(chuàng )建,并調入一個(gè)名為 __BuildControlTree 的私有方法。此方法使用與 .aspx 源文件中的 runat=server 標記相對應的控件的新實(shí)例來(lái)填充頁(yè)面類(lèi)的 Control 集合。__BuildControlTree 會(huì )分析所有服務(wù)器端標記并為每個(gè)標記構建一個(gè)對象。<asp:textbox runat="server" id="TextBox1" text="Type here" />
以下是為上述標記獲取的典型代碼:Private Function __BuildControlTextBox1() As TextBox
Dim __ctrl As New TextBox()
Me.TextBox1 = __ctrl
__ctrl.ApplyStyleSheetSkin(Me)
__ctrl.ID = "TextBox1"
__ctrl.Text = "Type here"
Return __ctrl
End Function
如果控件有事件處理程序或數據綁定表達式,會(huì )怎樣?讓我們首先來(lái)考慮帶“單擊”事件處理程序的按鈕。您需要增加一行語(yǔ)句:__ AddHandler __ctrl.Click, AddressOf Me.Button1_Click
對于數據綁定表達式 <%# … %>,除了使用了 DataBinding 事件,生成的代碼與之類(lèi)似:AddHandler __ctrl.DataBinding, AddressOf Me.DataBindingMsg
與處理程序相關(guān)的代碼取決于綁定的控件的屬性和要綁定的代碼。對于 Label 控件的 Text 屬性,代碼類(lèi)似于:Public Sub DataBindingMsg(ByVal sender As Object, ByVal e As EventArgs)
Dim target As Label = DirectCast(sender, Label)
target.Text = Convert.ToString(
, _
CultureInfo.CurrentCulture);
End Sub
傳遞給 Convert.ToString 的表達式就是 <%# … %> 表達式中的代碼。強制類(lèi)型轉換還取決于所涉及的類(lèi)型。
如果存在母版頁(yè)和主題,那么源文件的數量和依存關(guān)系列表就會(huì )增大,但借助 ASP Explorer 工具,您可以隨意對其進(jìn)行跟蹤。
總結
ASP.NET 對其擁有的資源類(lèi)型執行按需動(dòng)態(tài)代碼編譯。此功能大大促進(jìn)了 Web 應用程序的快速迭代開(kāi)發(fā),但需要 ASP.NET 才能將文件寫(xiě)到磁盤(pán)。編譯文件夾是一個(gè)重要的文件夾,ASP.NET 的許多神奇之處都在此體現。您可以只是出于興趣對此文件夾研究一番,有時(shí)卻可以利用它來(lái)診斷和調試棘手的問(wèn)題。當然,這里討論的大部分功能是 ASP.NET 內部的功能,因此來(lái)說(shuō),這些功能在未來(lái)版本中可能會(huì )未經(jīng)提醒即進(jìn)行更改。 但截至目前為止,ASP.NET 2.0 的工作原理就是如本文所述的這樣。順便提一下,可以將 ASP Explorer 工具與 ASP.NET AJAX 應用程序一起使用,這一點(diǎn)也請放心。 該工具的運行效果非常好。
將您想向 Dino 詢(xún)問(wèn)的問(wèn)題和提出的意見(jiàn)發(fā)送至  cutting@microsoft.com.
NEW:Explore the sample code online! - or - 代碼下載位置:CuttingEdge2007_01.exe (276KB)
Dino Esposito 是 Solid Quality Learning 的培訓講師和顧問(wèn),也是《Programming Microsoft ASP.NET 2.0》(Microsoft Press,2005)一書(shū)的作者。Dino 先生定居于意大利,他經(jīng)常在世界各地的業(yè)內活動(dòng)中發(fā)表演講。如果要與 Dino 聯(lián)系,請發(fā)送電子郵件至cutting@microsoft.com,或訪(fǎng)問(wèn)其博客,網(wǎng)址為:weblogs.asp.net/despos。
 摘自 January 2007 期刊 MSDN Magazine.
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
用條件編譯與DLL封裝Resource相結合,減小應用程序體積
C++調用C# COM組件
windows環(huán)境下把Python代碼打包成獨立執行的exe可執行文件
打開(kāi)視頻文件夾,出現‘explorer.exe-應用程序錯誤’ - Pi - BlogBu...
ASP.NET 應用程序生命周期概述
ASP.NET 應用程序(Application)生命周期概述
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久