ASPNET管道()
以IIS 為例在工作進程wwpexe中利用aspnet_isapidll加載NET運行時(如果NET運行時尚未加載)IIS 引入了應用程序池的概念一個工作進程對應著一個應用程序池一個應用程序池可以承載一個或多個Web應用每個Web應用映射到一個IIS虛擬目錄與IIS x一樣每一個Web應用運行在各自的應用程序域中
如果HTTPSYS接收到的HTTP請求是對該Web應用的第一次訪問在成功加載了運行時後會通過AppDomainFactory為該Web應用創建一個應用程序域隨後一個特殊的運行時IsapiRuntime被加載IsapiRuntime定義在程序集SystemWeb中對應的命名空間為SystemWebHosting被加載的IsapiRuntime會接管該HTTP請求
IsapiRuntime會首先創建一個IsapiWorkerRequest對象用於封裝當前的HTTP請求並將該IsapiWorkerRequest對象傳遞給ASPNET運行時HttpRuntime從此時起HTTP請求正式進入了ASPNET管道HttpRuntime會根據IsapiWorkerRequest對象創建用於表示當前HTTP請求的上下文(Context)對象HttpContext
隨著HttpContext被成功創建HttpRuntime會利用HttpApplicationFactory創建新的或獲取現有的HttpApplication對象實際上ASPNET維護著一個HttpApplication對象池HttpApplicationFactory從池中選取可用的HttpApplication用於處理HTTP請求處理完畢後將其釋放到對象池中HttpApplicationFactory負責處理當前的HTTP請求
在HttpApplication初始化過程中會根據配置文件加載並初始化相應的HttpModule對象對於HttpApplication來說在它處理HTTP請求的不同階段會觸發不同的事件(Event)而HttpModule的意義在於通過注冊HttpApplication的相應的事件將所需的操作注入整個HTTP請求的處理流程ASPNET的很多功能比如身份驗證授權緩存等都是通過相應的HttpModule實現的
最終完成對HTTP請求的處理實現在HttpHandler中對於不同的資源類型具有不同的HttpHandler比如aspx頁面對應的HttpHandler為SystemWebUIPageWCF的svc文件對應的HttpHandler為SystemServiceModelActivationHttpHandler上面整個處理流程如圖所示
圖 ASPNET 處理管道
HttpApplication
HttpApplication是整個ASPNET基礎架構的核心它負責處理分發給它的HTTP請求由於一個HttpApplication對象在某個時刻只能處理一個請求只有完成對某個請求的處理後HttpApplication才能用於後續的請求的處理所以ASPNET采用對象池的機制來創建或獲取HttpApplication對象
當第一個請求抵達時ASPNET會一次創建多個HttpApplication對象並將其置於池中選擇其中一個對象來處理該請求處理完畢後HttpApplication不會被回收而是釋放到池中對於後續的請求空閒的HttpApplication對象會從池中取出如果池中所有的HttpApplication對象都處於繁忙的狀態ASPNET會創建新的HttpApplication對象
HttpApplication處理請求的整個生命周期是一個相對復雜的過程在該過程的不同階段會觸發相應的事件我們可以注冊相應的事件將處理邏輯注入到HttpApplication處理請求的某個階段表按照實現的先後順序列出了HttpApplication在處理每一個請求時觸發的事件名稱
表 HttpApplication事件列表
返回目錄ASPNET MVC 框架揭秘
編輯推薦
ASP NET開發培訓視頻教程
Microsoft NET框架程序設計視頻教程
Java程序性能優化讓你的Java程序更快更穩定
Visual C++音頻/視頻技術開發與實戰
From:http://tw.wingwit.com/Article/program/net/201311/16117.html