1. 程式人生 > >ASP.NET之旅--淺談Asp.net執行機制(一)

ASP.NET之旅--淺談Asp.net執行機制(一)

       很多Asp.net開發人員都有過Asp的背景,以至於我們開發程式的時候總是停留在“頁面”層次思考,也就是說我們常常會只考慮我們現在所做的系統是要完成什麼功能,是要做問卷調查網站還是個人網站,而很少在“請求級”思考,思考能不能通過編碼的方式來操作一個Http請求。在跨入Asp.net後Asp有了質的飛躍,很多底層的Http請求都得到了良好的應用,這時候Asp.net不僅僅是一門開發語言,而是一個開發平臺。想要能在“請求級”來實現編碼,我們就不得不來說說Asp.net的內部執行機制。

一、Asp.net頂層執行機制

       當客戶端的Http請求到達伺服器後,IIS會為Http請求分配應用程式池,在應用程式池中建立請求需要的管道,請求管道將Http請求的各步驟進行了分配。  

       當第一次請求頁面時,在請求管道中經過了身份驗證等模組的一系列操作後,他會被對映處理程式處理,發現要請求的是.aspx頁面,這時請求將轉交給Asp.net執行也就是我們上圖的步驟2。Asp.net頁面分為前臺.aspx檔案和後臺.cs檔案,Asp.net引擎會將前臺檔案和後臺檔案合併生成一個頁面(Page)類,然後再由編譯器將該頁面類編譯成為程式集,再由程式集生成靜態HTML頁面,然後將HTML檔案返回給對映處理程式,並將靜態HTML頁面返回給客戶端瀏覽器解釋執行。

//Page 類與副檔名為 .aspx 的檔案相關聯。
//表示從 ASP.NET Web 應用程式的宿主伺服器請求的 .aspx 檔案。 這些檔案在執行時被編譯為 Page 物件,並被快取在伺服器記憶體中。
//Page類的屬性中包含有Asp的所有物件,如:Application、Request、Response等物件
//開發人員在頁面程式設計中使用的物件也都是使用該類的屬性,對於這些物件的產生將會在下面章節中講到
//Asp.net程式中建立的語法如下:
public class Page : TemplateControl, IHttpHandler

    Note:生成的程式集一般會被放在伺服器的C:/windows/Microsoft .NET/Framework/V4.0 303 19/Temporary ASP.NET Files目錄下。


       當用戶第二次請求該頁面時,直接呼叫編譯好的程式集即可,從而大大提高開啟頁面的速度。正因為如此,我們才會發現當用戶第一次開啟該頁面時速度會很慢,但是以後再開啟該頁面速度會很快的原因。

       這裡我們站在一個比較高層次上看Asp.net的執行機制,我們一步步的將HTTP請求轉變成了我們通常可見的HTML頁,但卻忽略了很多細節。首先請求在進入管道後,HTTP請求是如何一步步轉交給.aspx檔案的,其次在頁面程式設計時會用到很多Asp物件這些物件是如何建立的。不著急,我們將問題上拋,進入我們的第二節。

二、IIS整合模組處理機制


       上節站在較高層次上解讀了Asp.net的執行機制,請求過程很簡單,核心的東西是Asp.net引擎,在第一次請求時它將請求的頁面編譯成為程式集,在以後的請求中只調用請求的程式集即可,大大提高了執行效率。在這裡還要清楚一點,上圖中的從步驟2往後的請求是在模組中實現的。那麼何為請求模組呢,我們繼續往下看。


 1、理解HttpModule模組


       在以前我們說過IIS7.0以後的版本中管道模式升級為了整合模式,在請求管道中我們可以任意指定請求的模組來實現我們的請求,同時為了實現某個功能開發人員也可以自己編寫模組來把它整合到IIS中。這種模組其實封裝了一個個的處理單元,當HTTP請求進入模組後,處理單元會根據請求資訊來實現各自模組的功能,在處理完成後會把HTTP請求的資訊返回到HttpHandler中。
       IIS中也自帶了很多處理模組,如:下圖中的身份驗證的Anon模組、Static File模組、Default Document模組等。


       上圖是HTTP請求進入W3WP.exe程序後的工作流程。


      Note:W3WP.exe它是一個工作程序,該程序實現了IIS和應用程式池的聯接工作。如果有多個應用程式池在執行就會對應有多個W3WP.exe的程序例項執行。另外Managed Engines模組是.NET的驅動程式,它將HTTP請求從IIS的整合模式中連線到.NET Runtime。


       這張圖上的請求可以看出Http請求在傳送到IIS管道後,首先是由HttpModule的Authentication處理,處理完成後為請求授予許可權,請求的資訊有多種形式,至於幾種特殊的請求方式我們將會在系列博文中講到。HttpHandler來處理,HttpModule負責請求的身份驗證及授權操作。


      本節我們主要介紹了HTTP請求在進入IIS後進行的一系列模組請求,究竟由哪些模組來處理請求是由應用程式的父應用程式和Web.config配置決定。在HTTP請求進入Web Server Core後會觸發一系列的管道事件,這些管道事件驅動了HTTP請求的正常執行。對於這些管道事件及IIS和.NET底層程式碼的執行機制,將會在下節中講到。