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

來源:互聯網
上載者:User

                                                  淺談ASP.NET的內部機制(二)
 
      前言:大家知不知道,一個Http Request是如何被傳遞給ASP.NET的?而且ASP.NET是如何知道一個 Http Request是請求的.aspx這樣的動態檔案還是請求的.htm這樣的靜態檔案?......
 

系列文章連結:

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

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

淺談ASP.NET內部機制(三)

淺談ASP.NET內部機制(四)

淺談ASP.NET內部機制(五)

淺談ASP.NET內部機制(六)

淺談ASP.NET內部機制(七)

淺談ASP.NET內部機制(八)

      上次已經說到了http.sys和aspnet_filter的功能,希望大家還記得!
      當一個請求(也就是http Request)通過了http.sys和aspnet_fitler後,此時這個請求還沒有被傳遞給ASP.NET的處理常式。但是此時IIS就會在它的MIME Type中尋找請求檔案的處理常式。
      其實MIME Type不神秘,就是註冊了哪些檔案由哪些組件來處理。大家看看下面的圖就明白了。

     

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

      下面我們就來詳細的看看,在真正處理一個請求的時候,到底進行了哪些的初始化操作。
      1.當IIS知道了處理的是.aspx的檔案後,就啟動一個進程w3wp.exe來開始運行ASP.NET。
      2.因為此時aspnet_isapi.dll已經載入運行了,而且aspnet_isapi.dll是一個用Managed 程式碼編寫的組件,而所有的Managed 程式碼都要運行在應用程式定義域(Application Domain,以後我們簡稱Domain)中,所以進行載入後,首先就是建立一個Domain。因為我們請求的是一個ASP.NET中的一個頁面,而且這個頁面是屬於一個用ASP.NET開發的網站,所以這個網站就是一個應用程式,要在Domain中啟動並執行。但是建立一個Domain要經過很多的步驟的。(註:大家也許認為沒有必要把建立Domain的步驟弄清楚,但是我認為很有必要,因為在建立一個Domain的過程中,涉及到很多的ASP.NET的內部問題,而且這個問題在實際開發中也很重要,如ASP.NET運行時的許可權和可信域(與安全問題相關),也涉及代碼安全等,還可以協助我們理解代碼的編譯).

      下面就來說說建立一個Domain的步驟:
      2.1 為一個Domain建立標識;
      2.2 驗證訪問的檔案目錄是否存在,並且初始化目錄的資訊
      2.3 設定Domain的信任層級
      2.4 設定程式集的位置
      2.5 得到自動產生的機器碼
      2.6 初始化ASP.NET編譯系統

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

      因為一個應用程式是運行在伺服器的硬碟上的,所以在啟動並執行時候必須有一個標識(identity),其實標識就是運行程式的使用者名稱和ID,這是作業系統要的。在IIS6中,一個ASP.NET程式就是以NT AUTHORITY\NETWORK SERVICE的身份來啟動並執行。因為不同的identity對系統的操作許可權不同,我們可以在設定檔,如web.config中配置別的許可權,使得我們的程式可以進行更多的操作(如寫入檔案,讀取系統註冊表等),只要配置<identity />。
 
      其次,我們來看看 驗證訪問的檔案目錄是否存在,並且初始化目錄的資訊。
 一個ASP.NET網站的由很多的檔案組成的。如果我們請求的的檔案在這個網站中沒有或者我們沒有讀取那個檔案的許可權,那麼就會產生從伺服器返回錯誤的資訊。
 
      而且ASP.NET還會初始化一些目錄的資訊,如在App_Data中的檔案,因為.Net Framework2.0以後的版本,ADO.NET的還會自己的把資料檔案與Sql Server相連,並且建立串連。
 
      最後就是還會決定一個ASP.NET的網站的自動產生的代碼回放在哪裡。比如我們請求一個Default.aspx頁面,這個頁面還有一個.cs檔案,在我們請求時,這兩個檔案會產生一個繼承Page的類,所以ASP.NET必須決定這個產生的檔案放在哪裡。
 
      然後,我們來看看 設定Domain的信任層級。
      其實一個Domain的信任層級就決定了這個Domain可以做哪些事情。也就是一個Domain的許可權有多大。
      主要有:1.Enterprise 2. Machine 3. User 4. Application domain。
 其實這也是一個代碼訪問安全的問題(code access security (CAS)).就是說,這個Domain中的應用程式的代碼可以執行的操作的許可權。比如,如果Domain的信任層級很大,甚至程式中的代碼可以訪問Windows API。
 我們可以在調用System.AppDomain.CurrentDomain.SetAppDomainPolicy,來順位。
 
      再次,我們來看看 設定程式集的位置。
      上面的一些步驟就已經建立了一個Domain的安全性原則,一個Domain中啟動並執行網站一般會有一些程式集的,而且位於bin目錄下,還有之前提過的自動的類也會會被編譯為程式集,.NET Framework會監管這些程式集。
 
      再後,我們來看看 得到自動產生的機器碼。
      其實機器碼就是machineKey,每個應用程式在啟動並執行時候,都會有machineKey,一般是ASP.NET隨機產生的,但是我們也可以自動的制定,在web.config的<machineKey />中制定。這個功能很有用的,比如你有幾個伺服器,或者幾個不同的網站,我們希望在一台伺服器上的網站登入後,然後我們在其他的伺服器的網站上去的時候,我們就可以是已經登入使用者。也就是可以實現"一次登入,到處可用"。
 
      最後,就是 初始化ASP.NET編譯系統。
      這時就編譯器集,並且解析其中的類,,而且還解析app_webreferences的目錄和global.asax。程式開始運行了,也有了Application的執行個體來主導整個應用。

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

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.