日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET中处理HTTP请求的原理 (转)

發(fā)布時間:2025/6/15 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET中处理HTTP请求的原理 (转) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ASP.Net產(chǎn)生的大背景:
在Internet時代的開端,客戶端的需求非常有限;.htm文件就可以滿足他們的需求。但是,隨著時間的流逝,客戶端需求的擴充超越了.htm文件或靜態(tài)文件所包含的功能。
開發(fā)者需要擴充或擴展Web服務器的功能。Web服務器廠商設計了不同的解決方案,但是都遵循同一個主題“向Web服務器插入某些組件”。所有的Web服務器補充技術(shù)都允許開發(fā)者建立并插入組件以增強Web服務器的功能。微軟公司提出了ISAPI(Internet服務器API),網(wǎng)景公司提出了NSAPI(網(wǎng)景服務器API)等等。
由于這些組件的復雜性,實現(xiàn)它們非常困難。開發(fā)者不得不使用C/C++來開發(fā)這些組件,但是對于很多人來說,使用C/C++進行開發(fā)簡直就是痛苦的代名詞。
那么ASP.NET提供什么東西來實現(xiàn)這些功能呢?ASP.NET提供的是HttpHandler(HTTP處理程序)和HttpModule(HTTP模塊)。

ASP.Net請求原理概述:
ASP.NET請求處理過程是基于管道模型的,在模型中ASP.NET把http請求傳遞給管道中的所有模塊。每個模塊都接收http請求并有完全控制權(quán)限。模塊可以用任何自認為適合的方式來處理請求。一旦請求經(jīng)過了所有HTTP模塊,就最終被HTTP處理程序處理。HTTP處理程序?qū)φ埱筮M行一些處理,并且結(jié)果將再次經(jīng)過管道中的HTTP模塊。
請注意在http請求的處理過程中,只能調(diào)用一個HTTP處理程序,然而可以調(diào)用多個HTTP模塊
處理流程的圖式:

請不要疑惑,這里只是簡單說明了一些概念和處理流程,在隨后的內(nèi)容中我們還會詳細介紹各個概念。

Http處理程序:
什么是Http處理程序(What):
ASP.Net在處理請求的時候和其他開發(fā)語言不一樣(比如:Structs,Spring,Jsf等等),它對于MVC的實現(xiàn)有些異類,我們的ASP.Net會根據(jù)不同類型的提交文件調(diào)用不同的Http處理程序類,這些處理方法的配置在我們的machine.config中都能夠看到例如:


<httpHandlers>
<add verb="*" path="trace.axd" 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會直接把它分發(fā)給System.Web.UI.PageHandlerFactory來處理,這個工廠類會根據(jù)不同的請求需求產(chǎn)生相應的PageHandler類來處理此次請求,其它信息以次類推。
其中
verb=*表示:所有的請求都適用,如果只想處理Get和Post請求的話,那么可以這樣寫verb=”Post,Get”
Path表示處理的請求文件類型。
Type表示使用什么Http處理程序來處理
如果用戶想使用現(xiàn)在比較流行的Ajax.Net的話可以作如下配置:


<httpHandlers>
<add verb="Post,Get" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory,AjaxPro"/>
</httpHandlers>
從上面的內(nèi)容可以看出,如果使用Ajax.Net的話首先要說明它只支持Post和Get請求,只有在提交ashx這種Ajax文件的時候才作Ajax處理,處理類為
AjaxHandlerFactory創(chuàng)建出來的AjaxPro類。

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

??????? 如何自定義Http處理程序類(How):
要能夠創(chuàng)建自己的Http處理程序類必須實現(xiàn).Net的System.Web.IHttpHandler接口,任何實現(xiàn)了IHttpHandler接口的類都可以用于處理輸入的HTTP請求

HTTP處理程序?qū)崿F(xiàn)了下列方法:

方法名稱
描述

ProcessRequest
這個方法實際上是http處理程序的核心。我們調(diào)用這個方法來處理http請求。

IsReusable
我們調(diào)用這個屬性來決定http處理程序的實例是否可以用于處理相同其它類型的請求。HTTP處理程序可以返回true或false來表明它們是否可以重復使用。

可以使用web.config或者machine.config文件把這些類映射到http請求上。映射完成以后,當接收到相應請求的時候ASP.NET會實例化http處理程序。我們將解釋如何在web.config和/或machine.config文件中定義所有這些細節(jié)信息。

ASP.NET還通過IHttpHandlerFactory接口支持http處理程序的擴展。ASP.NET提供了把http請求路由到實現(xiàn)IHttpHandlerFactory接口的類的對象上的能力。此外,ASP.NET還利用了Factory設計模式。這種模式為建立一組相關(guān)對象而不提供具體類的功能提供了接口。簡單的說,你可以把用于建立依賴傳遞進來的參數(shù)建立的http處理程序?qū)ο蟮念惪醋魇莊actory(工廠)。我們不用指定需要實例化的特定的http處理程序;http處理程序工廠處理這種事務。這樣做的優(yōu)點在于如果未來實現(xiàn)IHttpHandler接口的對象的實現(xiàn)方法發(fā)生了改變,只要接口仍然相同,客戶端就不會受到影響。

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

為什么要使用Http處理模塊(Why):
??????? Http處理模塊可以減輕Http處理程序的壓力,使整個請求過程變得暢通,在任何一個模塊處理過程發(fā)生了異常都可以終止當前請求,這樣不但提高了效率而且是處理更安全
處理以上的優(yōu)點以外,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模塊來提供一些服務,例如身份驗證和授權(quán)、對話管理和輸出緩沖。由于這些模塊都注冊在machine.config文件中。

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

方法名稱 描述

Init
這個方法允許HTTP模塊向HttpApplication 對象中的事件注冊自己的事件處理程序。

Dispose
這個方法給予HTTP模塊在對象被垃圾收集之前執(zhí)行清理的機會。

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

轉(zhuǎn)自:http://hi.baidu.com/xbydy/blog/item/9456fa7e6e8419310cd7da37.html

轉(zhuǎn)載于:https://www.cnblogs.com/jiangjiancq/archive/2009/08/25/1553961.html

總結(jié)

以上是生活随笔為你收集整理的ASP.NET中处理HTTP请求的原理 (转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。