ASP.NET Web編程原理 之
IIS架構與HTTP請求處理流程(3)
(
續前文
)
8.1.4 HTTP請求的處理過程
在了解了 IIS 的架構之后,來看一下 IIS 架構中的各個組成部分是如何相互配合處理 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 服務器間“一問一答”的過程 。
首先,瀏覽器嘗試連接 Web 服務器的 80 端口,如果 Web 服務器可以響應此連接請求,就在瀏覽器與 Web 服務器間建立了一個通訊鏈路,在此“通道”上瀏覽器與 Web 服務器可以相互發送與接收信息。
假設瀏覽器向 Web 服務器發出一個讀取某 ASP.NET 站點上的某個 ASPX 網頁的請求。當此請求通過網絡到達 Web 服務器時,此請求被 HTTP.SYS 組件所接收。 HTTP.SYS 系統組件會檢查此 HTTP 請求的相關信息,根據其 URL 將此 HTTP 請求發送給運行在某個應用程序池中的工作者進程處理。如果同時有多個針對此 ASP.NET 站點的 HTTP 請求, HTTP.SYS 會將這些請求排隊,加入到對應的應用程序池的 HTTP 請求隊列中等待。
如果這是第一個對 ASP.NET 站點的 HTTP 請求,工作者進程會加載 aspnet_isapi.dll ,并將請求轉給它, aspnet_isapi.dll 接著會裝載 .NET CLR [1] , 創建一個針對此 ASP.NET 站點的應用程序域 [2] ,然后啟動一個復雜的由多個步驟和組件參與的處理流程,當此處理流程結束,要發回給客戶端的結果(通常是 HTML 代碼,當然也可以是其他類型的資源,比如由程序動態生成的圖片)已經生成,此結果被轉發給 HTTP.SYS 。
注意: 對于以集成模式運行的 IIS 7 , .NET CLR 在應用程序池一啟動就自動裝載,從而避免了臨時裝載 CLR 的花銷。后繼處理過程與 IIS 6 基本一致。
HTTP.SYS 接收到請求的處理結果之后,將其緩存到緩沖區中,然后把處理結果發回給發出 HTTP 請求的瀏覽器。
上述過程是對 IIS 處理 HTTP 請求全過程的粗略描述。 8.2 節將選取這個處理過程中的主要階段,詳細介紹針對 ASP.NET 網頁的 HTTP 請求處理過程。
8.1.5 ISAPI擴展、ISAPI篩選器和程序映射
在 IIS 的文檔中經常會提到兩個術語: ISAPI 擴展和 ISAPI 篩選器。
1 ISAPI 擴展
“ ISAPI 擴展( ISAPI Extension ) ”是一種可以添加到 IIS 中以增強 Web 服務器功能的程序,其載體為 DLL 文件。它通常直接負責響應 HTTP 請求。
根據 HTTP 請求要訪問的資源擴展名(通過 URL 獲取), IIS 會選取特定的 ISAPI 擴展來處理這一請求,這一過程被稱為“ 程序映射 ” 。 而用于響應 HTTP 請求的這一 ISAPI 擴展被稱為“ 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 網頁(其擴展名為 .aspx )的請求將由 aspnet_isapi.dll 處理( 圖 8 ? 12 )。
<shape id="圖片_x0020_9" style="visibility: visible; width: 302.25pt; height: 170.25pt;" type="#_x0000_t75" alt="無標題" o:spid="_x0000_i1026"><imagedata o:title="無標題" 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 負責處理對 ASP.NET 網頁的請求
IIS 7 中的程序映射與 IIS 6 略有不同。當 IIS 7 以“經典模式”運行時,與 IIS 6 一樣使用 aspnet_isapi.dll 響應針對“ .aspx ”的請求。但當 IIS 7 以“集成模式”運行時,則使用托管處理程序( System.Web.UI.PageHandlerFactory )響應針對“ .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 ,但它不負責生成 HTTP 請求,它的主要作用是響應某些特定的事件。當這些事件發生時 ISAPI 篩選器被調用,它可以修改傳入或傳出的 HTTP 數據。
在 IIS 7 中,使用“ HTTP 模塊( HTTP Module ) ” 取代了傳統 ISAPI 篩選器的功能。
注意: ISAPI 擴展與 ISAPI 篩選器名字很相近,但其在 IIS 中的地位和所起的作用是不同的。
[1] CLR ( Comon Language Runtime ):通用語言運行時,是 .NET 的核心,可以將其看成是一臺虛擬的專用于運行 .NET 程序的計算機。
[2] 應用程序域( Application Domain ): .NET 引入的一種代碼隔離機制,一個托管進程可以擁有多個應用程序域,在應用程序域中可以裝載程序集,創建特定類型的對象,調用對象的方法。
*********************************************************
下一部分,將在本部分所介紹內容的基礎上,詳細介紹與ASP.NET開發密切相關的“ASP.NET請求處理管線(HTTP Pipe Line)”
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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