開篇:ASP.Net是一項動態網頁開發技術,在歷史發展的長河中WebForm曾一時成爲了ASP.Net的代名詞,而ASP.Net MVC的出現讓這項技術更加喚發朝氣。可是,不論是ASP.Net WebForm仍是ASP.Net MVC在請求處理機制上大部分都是相同的,只是在請求處理管道上的處理事件作了不一樣的操做,所以,本文標題不區分ASP.Net WebForm和ASP.Net MVC,但在後續的介紹中會區分開來介紹。此外,本文以IIS經典模式爲主,不討論集成模式(IIS7後加入了集成模式,不用加載外部的aspnet_isapi.dll組件)。css
(1)Part 1:前奏html
(2)Part 2:核心編程
(3)Part 3:管道api
(4)Part 4:WebForm頁面生命週期緩存
(5)Part 5:MVC頁面聲命週期服務器
HTTP.SYS是一個位於Windows Server和Windows XP SP2中的操做系統核心組件(內核模式中),可以讓任何應用程序經過它提供的接口,以HTTP協議進行信息通信。架構
關於內核模式與用戶模式:asp.net
在Windows Server操做系統中,一個進程既能夠運行於內核模式,也能夠運行於用戶模式。若是一個進程運行於內核模式,那麼這個進程就能夠訪問全部硬件和系統數據;若是一個進 程運行於用戶模式,那麼這個進程不能直接訪問硬件,並且訪問系統數據時也會受到限制。在Intel處理器架構中一共有0~3四個特權級,內核模式運行於0級以內,而用戶模式運行於3級。經過在內核模式運行Http.SYS,偵聽器能夠直接訪問TCP/IP協議棧,可是又可以位於www服務以外,這樣就不會受到應用程序中代碼缺陷的影響,也不會由於應用程序崩潰而出現問題。網站
HTTP.SYS組件的一個重要的做用就在於它有一個緩存區,會將近期處理的響應結果放入這個緩存區之中,若是再次請求這個內容,則會從緩存區中取得內容並進行響應,提升了響應速度。並且, 靜態的內容如今被緩存於內核模式下,這使服務響應速度更快。spa
IIS首先會判斷請求的是不是靜態資源,若是是則直接到文件系統中拿到請求的html/css/js/jpg/gif/png等資源直接響應請求。
IIS自己不會處理動態資源請求,它會根據請求的資源類型到一個被稱爲「處理程序映射」中去查找應該由哪一個擴展程序來處理這個請求。在IIS中,對於asp.net的請求通常是由aspnet_isapi.dll這個組件來進行.net運行時的加載和具體請求的處理。有了基於ISAPI的擴展擴展程序,IIS服務器就能夠根據客戶端請求的資源擴展名,來決定應由哪一個ISAPI擴展程序來處理客戶端請求,而後就能夠將請求轉發給合適的ISAPI擴展程序。
關於IIS服務器擴展:
因爲IIS服務器在設計時引入了開放的ISAPI接口標準,具有極高的可擴展性。在覈心組件不變的狀況下可靈活支持不一樣類型不一樣版本的ASP.NET應用程序。
關於ISAPI:
ISAPI(服務器應用編程接口),它爲開發人員提供了強大的可編程能力,只要按照標準接口開發不一樣類型的Web應用程序的ISAPI擴展程序,就能實現對IIS功能上的擴展,從而使IIS能夠處理不一樣類型的客戶端請求。IIS管理器提供了應用程序配置功能,能夠對不一樣的客戶端請求配置不一樣的ISAPI擴展程序。ISAPI擴展程序一般以DLL形式存在,能夠被IIS加載並調用。
剛剛咱們大致上介紹了IIS的處理步驟,但其實IIS對於動態資源的處理首先會經過一個工做進程去加載具體的處理組件dll。以IIS 6.0爲例,若是IIS判斷它本身沒法處理asp.net的請求,會由W3WP.exe所維護的工做進程來加載aspnet_isapi.dll。
若是Web應用程序是第一次加載,那麼首先會由aspnet_isapi.dll加載.NET運行時(主要是調用服務器上的.Net Framework建立CLR運行時)。而一個IIS工做進程裏有一個應用程序池,其中能夠承載多個應用程序域AppDomain。
關於應用程序池:
應用程序池就是能夠當作裝載計算機分配給動態網站的內存的容器。若是內存是水,那麼應用程序池就是魚缸,動態網站就是魚缸中的金魚。多個動態網站能夠存在於同一個應用程序池裏,即魚缸中能夠放多條金魚。固然,若是金魚多了,魚缸中的空間有限,金魚之間就會爭搶空間,不是很堅固的魚缸可能就會破裂,全部金魚都會受到影響。便是動態網站多了,內存不足,可能會形成內存級別的溢出漏洞,影響全部在那個應用程序池上的動態網站。關於應用程序域:
使用.NET創建的可執行程序,並無直接承載到進程當中,而是承載到應用程序域(AppDomain)當中。應用程序域是.NET引入的一個新概念,它比進程所佔用的資源要少,能夠被看做是一個輕量級的進程。
在.NET運行時建立好以後,經過應用程序域工廠AppDomainFactory建立應用程序域AppDomain。建立好AppDomain以後,就將請求轉給該AppDomain中的ISAPIRuntime對象,而後調用ISAPIRuntime對象的ProcessRequest()方法來進行處理。
ISAPIRuntme.ProcessRequest()方法是進入ASP.Net的第一個入口,ASP.Net的核心處理部分就剛剛開始。此篇我將其稱爲前奏,是由於它是在ASP.Net的核心處理部分以前,將HTTP請求一步一步地傳遞給了ISAPIRuntime對象,後面咱們再繼續探索ASP.Net的請求處理機制,今天就到此結束!
(1)Darren Ji,《ASP.NET MVC請求處理管道聲明週期的19個關鍵環節》:http://www.cnblogs.com/darrenji/p/3795661.html
(2)JackyXM,《HTTP.SYS詳解》:http://www.cnblogs.com/yxmx/articles/1652128.html
(3)木宛城主,《ASP.NET那點鮮爲人知的事兒》:http://www.cnblogs.com/OceanEyes/archive/2012/08/13/aspnetEssential-1.html
(4)Tony He,《ASP.NET請求處理機制》:http://www.cnblogs.com/cilence/archive/2012/05/28/2520712.html