Asp.Net 背後原理

來源:互聯網
上載者:User
原文: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中聲明的事件先被處理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.