標籤:讀取 pre rate ssr 尋找 system 返回 效能 擴充程式
ASP.NET請求處理機制
ASP.NET請求處理機制分為經典形式和整合形式 經典形式經典形式是為了與之前的版本相容,運用ISAPI擴充來調用ASP.NET運轉庫,原先運轉於IIS6.0下的Web應用程式遷移到IIS7.0中只需將應用程式配置成經典形式,代碼根本不用修正就能夠正常運轉。 整合形式整合形式是一種統一的乞求處置管道,它將ASP.NET懇求管道與IIS中心管道組合在一同,這種形式可以提供更好的效能,可以完成配置和管理的模組化,而且增加了運用Managed 程式碼模組擴充IIS時的靈敏性。假設老的Web應用程式運轉於IIS7.0的整合形式下,可能需求對應用程式的web.config檔案停止修正,特別是運用了完成IHttpHandler介面的自訂模組的狀況。IIS7.0在同一個效勞器上可以同時支援兩種形式的應用程式。 一、收到一個請求,用戶端發送給伺服器端 二、一個http請求對應一個http報文(http://......) 三、http.sys組件擷取http請求,轉交給iis做處理,過程中,先通過緩衝查看是否有緩衝,若有緩衝直接從緩衝區讀取緩衝交給iis,沒有就響應請求後交給iis。 四、伺服器iis收到請求後,判斷請求的內容是否動靜態資源,是靜態資源,直接讀取;若是動態資源,處理動態資源,交給查詢映射表尋找由哪個擴充程式來處理這個請求,一般由aspnet_isapi.dll這個組件進行處理,產生響應請求後讀取。 五、動態資源 W3WP.exe 會載入 aspnet_isapi.dll 當用戶端向web伺服器請求一個*.aspx的分頁檔時,同asp類似,這個http請求也會被inetinfo.exe進程截獲(www服務),它判斷檔案尾碼之後,把這個請求轉交給ASPNET_ISAPI.DLL而ASPNET_ISAPI.DLL則會通過一個Http PipeLine的管道,將這個http請求發送給ASPNET_WP.EXE進程,當這個HTTP請求進入ASPNET_WP.EXE進程之後,asp.net framework就會通過HttpRuntime來處理這個Http請求,處理完畢後將結果返回給用戶端。 六、NET運行時的載入 .NET Runtime 如果Web應用程式是第一次載入,那麼首先會由aspnet_isapi.dll載入.NET運行時(主要是調用伺服器上的.Net Framework建立CLR運行時)。而一個IIS背景工作處理序裡有一個應用程式集區,其中可以承載多個應用程式定義域AppDomain。 七、應用程式集區 應用程式集區就是可以看成裝載電腦分配給動態網站的記憶體的容器 八、應用程式定義域 使用.NET建立的可執行程式,並沒有直接承載到進程當中,而是承載到應用程式定義域(AppDomain)當中。應用程式定義域是.NET引入的一個新概念,它比進程所佔用的資源要少,可以被看作是一個輕量級的進程。 九、ISAPIRuntme.ProcessRequest()方法是進入ASP.Net的第一個入口,ASP.Net的核心處理部分就剛剛開始。此篇我將其稱為前奏,是因為它是在ASP.Net的核心處理部分之前,將HTTP請求一步一步地傳遞給了ISAPIRuntime對象,後面我們再繼續探索ASP.Net的請求處理機制,今天就到此結束!
整合形式
微軟官方圖片
從該生命週期可以看出,整合模式下不管Managed 程式碼還是機器碼,都可以在身分識別驗證和執行處理常式被插入到核心代碼的Managed 程式碼攔截。在IIS6下,要想攔截機器碼,比如Htm檔案,需要編寫WIN32的Unmanaged 程式碼,但它也保留擴充的ISAPI,我們可以寫Managed 程式碼攔截託管檔案的請求。雖然IIS6也可以通過IIS插入ISAPI為aspnet_isapi.dll的擴充,處理對htm檔案的攔截,但它實際會走兩個通道,首先是IIS內部的機器碼攔截,然後是Managed 程式碼ISAPI的攔截。傳統模式就是為了保留和IIS6一樣的處理方式,以前開發的代碼,可以方便的移植到IIS7上。
IIS7整合模式還增加了MapRequestHandler、LogRequest 和 PostLogRequest 事件,如果在傳統模式下加了這些處理事件,會拋出:此操作要求使用 IIS 整合管線模式。如果整合模式下不讓IIS處理不相容整合模式的配置以及處理方式,可以在web.config中配置:
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>即可。
實際上IIS7整合模式,就是讓使用者可以通過編寫Managed 程式碼的handler等,把Managed 程式碼插入到IIS核心代碼中來解析,方便大家精確控制任意請求,帶來更好的擴充性。但缺點呢,我認為整合模式,任何檔案請求都可能經過Managed 程式碼處理,別人不想把類試圖片和靜態檔案用Managed 程式碼處理,就得想其他辦法了,這樣會不會內部效率降低,但這都是個人觀點。
如果在IIS7整合模式下使到httpmodule攔截靜態檔案請求,需要在web.server節下設定runAllManagedModulesForAllRequests="true"
.NET 進階架構師0001 一切從源頭開始