如果Web服務(wù)器操作系統(tǒng)是Windowsserver2003,則IIS6.0進(jìn)程模型是asp.net的默認(rèn)選擇。其名稱明確之處,該模型需要IIS6.0、然后,在windows2003的服務(wù)器上,仍然可以讓asp.net遵守IIS5.0進(jìn)程模型的規(guī)則。可以通過修改machine.config文件中的<processModel>節(jié),顯示的啟用該模型。
<processModelenable="true">
當(dāng)然,我并不建議且滑倒IIS5.0進(jìn)程模型,雖然這樣做是合法的。主要原因在于:IIS6.0利用不同的內(nèi)部模塊的管道來處理一個(gè)入站請求,并且只有在仿真模式下運(yùn)行時(shí)才能模仿IIS5.0的行為。IIS6.0管道以一個(gè)名為完wp.exe的工作進(jìn)程為中心。所有被分配給同一個(gè)應(yīng)用程序池的Web應(yīng)用程序共享該可執(zhí)行進(jìn)程的一個(gè)副本。用IIS6.0的行話來說,一個(gè)應(yīng)用程序池是一組共享相同的工作進(jìn)程的副本的Web用用程序。IIS6.0使我們能夠指定應(yīng)用程序池,以實(shí)現(xiàn)Web服務(wù)器上托管的各應(yīng)用程序所需的隔離程度。
w3wp.exeworker進(jìn)程加載aspn_isapi.dll;該ISAPI擴(kuò)展又加載通用語言運(yùn)行庫(CLR),并啟動(dòng)ASP.NET運(yùn)行庫管道來處理該請求。當(dāng)IIS6.0進(jìn)程模型正在使用時(shí),內(nèi)置的ASP.NET工作進(jìn)程會(huì)被禁用。
注意:只有asp.net1.1完全利用IIS6.0進(jìn)程模型。如果把a(bǔ)sp.net1.0安裝到一臺windows2003機(jī)器上,則默認(rèn)的進(jìn)程模型是IIS5.0進(jìn)程模型。之所以會(huì)這樣,是因?yàn)閍sp.net1.1所帶的aspnet_isapi.dll能夠識別它的宿主,并根據(jù)需要加載CLR。asp.net1.0所帶的aspnet_isapi.dll只能把請求轉(zhuǎn)發(fā)給asp.net工作進(jìn)程,絕對不會(huì)加載CLR。
下圖為IIS6.0進(jìn)程模型

IIS6.0作為內(nèi)核級模塊實(shí)現(xiàn)其HTTP監(jiān)聽程序。因此,所有的輸入請求首先由http.sys驅(qū)動(dòng)程序以內(nèi)核模式進(jìn)行管理。沒有任何的第三方代碼會(huì)與該監(jiān)聽程序交互,并且沒有任何的用戶模式?jīng)_突會(huì)影響IIS的穩(wěn)定性。http.sys驅(qū)動(dòng)程序監(jiān)聽請求,并把他們投遞到合適的應(yīng)用程序池的請求隊(duì)列。一個(gè)稱為餓哦Web管理服務(wù)的模塊讀取IIS冤苦,并指示http.sys驅(qū)動(dòng)程序創(chuàng)建與元庫中所注冊應(yīng)用程序池一樣多的請求隊(duì)列。
總之,在IIS6.0進(jìn)程模型下,asp.net運(yùn)行的更快,因?yàn)樵趇netinfo.exe可執(zhí)行進(jìn)程和工作進(jìn)程之間,不需要任何進(jìn)程間的通信。http請求直接在托管CLR的工作進(jìn)程中被交付。此外,asp.net工作進(jìn)程不是一個(gè)特俗進(jìn)程,它只是IIS工作進(jìn)程的一個(gè)副本。這一事實(shí)將進(jìn)程回收、頁面輸入緩存和運(yùn)行狀況檢查的負(fù)擔(dān)(轉(zhuǎn)交給IIS)。