ASP.NET中處理HTTP請求的原理

ASP.NET中處理HTTP請求的原理 (轉)html

ASP.Net產生的大背景: 在Internet時代的開端,客戶端的需求很是有限;.htm文件就能夠知足他們的需求。可是,隨着時間的流逝,客戶端需求的擴充超越了.htm文件或靜態文件所包含的功能。 開發者須要擴充或擴展Web服務器的功能。Web服務器廠商設計了不一樣的解決方案,可是都遵循同一個主題「向Web服務器插入某些組件」。全部的Web服務器補充技術都容許開發者創建並插入組件以加強Web服務器的功能。微軟公司提出了ISAPI(Internet服務器API),網景公司提出了NSAPI(網景服務器API)等等。 因爲這些組件的複雜性,實現它們很是困難。開發者不得不使用C/C++來開發這些組件,可是對於不少人來講,使用C/C++進行開發簡直就是痛苦的代名詞。 那麼ASP.NET提供什麼東西來實現這些功能呢?ASP.NET提供的是HttpHandler(HTTP處理程序)和HttpModule(HTTP模塊)。web

ASP.Net請求原理概述: ASP.NET請求處理過程是基於管道模型的,在模型中ASP.NET把http請求傳遞給管道中的全部模塊。每一個模塊都接收http請求並有徹底控制權限。模塊能夠用任何自認爲適合的方式來處理請求。一旦請求通過了全部HTTP模塊,就最終被HTTP處理程序處理。HTTP處理程序對請求進行一些處理,而且結果將再次通過管道中的HTTP模塊。 請注意在http請求的處理過程當中,只能調用一個HTTP處理程序,然而能夠調用多個HTTP模塊 處理流程的圖式:ajax

請不要疑惑,這裏只是簡單說明了一些概念和處理流程,在隨後的內容中咱們還會詳細介紹各個概念。設計模式

Http處理程序: 什麼是Http處理程序(What): ASP.Net在處理請求的時候和其餘開發語言不同(好比:Structs,Spring,Jsf等等),它對於MVC的實現有些異類,咱們的ASP.Net會根據不一樣類型的提交文件調用不一樣的Http處理程序類,這些處理方法的配置在咱們的machine.config中都可以看到例如:緩存

<httpHandlers> <add verb="*" path="trace.axd"(此時的文件全名爲   trace.axd.cs 是經過添加class 的時候加上去的) type="System.Web.Handlers.TraceHandler"/> <add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/> <add verb="*" path="*.ashx" type="System.Web.UI.SimpleHandlerFactory"/> <add verb="*" path="*.config" type="System.Web.HttpForbiddenHandler"/> <add verb="GET,HEAD" path="*" type="System.Web.StaticFileHandler"/> . . . . . . . . . . . . </httpHandlers> 在上面的配置信息中咱們能夠看到若是客戶端請求的頁面類型是*.aspx的話,那麼咱們的ASP.Net會直接把它分發給System.Web.UI.PageHandlerFactory來處理,這個工廠類會根據不一樣的請求需求產生相應的PageHandler類來處理這次請求,其它信息以次類推。 其中 verb=*表示:全部的請求都適用,若是隻想處理Get和Post請求的話,那麼能夠這樣寫verb=」Post,Get」 或者是寫成verb="*" Path表示處理的請求文件類型。 Type表示使用什麼Http處理程序來處理 ,如如果通常的狀況下(注:不是ashx文件的通常),則是徹底限定名(命名空間.類名).程序集名(dll名稱,可是不用寫後綴名),若是用戶想使用如今比較流行的Ajax.Net的話能夠做以下配置:安全

<httpHandlers> <add verb="Post,Get" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory,AjaxPro"/> </httpHandlers> 從上面的內容能夠看出,若是使用Ajax.Net的話首先要說明它只支持Post和Get請求,只有在提交ashx這種Ajax文件的時候才做Ajax處理,處理類爲 AjaxHandlerFactory建立出來的AjaxPro類。服務器

爲何要使用Http處理程序(Why):         很明顯Http處理程序能夠被當作是ASP.Net體系架構中的控制層,當一張ASP.Net的aspx頁面被請求後,會先把控制全轉給特定Http處理程序【PageHandlerFactory】,該程序首先在IIS容器的輸出緩存(OutputCache)中查找是否有對應的頁面處理類的程序集(DLL),若是存在就直接調用,不存在的話就先將ASPX頁面中的代碼分離開來,將它編譯成ASPX頁面中配置的CodeBehinde屬性對應的*.cs文件,隨後將*.cs文件編譯成中間語言(IL)存放在IIS中和輸出緩存(OutputCache)中,整個過程便完成了一次ASPX頁面的請求         Http處理程序在整個過程當中明顯扮演了控制層的做用。使用Http處理程序能夠減輕表示層*.aspx頁面和業務層*.cs的負擔,使整個處理過程變得流程清晰和簡潔。架構

        如何自定義Http處理程序類(How): 要可以建立本身的Http處理程序類必須實現.Net的System.Web.IHttpHandler接口,任何實現了IHttpHandler接口的類均可以用於處理輸入的HTTP請求框架

HTTP處理程序實現了下列方法:post

方法名稱 描述
ProcessRequest 這個方法其實是http處理程序的核心。咱們調用這個方法來處理http請求。
IsReusable 咱們調用這個屬性來決定http處理程序的實例是否能夠用於處理相同其它類型的請求。HTTP處理程序能夠返回true或false來代表它們是否能夠重複使用。
可使用web.config或者machine.config文件把這些類映射到http請求上。映射完成之後,當接收到相應請求的時候ASP.NET會實例化http處理程序。咱們將解釋如何在web.config和/或machine.config文件中定義全部這些細節信息。

ASP.NET還經過IHttpHandlerFactory接口支持http處理程序的擴展。ASP.NET提供了把http請求路由到實現IHttpHandlerFactory接口的類的對象上的能力。此外,ASP.NET還利用了Factory設計模式。這種模式爲創建一組相關對象而不提供具體類的功能提供了接口。簡單的說,你能夠把用於創建依賴傳遞進來的參數創建的http處理程序對象的類看做是factory(工廠)。咱們不用指定須要實例化的特定的http處理程序;http處理程序工廠處理這種事務。這樣作的優勢在於若是將來實現IHttpHandler接口的對象的實現方法發生了改變,只要接口仍然相同,客戶端就不會受到影響。

Http處理模塊: 什麼是Http處理模塊(What):         在【ASP.Net請求原理概述】中咱們已經知道,請求在進入管道後多個Http處理模塊會在Http處理程序處理以前,搶先處理請求,這些處理模塊其實就是一些普通的功能類,他們在服務啓動的時候就駐留在了IIS容器中,當請求通過的時候處理模塊會根據自身類的功能處理掉一些請求,好比Web.config中配置的身份驗證,用戶資源訪問權限設置等都有對應的Http處理模塊。

爲何要使用Http處理模塊(Why):         Http處理模塊能夠減輕Http處理程序的壓力,使整個請求過程變得暢通,在任何一個模塊處理過程發生了異常均可以終止當前請求,這樣不但提升了效率並且是處理更安全 處理以上的優勢之外,Http處理模塊還能夠細分控制層,每一個模塊負責單一的處理工做,使得處理流程更明確。         和Http處理程序同樣在Machine.config中一樣配置了ASP.Net默認的一些處理模塊,見下表:

<httpModules> <add name="OutputCache" type="System.Web.Caching.OutputCacheModule"/> <add name="Session" type="System.Web.SessionState.SessionStateModule"/> <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule>? <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/> <add name="PassportAuthentication" type="Security.PassportAuthenticationModule"/> <add name="UrlAuthorization" type="Security.UrlAuthorizationModule"/> <add name="FileAuthorization" type="Security.FileAuthorizationModule"/> </httpModules> ASP.NET使用上面一些HTTP模塊來提供一些服務,例如身份驗證和受權、對話管理和輸出緩衝。因爲這些模塊都註冊在machine.config文件中。

如何建立自定義的Http處理模塊(How): 要建立自定義HTTP模塊必須System.Web.IhttpModule接口的.NET組件。這些組件經過在某些事件中註冊自身,把本身插入ASP.NET請求處理管道。當這些事件發生的時候,ASP.NET調用對請求有興趣的HTTP模塊,這樣該模塊就能處理請求了。 HTTP模塊實現了IhttpModule接口的下面一些方法:

方法名稱 描述
Init 這個方法容許HTTP模塊向HttpApplication 對象中的事件註冊本身的事件處理程序。
Dispose 這個方法給予HTTP模塊在對象被垃圾收集以前執行清理的機會。

總結:         其實ASP.Net變異的實現MVC框架技術,它的控制層(C)是因爲實現了IhttpHander,IhttpHandlerFactory接口的Http處理程序類和實現了IhttpModule的Http處理模塊類組成的,他們負責處理請求,若是學過Structs的同窗知道它有點相似於ActionServlet和Jsf中的FacesServlet,而表示層(V)很明顯就是那些Asp.Net的頁面文件,而模型層(M)就是被控制層轉譯成*.cs文件的代碼隱藏類 (CodeBehinde對應的類),雖然ASP.Net的MVC有點怪異,可是不能否認ASP.NET已經給開發者提供了強大的能量。

相關文章
相關標籤/搜索