從一個頁面比如www.cnblogs.com的請求開始如何就能開啟cnblogs頁面的呢?這其中發生了什麼樣的東西?
Http請求(Http Request)
當伺服器(IIS)接受到一個Http請求的時候進行以下步驟的處理:
1)伺服器擷取所請求的頁面的尾碼名(因為可能是.ASPX,.JPG等不僅僅是ASPX頁面)
2)伺服器會尋找處理該尾碼名的應用程式,如果伺服器沒有找到這類的尾碼名處理常式,並且這個檔案也不是受保護的那麼將直接返回給用戶端。
3)能夠處理這類尾碼名的應用程式叫做ISAPI應用程式(Internet Server Application Programe Interface),他實際上時一個介面,起到一個代理的作用,主要就是把對應的請求映射到相對應的實際處理常式上去。當一個請求找到一個對應的ISAPI那麼他就執行把該請求交給對應的ISAPI進行處理。
我們所常用的.aspx檔案是由aspnet_isapi.dll這個程式來處理的。ASP.NET只是IIS的一個組成部分,他是ISAPI的一個擴充而已不是全部。
Http.SYS
那麼IIS是如何擷取外部的HTTp請求的呢?這個就要依靠HTTP.SYS這個驅動程式了。
1)在作業系統啟動的時候,IIS會在HTTP.SYS中註冊自己的虛擬路徑
2)當一個請求時一個可訪問的URL,那麼HTTP.SYS就會將這個請求交給IIS工作者進程。(IIS6.0,7.0是W3WP.EXE,5.0是aspnet_wp.exe).每個工作者進程都有一個身份標示,以及一系列的選擇性參數(比如回收機制的設定,逾時設定等)
3)就是執行上面ISAPI所說的過程了。
從上面可以看出HTTP.SYS是一個內建的驅動程式,他是用來監聽外部對IIS的請求的。
4)ISAPI除了進行程式映射外還進行一些其他的操作,從HTTP.SYS中擷取當前HTTP請求資訊,並且將這些資訊儲存到HttpWorkerRequest類中,在相互隔離的AppDamain中載入HttpRuntime,調用HttpRuntime的ProcessRequest方法。
5)然後就執行我們程式員所寫的代碼了
6)IIS接受返回資料流,並且重新返回給HTTP.SYS,最後HTTP.SYS再將這些資料返回給用戶端瀏覽器。
HTTP管道(Pileline)
當一個Http請求到達程式後事怎麼處理的呢?
當Http請求進入到Asp.net Runtime以後,它由託管模組(HttpModule)和處理常式(HttpHandler)組成,並且由管道來處理這個Http請求。
整個資料的流動:
1)HttpRuntime將Http請求轉交給HttpApplication(代表著我們建立的web應用程式)。HttpApplication建立針對此Http請求的HttpContext內容物件用來儲存請求的其他對象比如HttpRequest,HttpResponse,HttpSessionState.
2)Http請求通過一系列的Module,這些Module對這個Request具有完全控制許可權。然後做一些某個具體Handler之前的事。
3)Http請求經過所以的HttpModule之後就被HttpHandler處理。
4)然後再返回給HttpModule做一些某個具體Handler之後的事