原文:Behind the scenes of ASPX files
轉載地址:http://blog.joycode.com/microhelper/articles/9811.aspx
Asp.net Page檔案通常有兩個檔案,aspx檔案定義外觀,cs檔案((Code behind檔案)處理事件,運行時,每一個cs檔案會被編譯成dll檔案。
當page第一次被訪問的時候,
1:.net會根據aspx檔案產生一個cs檔案
2:用csc.exe把這個cs檔案編譯成dll
3: 運行編譯產生的這個dll
上面的過程只有第一次請求頁面時才發生,所以第一次訪問某個page時會感覺比較慢。
以後.net就用dll來處理對這個頁面的請求,如果aspx檔案有變化,,net會重建dll檔案
產生的這個dll檔案可以在
C:\$WINDOWSDir$\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\$YourWebAppName$\4449be44\81bf2529
(最後面兩級目錄的名字是隨機的)
目錄下找到,我們可以看到這個目錄下除了cs檔案外還有其他類型的檔案,其中
*.cs:??根據aspx檔案產生的cs檔案
*.res ??資源檔
*cmdline ?用來編譯*.cs檔案的命令列
*.err? ??編譯*.cs的錯誤
*out ??編譯時間的輸出檔案
*.dll ??編譯產生的檔案
*pdb ??編譯產生的檔案
*.xml??儲存aspx檔案名稱和.net產生的用來命名檔案的隨機數之間的映射關係
我們可以看到Temporary ASP.NET Files\$YourWebAppName$\目錄下的檔案,除了xml檔案之外都是以隨機數字作為檔案名稱,所以需要一個page
的實際名字與隨機數字之間的映射關係,這個映射儲存在xml檔案中。
比如
???
???
我們根據這個映射,找到產生的cs檔案
從cs檔案裡,我們可以看到,cs檔案中標出了與aspx原檔案相對應的行號
比如
aspx檔案中第三行為
相應的cs檔案中
#line 3 "F:\CRM\TestControl.ascx"
__ctrl = new System.Web.UI.WebControls.TextBox();
.............
另一方面,我們可以注意到每一個根據aspx檔案產生的類都繼承了aspx檔案的code behind類,並且實現了其介面。
比如:???
public class TestControl_ascx : CRM.TestControl
public class WebForm1_aspx : CRM.WebForm1, System.Web.SessionState.IRequiresSessionState
根據aspx檔案產生的類先於code behide類被調用,其建構函式會初始化所依賴的檔案
public WebForm1_aspx() {
?System.Collections.ArrayList dependencies;
??????????? if ((ASP.WebForm1_aspx.__initialized == false)) {
??????????????? ASP.WebForm1_aspx.__stringResource = System.Web.UI.TemplateControl.ReadStringResource(typeof(ASP.WebForm1
_aspx));
??????????????? dependencies = new System.Collections.ArrayList();
??????????????? dependencies.Add("F:\\CRM\\webform1.aspx");
??????????????? dependencies.Add("F:\\CRM\\bin\\CRM.DLL");
??????????????? dependencies.Add("F:\\CRM\\TestControl.ascx");
??????????????? ASP.WebForm1_aspx.__fileDependencies = dependencies;
??????????????? ASP.WebForm1_aspx.__initialized = true;
??????????? }
??????????? this.Server.ScriptTimeout = 30000000;
??????? }
其建構函式執行後,會執行override的函數FrameworkInitialize,
函數FrameworkInitialize調用__BuildControlTree 來構造所有頁面上的控制項,
綜上所述,請求aspx頁面時,有兩個類參與
1:code behind class ?– WebForm1.
2:從ASPX產生的類?– adbdef.
執行的順序為
1:adbdef的建構函式
2:WebForm1的建構函式
3:adbdef類的方法FrameworkInitialize
4:FrameworkInitialize調用__ BuildTree建立各個控制項
5:按順序調用Page和controls的事件處理常式,ASPX中聲明的事件先被處理