天天看點

HttpHand和HttpModule的詳細解釋,包括Asp.Net對Http請求的處理流程

了解當使用者對一個.aspx頁面提出請求時,背景的Web伺服器的動作流程。當對這個流程了解後,我們就會明白HttpHandler和HttpModule的作用了。

首先,來了解一下IIS系統。它是一個程式,負責對網站的内容進行管理,以及對客戶的請求(就是Http請求)做出反應。當使用者對一個頁面提出請求時,IIS做如下反應(忽略權限):

1.把對方請求的虛拟路徑轉換成實體路徑

2.根據實體路徑搜尋請求的檔案

3.找到檔案後,擷取檔案的内容

4.生成Http頭資訊。

5.向用戶端發送所有的檔案内容:首先是頭資訊,然後是Html内容,最後是其它檔案的内容。

6.用戶端IE浏覽器獲得資訊後,解析檔案内容,找出其中的引用檔案,如.js .css .gif等,向IIS請求這些檔案。

7.IIS擷取請求後,發送檔案内容。

8.當浏覽器擷取所有内容後,生成内容界面,客戶就看到圖像/文本/其它内容了。

但是IIS有個缺點,即它僅僅支援靜态html頁面的内容,就是說,他隻能分析如.htm,.html這樣的檔案内容。像一些動态内容的頁面,含有伺服器端操作代碼的頁面類型,如.asp,.aspx,.cgi,.php等,IIS不認識這些專用的标記,它就會把它當作文本,絲毫不做處理發送到用戶端。

為了解決這個問題。IIS推出了一種機制,叫做ISAPI的開放擴充,這個東西是一個标準元件(COM元件),他是一個過濾器+跳轉程式,如果安裝了專門的擴充,那麼在通路IIS所不能處理的檔案時,如.asp和.aspx檔案,IIS就會在自己的程序裡面啟動這個擴充。剛才說了,ISAPI首先是個過濾器,他在注冊到IIS的時候,會把每個擴充可以處理的檔案擴充名注冊到IIS裡面。擴充啟動後,就根據定義好的方式來處理IIS所不能處理的檔案,然後把控制權跳轉到專門處理代碼的程序中。讓這個程序開始處理代碼,生成标準的HTML代碼,生成後把這些代碼加入到原有的Html中,最後把完整的Html傳回給IIS,IIS再把内容發送到用戶端。

我拿一個請求asp.net頁面的執行步驟說明:

1 用戶端IE浏覽器通過Http協定向一個Web伺服器提出請求,如

2 當請求到達時,IIS 檢查資源類型(就是檢查請求檔案的擴充名,發現不是自己所能處理的),就調用 ASP.NET ISAPI 擴充。如果啟用了預設的程序模型,aspnet_isapi 會将請求排隊,并将請求配置設定給輔助程序。所有的請求資料都通過異步 I/O 發送。如果啟用了 IIS 6 程序模型,請求将自動在輔助程序 (w3wp.exe) 中排隊,此輔助程序用于處理應用程式所屬的 IIS 應用程式池。IIS 6 輔助程序不了解 ASP.NET 和托管代碼的任何情況,它隻是處理 *.aspx 擴充并加載 aspnet_isapi 子產品。當 ASP.NET ISAPI 在 IIS 6 程序模型中運作時,它的工作方式有所不同,僅在 w3wp.exe 輔助程序的上下文中加載 CLR。

3 收到請求後,ASP.NET 輔助程序将通知 ASP.NET ISAPI,它将為請求服務。通知通過同步 I/O 實作。之是以使用同步模型,是因為請求隻有在 ISAPI 内部請求表中被标記為“executing”,輔助程序才能開始處理它。如果請求已經由特殊的輔助程序進行處理,則不能再将它指定到其他程序,除非原始程序已取消。

4 完成後,響應被發送到打開了異步管道的 aspnet_isapi。現在,請求的狀态變為“Done”,之後将從請求表中被删除。如果輔助程序崩潰,正在處理的所有請求仍将保持“executing”狀态并持續一段時間。如果 aspnet_isapi 檢測到輔助程序已取消,它将自動終止請求并釋放所有相關的 IIS 資源。

5 最後,ISAPI擷取了響應(就是經過asp.net運作庫所處理後的html内容)後,把響應傳回給IIS,IIS将繼續處理它的内容,解析所需相關檔案,并且把所有的資料發送給用戶端。然後關閉連接配接。

從上面的叙述可以知道,最終要的步驟是Asp.net處理的那一段過程,就是當asp.net的ISAPI啟動處理程序後發生了什麼事

本文轉自94cool部落格園部落格,原文連結:http://www.cnblogs.com/94cool/articles/1499347.html,如需轉載請自行聯系原作者