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

   上篇博客基礎(ASP.NET之旅--深入淺出解讀IIS架構

       很多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頁面返回給客戶端瀏覽器解釋運行。

[csharp] view plain copy
  1. //Page 類與擴展名爲 .aspx 的文件相關聯。  
  2. //表示從 ASP.NET Web 應用程序的宿主服務器請求的 .aspx 文件。 這些文件在運行時被編譯爲 Page 對象,並被緩存在服務器內存中。  
  3. //Page類的屬性中包含有Asp的所有對象,如:Application、Request、Response等對象  
  4. //開發人員在頁面編程中使用的對象也都是使用該類的屬性,對於這些對象的產生將會在下面章節中講到  
  5. //Asp.net程序中創建的語法如下:  
  6. 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負責請求的身份驗證及授權操作。

 

      Note:加載哪些 ASP.NET 模塊(如 SessionStateModule)取決於應用程序從父應用程序繼承的託管代碼模塊。 這還取決於在應用程序的 Web.config 文件的配置節中配置了哪些模塊。(想要了解更多有關IIS集成模式下模塊的工作,請查看官網http://www.iis.net/learn/get-started/introduction-to-iis/introduction-to-iis-architecture。)


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章