基本概念:
1. 網站程式:在IIS中我們所建立的網站,可以為其配置ASP.net以及應用程式集區的版本。
2. 虛擬目錄:用來將不同的檔案夾中的內容通過虛擬目錄組織到同一個檔案夾中,相當於一個應用程式,也對應著一個應用程式集區。
3. 應用程式集區:《微軟概念》是將一個或多個應用程式串連到一個或多個工作進程集合的配置。因為應用程式集區中的應用程式與其他應用程式被背景工作處理序邊界分隔,所以某個應用程式集區中的應用程式不會受到其他應用程式集區中的應用程式所產生的問題的影響。
4. 背景工作處理序隔離模式:防止一個應用程式或網站停止了而影響另一個應用程式或網站。應用程式集區直接從核心接收請求而非WWW服務。
5. W3WP.exe是IIS的背景工作處理序池,每一個w3wp.exe是IIS的一個web園,一般在IIS6.0中出現,一般的背景工作處理序池只有一個web園,但是如果在背景工作處理序池的web園中最大背景工作處理序數被修改可能出現多個w3wp.exe,或者多個背景工作處理序池同事工作也可能出現多個w3wp.exe。它的啟動使用者是系統內建安全賬戶network service。
6. Web Gargen:指一個應用程式可以再多個進程(w3wp.exe)中來執行,一次請求使用其中的一個。用這個的主要目的是提高程式的可用性。當其中一個進程發生錯誤,那麼也不會影響其他進程。發生錯誤的進程可以根據規則關閉,而其他的進程則可以繼續工作。
對於IIS6,IIS7,每個應用程式集區都會建立一個w3wp.exe進程。但是並不是所有情況都是一個應用程式集區對應一個w3wp.exe進程。web garden。或者一些異常發生的時候,就會一個應用程式集區對應多個w3wp.exe進程。應用程式集區會在沒有請求的時候定時回收,或者發生錯誤的時候,自動重建立立一個處理進程w3wp.exe進程,如果運氣好,就會看到沒有配置web garden時,一個應用程式集區對應多個w3wp.exe進程。
同樣可以對虛擬目錄來設定應用程式集區,設定方法和佈建網站的應用程式集區是一樣的。同樣也可以進行Web Gargen的配置。
在應用程式集區的屬性選項卡中,能找到關於IIS對於w3wp進程的監控功能,它提供時間參數設定(隔多少時間來ping一次背景工作處理序),在多少時間內未傳回值則將此進程視為timeout,或者死掉的狀態,具體數值可以再IIS手冊中查到相關值,此時我們可以通過使用程式語言讀取系統日誌檔案來跟蹤到此進程的ID,之後可以使用IISAPP.vbs得到該進程對應的應用程式集區,從而可以定位到該程式池所對應的應用程式以及可以通過對應用程式集區操作來恢複此故障。
關於HTTP請求的處理(ASP層級)
IIS 6的ASP.net請求處理過程:
IIS5.X是通過Inetlnfo.exe監聽request並把request分發到work process。換句話說,在IIS5.X中對request的監聽和分發是在user mode中進行,在IIS6中,這種工作被移植到kernel mode中進行,所有的這一切都是通過一個新的組件:http.sys來負責。
PS:免使用者應用程式訪問或者修改關鍵的作業系統資料,windows提供了兩種處理器訪問模式:使用者模式(User Mode)和核心模式(kernel mode)。一般地,使用者程式運行在user mode下,而作業系統代碼運行在kernel mode下,kernel mode的代碼允許訪問所有系統記憶體和所有CPU指令。在user mode下,http.sys接收到一個機遇aspx的http request,然後它會根據IIS中的Metabase查看該基於該request的application屬於哪個application pool,如果該application pool不存在,則建立之,否則直接將request發送到對應的application pool的queue中。每個application pool對應著一個worker processs:w3wp.exe,毫無疑問他是運行在user mode下的。在IIS Metabse中維護著application pool 和 worker process的Mapping,WAS(Web Administrative Service根據這樣一個mapping,將存在於某個application poos queue的request傳遞到對應的worder process(如果沒有,就穿件一個這樣的進程)。在worker process初始化的時候,載入ASP.net ISAPI,asp.net ISAPI進而載入CLR,通過APPManagerAppDomainFactory的Create方法為Application穿件一個Application Domain,通過ISAPIRuntime的ProcessRequest處理Request,進而將流程進入到ASP.net http runtime pipeline。