前言
前前后后寫了不少關於某些技術啥的博客,一直在追新求深,而真正使用上的時候才發現了解的太少太少了,從事.net開發三年有余了不是它不行了而是我堅持不住了,如今不得不向生活低頭,這個系列作為三年技術知識的一個小小總結吧,最主要的是寫給自己也許這些在技術大牛哪里根本不值一提,而我卻把它當成我的全部.
簡介
主要剖析一下客戶端(Browser)發送請求到服務端過程如何處理
ASP.NET請求解析
IIS6
請求流程:客戶端向IIS發送請求,該請求由http.sys(監聽),當監聽到http請求時分配w3wp.exe運行進程進行(處理),若為靜態請求直接返回客戶端,其他則搜尋擴展程序表也就是(監控)程序(Metabase) 查找相應ISAPI.DLL處理,如圖:
IIS7
與6相比較7不僅僅多了許多功能 其實本質上沒有太大變化工作流程如圖:
1.IIS7 服務器不僅僅支持最大連接數限制還可以限制帶寬使用
2.IIS7增加了失敗請求跟蹤規則
3.應用程序池單獨權限設置
此外.iis7與ii6 映射策略略有不同,當iis啟用經典模式的時候與iis6一樣使用aspnet_isapi.dll針對.aspx請求處理,但是當啟用集成模式的時候則使用托管程序處理(System.Web.UI.PageHandlerFactory)
CLR處理機制
如上圖所示根據集成魚托管模式區分調用有所差異aspnet_isapi.dll 工作原理如圖:
這里引用一下園子小哥的總結:
由ISAPI aspnet_isapi.dll加載CLR環境。
-
IsapiRuntime運行時被加載,接管了HTTP請求后,創建IsapiWorkerRequest對象來封裝當前的HTTP請求,隨后把對象傳遞給ASP.NET運行時HttpRuntime。
-
HttpRuntime會根據IsapiWorkerRequest對象創建表示當前HTTP請求的上下文對象HttpContext。
-
HttpApplicationFactory會創建或者從HttpApplication對向池中選取可用的HttpApplication對象,處理完后釋放。
-
HttpApplication在初始化中,ASP.NET會根據配置文件加載HttpModule對象(用於注冊HttpApplication對應的事件,將所需的操作注入Htt請求的處理流程)
-
Http請求最終由HttpHandler處理。不同的資源類型對應不同的HttpHandler。
總結
首先,瀏覽器嘗試連接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,創建一個針對此ASP.NET站點的應用程序域,然后啟動一個復雜的由多個步驟和組件參與的處理流程,當此處理流程結束,要發回給客戶端的結果(通常是HTML代碼,當然也可以是其他類型的資源,比如由程序動態生成的圖片)已經生成,此結果被轉發給HTTP.SYS。
注意:對於以集成模式運行的IIS 7,.NET CLR在應用程序池一啟動就自動裝載,從而避免了臨時裝載CLR的花銷。后繼處理過程與IIS 6基本一致。