天天看點

HTTP Pipeline

————————————————————————————————

———————————————————————————————

http://msdn.microsoft.com/en-us/magazine/cc188942.aspx#S1

處理http請求使用管道模型

如下圖:

HTTP Pipeline

http請求傳到一個HttpRuntime類的執行個體,也就是管道的開始。HttpRuntime對象檢測這個請求,然後識别出他該被發送到哪個應用程式(從管道的角度來看,一個虛拟路徑就是一個應用程式。)然後他使用HttpApplicationFactory來找到或者建立一個HttpApplication對象,以此處理請求。一個HttpApplication持有一組HTTP module對象,實作了IHttpModule 接口。HttpApplication 使用HTTP handler factory 來找到或者建立一個HTTP handler對象。HTTP handler是HTTP通信的終點,它處理請求消息,産生相應的響應消息。HTTP handlers和handler factories各自實作了IHttpHandler 接口和IHttpHandlerFactory接口。

一個HttpApplication,它的module和handler在一個時間内隻能用來處理一個請求。如果多個請求同時到達,并且指向同一個應用程式,那麼将會使用多個HttpApplication。為了效率原因,HttpApplicationFactory和HttpHandlerFactory把HttpApplication和HTTP handler各自池化。

管道使用HttpContext對象來代表每對請求/響應,這個對象傳遞給HttpApplication,HttpApplication在把它傳遞給HTTP handler。每個Module也可以通路目前的HttpContext。HttpContext 對象暴露的屬性代表了HTTP請求和響應消息,它們是HttpRequest 和HttpResponse 類的執行個體。HttpContext也暴露了表示安全的屬性,和每個Call,每個session,每個application狀态。下圖表示HttpContext 最常用的屬性。

Application:Per-application cross-request state

Application Instance:Application object processing request

Cache:Per-application cached state

Handler:Handler object processing request

Items:Per-request state

Request:HTTP request message

Response:HTTP response message

Server:Utility functions

Session:Per-user cross-request state

User:User information

ASP.NET HTTP管道依靠IIS接收處理請求(它也可以被內建到其他web伺服器中)。當IIS收到HTTP請求後,它會檢查擴充名,如果檔案字尾名關聯到的是可執行代碼,IIS将會調用代碼處理請求。映射檔案字尾名和可執行代碼的規則記錄在IIS中繼資料庫中,當ASP.NET安裝後,它會将這個映射關系添加到IIS中,包括.aspx,.asmx映射到aspnet_isapi.dll。

當IIS收到一個HTTP請求,它會調用在aspnet_isapi.dll中的代碼,Aspnet_isapi.dll使用一個命名管道将請求從IIS服務轉發到ASP.NET工作程序的一個執行個體上,aspnet_wp.exe。在windows .net伺服器上,asp.net內建了IIS6.0核心模式HTTP監聽,允許請求從作業系統直接傳遞到工作程序,不需要通過inetinfo.exe。工作程序使用HttpRuntime類的執行個體來處理請求

HTTP Pipeline

HTTP管道總是在工作程序的一個執行個體中處理請求,預設的,一個時間内隻有一個工作程序在處理。如果你的WEB伺服器有多個cpu,你可以配置管道使用多程序。管道工作程序通過APPdomain實作隔離。你可以認為一個Appdomain是一個輕量級的程序中的程序。管道發送所有的HTTP請求,指向同一個虛拟路徑到單一的AppDomain。換句話說,每個虛拟路徑都被看做獨立的應用程式。

ASP.NET支援基于一些規則上,循環利用工作程序,包括時間,時間花銷,請求服務數,請求隊列數,和實體記憶體消耗。全局的.NET配置檔案,machine.config設定這些值的閥值。當一個aspnet_wp.exe穿過這些閥值,aspnet_isapi.dll會啟動一個新的工作程序執行個體,開始發送請求。老的執行個體在完成處理請求後終結。循環利用工作程序提升了可靠性。

完整的http請求在asp.net framework中的處理流程:

HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->ASPNET_WP.EXE-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()

如果想在中途截獲一個httpRequest并做些自己的處理,就應該在HttpRuntime運作時内部來做到這一點,确切的說時在HttpModule這個容器中做到這個的。

可以簡單的認為如下的流程。