ASP.NET Web編程原理 之
IIS架構(gòu)與HTTP請求處理流程(3)
(
續(xù)前文
)
8.1.4 HTTP請求的處理過程
在了解了 IIS 的架構(gòu)之后,來看一下 IIS 架構(gòu)中的各個組成部分是如何相互配合處理 HTTP 請求的。
先來從總體上看看 HTTP 請求的處理過程( 圖 8 ? 10 )。
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1028" style="width: 415.5pt; height: 180pt;" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CUsers%5CJINXUL%7E1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image001.emz"></imagedata></shape> 圖 8 ? 10 HTTP 請求的處理過程
圖 8 ? 10 清晰地展示出了 HTTP 請求處理就是瀏覽器與 Web 服務(wù)器間“一問一答”的過程 。
首先,瀏覽器嘗試連接 Web 服務(wù)器的 80 端口,如果 Web 服務(wù)器可以響應(yīng)此連接請求,就在瀏覽器與 Web 服務(wù)器間建立了一個通訊鏈路,在此“通道”上瀏覽器與 Web 服務(wù)器可以相互發(fā)送與接收信息。
假設(shè)瀏覽器向 Web 服務(wù)器發(fā)出一個讀取某 ASP.NET 站點(diǎn)上的某個 ASPX 網(wǎng)頁的請求。當(dāng)此請求通過網(wǎng)絡(luò)到達(dá) Web 服務(wù)器時,此請求被 HTTP.SYS 組件所接收。 HTTP.SYS 系統(tǒng)組件會檢查此 HTTP 請求的相關(guān)信息,根據(jù)其 URL 將此 HTTP 請求發(fā)送給運(yùn)行在某個應(yīng)用程序池中的工作者進(jìn)程處理。如果同時有多個針對此 ASP.NET 站點(diǎn)的 HTTP 請求, HTTP.SYS 會將這些請求排隊(duì),加入到對應(yīng)的應(yīng)用程序池的 HTTP 請求隊(duì)列中等待。
如果這是第一個對 ASP.NET 站點(diǎn)的 HTTP 請求,工作者進(jìn)程會加載 aspnet_isapi.dll ,并將請求轉(zhuǎn)給它, aspnet_isapi.dll 接著會裝載 .NET CLR [1] , 創(chuàng)建一個針對此 ASP.NET 站點(diǎn)的應(yīng)用程序域 [2] ,然后啟動一個復(fù)雜的由多個步驟和組件參與的處理流程,當(dāng)此處理流程結(jié)束,要發(fā)回給客戶端的結(jié)果(通常是 HTML 代碼,當(dāng)然也可以是其他類型的資源,比如由程序動態(tài)生成的圖片)已經(jīng)生成,此結(jié)果被轉(zhuǎn)發(fā)給 HTTP.SYS 。
注意: 對于以集成模式運(yùn)行的 IIS 7 , .NET CLR 在應(yīng)用程序池一啟動就自動裝載,從而避免了臨時裝載 CLR 的花銷。后繼處理過程與 IIS 6 基本一致。
HTTP.SYS 接收到請求的處理結(jié)果之后,將其緩存到緩沖區(qū)中,然后把處理結(jié)果發(fā)回給發(fā)出 HTTP 請求的瀏覽器。
上述過程是對 IIS 處理 HTTP 請求全過程的粗略描述。 8.2 節(jié)將選取這個處理過程中的主要階段,詳細(xì)介紹針對 ASP.NET 網(wǎng)頁的 HTTP 請求處理過程。
8.1.5 ISAPI擴(kuò)展、ISAPI篩選器和程序映射
在 IIS 的文檔中經(jīng)常會提到兩個術(shù)語: ISAPI 擴(kuò)展和 ISAPI 篩選器。
1 ISAPI 擴(kuò)展
“ ISAPI 擴(kuò)展( ISAPI Extension ) ”是一種可以添加到 IIS 中以增強(qiáng) Web 服務(wù)器功能的程序,其載體為 DLL 文件。它通常直接負(fù)責(zé)響應(yīng) HTTP 請求。
根據(jù) HTTP 請求要訪問的資源擴(kuò)展名(通過 URL 獲取), IIS 會選取特定的 ISAPI 擴(kuò)展來處理這一請求,這一過程被稱為“ 程序映射 ” 。 而用于響應(yīng) HTTP 請求的這一 ISAPI 擴(kuò)展被稱為“ HTTP Handler ( HTTP 處理程序) ”。 圖 8 ? 11 展示了 IIS 6 中的程序映射。
<shape id="圖片_x0020_8" style="visibility: visible; width: 301.5pt; height: 329.25pt;" type="#_x0000_t75" alt="IIS2" o:spid="_x0000_i1025"><imagedata o:title="IIS2" src="file:///C:%5CUsers%5CJINXUL%7E1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image002.jpg"><font size="3" color="#000000"></font></imagedata></shape>
圖 8 ? 11 程序映射( IIS 6 )
在 圖 8 ? 11 中可以看到, IIS 指定對 ASP.NET 網(wǎng)頁(其擴(kuò)展名為 .aspx )的請求將由 aspnet_isapi.dll 處理( 圖 8 ? 12 )。
<shape id="圖片_x0020_9" style="visibility: visible; width: 302.25pt; height: 170.25pt;" type="#_x0000_t75" alt="無標(biāo)題" o:spid="_x0000_i1026"><imagedata o:title="無標(biāo)題" src="file:///C:%5CUsers%5CJINXUL%7E1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image003.png"><font size="3" color="#000000"></font></imagedata></shape>
圖 8 ? 12 aspnet_isapi.dll 負(fù)責(zé)處理對 ASP.NET 網(wǎng)頁的請求
IIS 7 中的程序映射與 IIS 6 略有不同。當(dāng) IIS 7 以“經(jīng)典模式”運(yùn)行時,與 IIS 6 一樣使用 aspnet_isapi.dll 響應(yīng)針對“ .aspx ”的請求。但當(dāng) IIS 7 以“集成模式”運(yùn)行時,則使用托管處理程序( System.Web.UI.PageHandlerFactory )響應(yīng)針對“ .aspx ”的請求( 圖 8 ? 13 )。
<shape id="圖片_x0020_4" style="visibility: visible; width: 248.25pt; height: 221.25pt;" type="#_x0000_t75" o:spid="_x0000_i1027"><imagedata o:title="" src="file:///C:%5CUsers%5CJINXUL%7E1%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image004.png"><font size="3" color="#000000"></font></imagedata></shape>
圖 8 ? 13 IIS 7 集成模式下的程序映射
2 ISAPI 篩選器
“ISAPI篩選器( ISAPI Filter ) ” 也是一種 DLL ,但它不負(fù)責(zé)生成 HTTP 請求,它的主要作用是響應(yīng)某些特定的事件。當(dāng)這些事件發(fā)生時 ISAPI 篩選器被調(diào)用,它可以修改傳入或傳出的 HTTP 數(shù)據(jù)。
在 IIS 7 中,使用“ HTTP 模塊( HTTP Module ) ” 取代了傳統(tǒng) ISAPI 篩選器的功能。
注意: ISAPI 擴(kuò)展與 ISAPI 篩選器名字很相近,但其在 IIS 中的地位和所起的作用是不同的。
[1] CLR ( Comon Language Runtime ):通用語言運(yùn)行時,是 .NET 的核心,可以將其看成是一臺虛擬的專用于運(yùn)行 .NET 程序的計(jì)算機(jī)。
[2] 應(yīng)用程序域( Application Domain ): .NET 引入的一種代碼隔離機(jī)制,一個托管進(jìn)程可以擁有多個應(yīng)用程序域,在應(yīng)用程序域中可以裝載程序集,創(chuàng)建特定類型的對象,調(diào)用對象的方法。
*********************************************************
下一部分,將在本部分所介紹內(nèi)容的基礎(chǔ)上,詳細(xì)介紹與ASP.NET開發(fā)密切相關(guān)的“ASP.NET請求處理管線(HTTP Pipe Line)”
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
