熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

淺談ASP.NET的內部機制(二)

2013-11-13 10:00:12  來源: .NET編程 

  上次已經說到了httpsys和aspnet_filter的功能希望大家還記得!

  當一個請求(也就是http Request)通過了httpsys和aspnet_fitler後此時這個請求還沒有被傳遞給ASPNET的處理程序但是此時IIS就會在它的MIME Type中查找請求文件的處理程序

  其實MIME Type不神秘就是注冊了哪些文件由哪些組件來處理大家看看下面的圖就明白了

  

  大家應該對上面的圖很熟悉而IIS就是通過查找上面的那個表來決定一個請求到底請求的是那種文件如果是靜態的文件如htm那麼這個請求就直接由IIS來處理了也不會傳遞給ASPNET處理程序如果請求的文件是aspx或者asmx等那麼IIS就知道請求是就傳遞給aspnet_isapidll的隨後就啟動一個進程來加載這個dll隨後就開始進行一系列的初始化工作然後就把請求傳遞給ASPNET

  下面我們就來詳細的看看在真正處理一個請求的時候到底進行了哪些的初始化操作

  當IIS知道了處理的是aspx的文件後就啟動一個進程wwpexe來開始運行ASPNET

  因為此時aspnet_isapidll已經加載運行了而且aspnet_isapidll是一個用托管代碼編寫的組件而所有的托管代碼都要運行在應用程序域(Application Domain以後我們簡稱Domain)中所以進行加載後首先就是建立一個Domain因為我們請求的是一個ASPNET中的一個頁面而且這個頁面是屬於一個用ASPNET開發的網站所以這個網站就是一個應用程序要在Domain中運行的但是建立一個Domain要經過很多的步驟的(注大家也許認為沒有必要把建立Domain的步驟弄清楚但是我認為很有必要因為在建立一個Domain的過程中涉及到很多的ASPNET的內部問題而且這個問題在實際開發中也很重要如ASPNET運行時的權限和可信域(與安全問題相關)也涉及代碼安全等還可以幫助我們理解代碼的編譯)

  下面就來說說建立一個Domain的步驟

   為一個Domain建立標識

   驗證訪問的文件目錄是否存在並且初始化目錄的信息

   設置Domain的信任級別

   設置程序集的位置

   得到自動生成的機器碼

   初始化ASPNET編譯系統

  首先我們來看看 為一個Domain建立標識

  因為一個應用程序是運行在服務器的硬盤上的所以在運行的時候必須有一個標識(identity)其實標識就是運行程序的用戶名和ID這是操作系統要的在IIS一個ASPNET程序就是以NT AUTHORITY\NETWORK SERVICE的身份來運行的因為不同的identity對系統的操作權限不同我們可以在配置文件如nfig中配置別的權限使得我們的程序可以進行更多的操作(如寫入文件讀取系統注冊表等)只要配置<identity />

  其次我們來看看 驗證訪問的文件目錄是否存在並且初始化目錄的信息

  一個ASPNET網站的由很多的文件組成的如果我們請求的的文件在這個網站中沒有或者我們沒有讀取那個文件的權限那麼就會產生從服務器返回錯誤的信息

  而且ASPNET還會初始化一些目錄的信息如在App_Data中的文件因為Net Framework以後的版本ADONET的還會自己的把數據文件與Sql Server相連並且建立連接

  最後就是還會決定一個ASPNET的網站的自動產生的代碼回放在哪裡比如我們請求一個Defaultaspx頁面這個頁面還有一個cs文件在我們請求時這兩個文件會生成一個繼承Page的類所以ASPNET必須決定這個生成的文件放在哪裡

  然後我們來看看 設置Domain的信任級別

  其實一個Domain的信任級別就決定了這個Domain可以做哪些事情也就是一個Domain的權限有多大

  主要有Enterprise Machine User Application domain

  其實這也是一個代碼訪問安全的問題(code access security (CAS))就是說這個Domain中的應用程序的代碼可以執行的操作的權限比如如果Domain的信任級別很大甚至程序中的代碼可以訪問Windows API

  我們可以在調用SystemAppDomainCurrentDomainSetAppDomainPolicy來設置級別

  再次我們來看看 設置程序集的位置

  上面的一些步驟就已經建立了一個Domain的安全策略一個Domain中運行的網站一般會有一些程序集的而且位於bin目錄下還有之前提過的自動的類也會會被編譯為程序集NET Framework會監管這些程序集

  再後我們來看看 得到自動生成的機器碼

  其實機器碼就是machineKey每個應用程序在運行的時候都會有machineKey一般是ASPNET隨機生成的但是我們也可以自動的制定在nfig的<machineKey />中制定這個功能很有用的比如你有幾個服務器或者幾個不同的網站我們希望在一台服務器上的網站登錄後然後我們在其他的服務器的網站上去的時候我們就可以是已經登錄用戶也就是可以實現一次登錄到處可用

  最後就是 初始化ASPNET編譯系統

  這時就編譯程序集並且解析其中的類而且還解析app_webreferences的目錄和globalasax程序開始運行了也有了Application的實例來主導整個應用

  今天就說到這裡下篇接著說


From:http://tw.wingwit.com/Article/program/net/201311/12262.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.