您好,登錄后才能下訂單哦!
IIS 7.0在請(qǐng)求的監(jiān)聽(tīng)和分發(fā)機(jī)制上又進(jìn)行了革新性的改進(jìn),主要體現(xiàn)在對(duì)于Windows進(jìn)程激活服務(wù)(Windows Process Activation Service,WAS)的引入,將原來(lái)(IIS 6.0)W3SVC承載的部分功能分流給了WAS。通過(guò)上面的介紹,我們知道對(duì)于IIS 6.0來(lái)說(shuō)W3SVC主要承載著3大功能。
HTTP請(qǐng)求接收:接收HTTP.SYS監(jiān)聽(tīng)到的HTTP請(qǐng)求。
配置管理:從元數(shù)據(jù)庫(kù)(Metabase)中加載配置信息對(duì)相關(guān)組件進(jìn)行配置。
進(jìn)程管理:創(chuàng)建、回收、監(jiān)控工作進(jìn)程。
IIS 7.0將后兩組功能實(shí)現(xiàn)到了WAS中,接收HTTP請(qǐng)求的任務(wù)依然落在W3SVC頭上。WAS的引入為IIS 7.0提供了對(duì)非HTTP協(xié)議的支持。WAS通過(guò)監(jiān)聽(tīng)器適配器接口(Listener Adapter Interface)抽象出不同協(xié)議監(jiān)聽(tīng)器。具體來(lái)說(shuō),除了基于網(wǎng)絡(luò)驅(qū)動(dòng)的HTTP.SYS提供HTTP請(qǐng)求監(jiān)聽(tīng)功能外還提供了TCP監(jiān)聽(tīng)器、命名管道監(jiān)聽(tīng)器和MSMQ監(jiān)聽(tīng)器以提供基于TCP、命名管道和MSMQ傳輸協(xié)議的監(jiān)聽(tīng)支持。
與此3種監(jiān)聽(tīng)器相對(duì)的是3種監(jiān)聽(tīng)適配器,它們提供監(jiān)聽(tīng)器與WAS中的監(jiān)聽(tīng)器適配器接口之間的適配。從這個(gè)意義上講,IIS 7.0中的W3SVC更多地為HTTP.SYS起著監(jiān)聽(tīng)適配器的作用。這3種非HTTP監(jiān)聽(tīng)器和監(jiān)聽(tīng)適配器定義在程序集SMHost.exe中,我們可以在目錄%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\中找到它們。
WCF提供的這3種監(jiān)聽(tīng)器和監(jiān)聽(tīng)適配器最終以Windows 服務(wù)的形式體現(xiàn)。雖然它們定義在一個(gè)程序集中,我們依然可以通過(guò)服務(wù)工作管理器對(duì)其進(jìn)行單獨(dú)的啟動(dòng)、終止和配置。SMHost.exe提供了4個(gè)重要的Windows Service。
NetTcpPortSharing:為WCF提供TCP端口共享。關(guān)于端口共享在WCF中的應(yīng)用,本人拙著《WCF全面解析》(上冊(cè))對(duì)此有詳細(xì)的介紹。
NetTcpActivator:為WAS提供基于TCP的激活請(qǐng)求,包含TCP監(jiān)聽(tīng)器和對(duì)應(yīng)的監(jiān)聽(tīng)適配器。
NetPipeActivator:為WAS提供基于命名管道的激活請(qǐng)求,包含命名管道監(jiān)聽(tīng)器和對(duì)應(yīng)的監(jiān)聽(tīng)適配器。
NetMsmqActivator:為WAS提供基于MSMQ的激活請(qǐng)求,包含MSMQ監(jiān)聽(tīng)器和對(duì)應(yīng)的監(jiān)聽(tīng)適配器。
圖1-7為上述的4個(gè)Windows 服務(wù)在服務(wù)控制管理器中的呈現(xiàn)。
圖1-7 定義在SMHost.exe中的Windows Service
圖1-8揭示了IIS 7.0的整體構(gòu)架及整個(gè)請(qǐng)求處理流程。無(wú)論是從W3SVC接收到的HTTP請(qǐng)求,還是通過(guò)WCF提供的監(jiān)聽(tīng)適配器接收到的請(qǐng)求,最終都會(huì)傳遞到WAS。如果相應(yīng)的工作進(jìn)程(或者應(yīng)用程序池)尚未創(chuàng)建,則創(chuàng)建它,否則將請(qǐng)求分發(fā)給對(duì)應(yīng)的工作進(jìn)程進(jìn)行后續(xù)的處理。WAS在進(jìn)行請(qǐng)求處理過(guò)程中,通過(guò)內(nèi)置的配置管理模塊加載相關(guān)的配置信息,并對(duì)相關(guān)的組件進(jìn)行配置。與IIS 5.x和IIS 6.0基于Metabase的配置信息存儲(chǔ)不同的是,IIS 7.0大都將配置信息存放于XML形式的配置文件中,基本的配置存放在applicationHost.config中。
圖1-8 IIS 7.0與ASP.NET
從上面對(duì)IIS 5.x和IIS 6.0的介紹中,我們不難發(fā)現(xiàn)IIS與ASP.NET是兩個(gè)相互獨(dú)立的管道(Pipeline)。在各自管轄范圍內(nèi),它們各自具有自己的一套機(jī)制對(duì)HTTP請(qǐng)求進(jìn)行處理。兩個(gè)管道通過(guò)ISAPI實(shí)現(xiàn)“連通”,IIS是第一道屏障,當(dāng)對(duì)HTTP請(qǐng)求進(jìn)行必要的前期處理(比如身份驗(yàn)證等)時(shí),通過(guò)ISAPI將請(qǐng)求分發(fā)給ASP.NET管道。當(dāng)ASP.NET在自身管道范圍內(nèi)完成對(duì)HTTP請(qǐng)求的處理時(shí),處理后的結(jié)果再返回到IIS,IIS對(duì)其進(jìn)行后期處理(比如日志記錄、壓縮等),最終生成HTTP響應(yīng)。圖1-9反映了IIS 6.0與ASP.NET之間的橋接關(guān)系。
圖1-9 基于IIS 6.0與ASP.NET雙管道設(shè)計(jì)
從另一個(gè)角度講,IIS運(yùn)行在非托管的環(huán)境中,而ASP.NET管道則是托管的,ISAPI還是連接非托管環(huán)境和托管環(huán)境的紐帶。IIS 5.x和IIS 6.0把兩個(gè)管道進(jìn)行隔離至少帶來(lái)了下面的一些局限與不足:
相同操作的重復(fù)執(zhí)行:IIS與ASP.NET之間具有一些重復(fù)的操作,比如身份驗(yàn)證。
動(dòng)態(tài)文件與靜態(tài)文件處理的不一致:因?yàn)橹挥谢贏SP.NET動(dòng)態(tài)文件(比如.aspx、.asmx、.svc等)的HTTP請(qǐng)求才能通過(guò)ASP.NET ISAPI進(jìn)入ASP.NET管道,而對(duì)于一些靜態(tài)文件(比如.html、.xml、.img等)的請(qǐng)求則由IIS直接響應(yīng),那么ASP.NET管道中的一些功能將不能用于這些基于靜態(tài)文件的請(qǐng)求,比如我們希望通過(guò)Forms認(rèn)證應(yīng)用于基于圖片文件的請(qǐng)求就做不到。
IIS難以擴(kuò)展:對(duì)于IIS的擴(kuò)展基本上就體現(xiàn)在自定義ISAPI,但是對(duì)于大部分人來(lái)說(shuō),這不是一件容易的事情。因?yàn)镮SAPI是基于Win32的非托管的API,并非一種面向應(yīng)用的編程接口。通常我們希望的是諸如定義ASP.NET的HttpModule和HttpHandler一樣,通過(guò)托管代碼的方式來(lái)擴(kuò)展IIS。
對(duì)于Windows平臺(tái)下的IIS來(lái)講,ASP.NET無(wú)疑是一等公民,它們之間不應(yīng)該是“井水不犯河水”,而應(yīng)該是“你中有我,我中有你”的關(guān)系,為此在IIS 7.0中實(shí)現(xiàn)了兩者的集成,通過(guò)集成可以獲得如下的好處。
允許通過(guò)本地代碼(Native Code)和托管代碼(Managed Code)兩種方式定義IIS Module,這些IIS Module注冊(cè)到IIS中形成一個(gè)通用的請(qǐng)求處理管道。由這些IIS Module組成的這個(gè)管道能夠處理所有的請(qǐng)求,不論請(qǐng)求基于怎樣的資源類型。比如,可以將FormsAuthenticationModule提供的Forms認(rèn)證應(yīng)用到基于.aspx、CGI和靜態(tài)文件的請(qǐng)求。
將ASP.NET提供的一些強(qiáng)大的功能應(yīng)用到原來(lái)難以企及的地方,比如將ASP.NET的URL重寫(xiě)功能置于身份驗(yàn)證之前。
采用相同的方式去實(shí)現(xiàn)、配置、檢測(cè)和支持一些服務(wù)器特性(Feature),比如Module、Handler映射、定制錯(cuò)誤配置(Custom Error Configuration)等。
圖1-10演示了在ASP.NET集成模式下,IIS整個(gè)請(qǐng)求處理管道的結(jié)構(gòu)??梢钥吹?,原來(lái)ASP.NET提供的托管組件可以直接應(yīng)用在IIS管道中。
圖1-10 基于IIS 7.0與ASP.NET集成管道設(shè)計(jì)
本文節(jié)選自《ASP.NET MVC 4 框架揭秘》
蔣金楠 著
電子工業(yè)出版社出版
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。