ASPNet中自定義Http處理及其應(yīng)用_第1頁(yè)
ASPNet中自定義Http處理及其應(yīng)用_第2頁(yè)
ASPNet中自定義Http處理及其應(yīng)用_第3頁(yè)
ASPNet中自定義Http處理及其應(yīng)用_第4頁(yè)
ASPNet中自定義Http處理及其應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、ASP.Net中自定義Http處理及其應(yīng)用孫亞民一、簡(jiǎn)介在開(kāi)發(fā)基于Microsoft IIS的應(yīng)用的時(shí)候,開(kāi)發(fā)者除了可以編寫(xiě)ASP程序外,還可以使用Visual C+等開(kāi)發(fā)工具,開(kāi)發(fā)ISAPI應(yīng)用,以獲取更為強(qiáng)大的功能。可以編寫(xiě)兩種ISAPI擴(kuò)展:一種是ISAPI Server Extention,另一種是ISAPI Filter,但是,ISAPI擴(kuò)展應(yīng)用的編寫(xiě)通常對(duì)開(kāi)發(fā)者有比較高的要求,開(kāi)發(fā)和部署的難度比較大。在開(kāi)發(fā)ASP.Net應(yīng)用的時(shí)候,我們?nèi)匀豢梢跃帉?xiě)ISAPI應(yīng)用,以擴(kuò)充IIS的功能,但是,ASP.Net為我們提供了另外一種選擇使用HTTP Handler 和HTTP Module。

2、這是通過(guò)使用IHttpHandler 和 IHttpModule接口來(lái)實(shí)現(xiàn)的。HTTP Handler提供了類似于ISAPI Server Extention的功能,而HttpModule實(shí)現(xiàn)了類似于ISAPI Filter的功能,并且,比ISAPI,在開(kāi)發(fā)和部署上都要簡(jiǎn)單的多。應(yīng)用HttpHandler和HttpModule,使應(yīng)用程序可以與 IIS Web 服務(wù)器的低級(jí)別的請(qǐng)求和響應(yīng)服務(wù)交互,從而實(shí)現(xiàn)一些很有用的功能。本文首先介紹HttpHandler和HttpModule的概念和基本使用方法,然后,介紹了一個(gè)應(yīng)用HttpModule實(shí)現(xiàn)權(quán)限系統(tǒng)的案例。二、HTTP 處理管道的基本模型要對(duì)

3、HttpModule和IHttpHandler進(jìn)行研究,必須先對(duì)ASP.Net的處理管道有一個(gè)了解。在ASP.Net應(yīng)用程序中,系統(tǒng)使用一組相關(guān)的類,通過(guò)一定的順序來(lái)處理客戶端的請(qǐng)求(Request),ASP.NET應(yīng)用程序的處理模式可稱之為HTTP處理管道。HttpModule和IhttpHandler就是這個(gè)處理管道上的兩個(gè)處理環(huán)節(jié)。HTTP處理管道中的類在System.Web名稱空間中定義,主要有以下類型:l HttpWorkerRequest抽象類定義了ASP.Net頁(yè)面處理請(qǐng)求的基本方法l HttpRuntime 提供了處理應(yīng)用的一組服務(wù)l HttpContext 保存了處理一次請(qǐng)求

4、的所有相關(guān)上下文信息l HttpApplicationFactory 提供相關(guān)目錄的應(yīng)用程序l HttpApplication 定義了所有ASP.Net應(yīng)用程序的通用的方法、屬性和事件。這個(gè)類也是在用戶在global.asax文件中定義的應(yīng)用的基類。l Modules 處理請(qǐng)求前和響應(yīng)后的事件l HandlerFactories 提供應(yīng)用程序中的Handlersl Handlers 處理請(qǐng)求和響應(yīng)HTTP處理管道的模型如下:IHttpModuleIhttpHandler FactoryIHttpHandleHttpContextHttpRequestHttpResponseHttpApplic

5、ationHttpApplicationFactoryHttpRuntimeHttpApplicationModuleHandler FactoryHandler圖1:HTTP 處理管道在Windows平臺(tái)上,HTTP Pipline需要IIS的支持。為了運(yùn)行ASP.NET應(yīng)用,IIS需要以下兩個(gè)文件:ASPNET_ISAPI.DLL和ASPNET_WP.EXEl ASPNET_ISAPI.DLL是一個(gè)ISAPI Extention他將發(fā)向IIS的請(qǐng)轉(zhuǎn)交ASPNET_WP.EXE處理l ASPNET_WP.EXE使用HttpRuntime對(duì)請(qǐng)求進(jìn)行具體處理處理的過(guò)程可以用圖表示如下:ASPNE

6、T_WP.EXEinetinfo.exeaspnet_isapiHTTPNamed PipeHttpRuntime圖2:IIS上的HTTP處理管道三、HttpHandler的實(shí)現(xiàn)HttpHandler實(shí)現(xiàn)了類似于 ISAPI Extention的功能,他處理請(qǐng)求(Request)的信息和發(fā)送響應(yīng)(Response)。HttpHandler功能的實(shí)現(xiàn)通過(guò)實(shí)現(xiàn)IHttpHandler接口來(lái)達(dá)到。實(shí)際上,我們?cè)诰帉?xiě)ASP.Net頁(yè)面時(shí),ASP.Net頁(yè)面所繼承的基類也實(shí)現(xiàn)了HttpHandler接口,也是一個(gè)HttpHandler,看一下它的定義就知道了(C#):public class Page

7、: TemplateControl, IhttpHandler接口IHttpHandler的定義如下:interface IHttpHandlervoid ProcessRequest(HttpContext ctx);bool IsReuseable get; 接口中ProcessRequest是添加自己的代碼,進(jìn)行相應(yīng)處理的地方。IsReuseable屬性指明該HttpHandler的實(shí)現(xiàn)類是否需要緩存。下面的示例展示了HttpHandler的基本使用:1、建立一個(gè)名為MyNameSpace的工程,添加一個(gè)類,名稱為MyHandler,代碼如下:例1:namespace MyNameSpa

8、cepublic class MyHandler : IHttpHandlerpublic void ProcessRequest(HttpContext ctx)HttpResponse ResponseResponse.Write("This is my handler");public bool IsReusable get return true; 2、將上面的代碼編譯,生成MyNameSpace.Dll文件3、建立一個(gè)新的WebApplication項(xiàng)目,或打開(kāi)一個(gè)WebApplication項(xiàng)目,將文件MyNameSpace.Dll添加到項(xiàng)目的引用中,或復(fù)制到項(xiàng)

9、目的bin目錄下4、修改Web.Config,添加如下內(nèi)容;<configuration> <system.web><httpHndlers><add verb="*" path="*.aspx" type=" MyNameSpace.MyHandr, MyNameSpace" /> </httpHndlers></system.web></configuration>配置文件中的選項(xiàng)說(shuō)明:l verb可以是“GET”或“POST”,表示對(duì)GET或PO

10、ST的請(qǐng)求進(jìn)行處理?!?”表示對(duì)所有請(qǐng)求進(jìn)行處理。l Path指明對(duì)相應(yīng)的文件進(jìn)行處理,“*.aspx”表示對(duì)發(fā)給所有ASPX頁(yè)面的請(qǐng)求進(jìn)行處理??梢灾该髀窂剑纭?test/*.aspx”,表明只對(duì)test目錄下的ASPX文件進(jìn)行處理。l Type屬性中,逗號(hào)前的字符串指明HttpHandler的實(shí)現(xiàn)類的類名,后面的字符串指明Dll文件的名稱。現(xiàn)在,請(qǐng)求項(xiàng)目中的任何ASPX頁(yè)面,頁(yè)面上顯示的始終只有如下一行字:This is my handler因?yàn)?,我們自定義的Handler截獲了所有發(fā)向ASPX頁(yè)面的請(qǐng)求,并且用自己的的方法來(lái)處理這些請(qǐng)求了。為了使我們的ASPX頁(yè)面能夠順利運(yùn)行,我們需要

11、修改Web.Config文件:<configuration> <system.web><httpHndlers><add verb="*" path="*.foo" type=" MyNameSpace.MyHandr,hander" /> </httpHndlers></system.web></configuration>為了讓對(duì)后綴名為.foo的文件的請(qǐng)求能夠被我們的Handler截獲運(yùn)行,我們還需要一些額外的工作。打開(kāi)IIS的管理控制臺(tái),又鍵單

12、擊站點(diǎn),選擇“屬性”,跳出站點(diǎn)的屬性對(duì)話框。選擇主目錄選項(xiàng)。如圖3: 圖3:Web站點(diǎn)屬性對(duì)話框 選擇配置,彈出應(yīng)用程序配置對(duì)話框,將“.foo”添加到應(yīng)用程序映射中,如圖4:圖4:添加應(yīng)用程序映射好了,我們現(xiàn)在可以在項(xiàng)目中添加一個(gè).foo文件,當(dāng)向該文件發(fā)送請(qǐng)求時(shí),瀏覽器顯示:This is my handler而對(duì)其他ASPX文件的訪問(wèn)不受影響。四、實(shí)現(xiàn)Handler Factory實(shí)現(xiàn)HttpHandler功能的另外一個(gè)選擇是實(shí)現(xiàn)一個(gè)Handler Factory,這是通過(guò)實(shí)現(xiàn)IHttpHandlerFactory接口來(lái)實(shí)現(xiàn)的。IHttpHandlerFactory接口的定義如下:int

13、erface IHttpHandlerFactoryIHttpHandler GetHandler(HttpContext ctx,string requestType,string url,string pathTranslated);void ReleaseHandler(IHttpHandler handler);GetHandler方法在請(qǐng)求開(kāi)始的時(shí)候被調(diào)用,而ReleaseHandler在請(qǐng)求結(jié)束,所有的Handler都不再需要的時(shí)候被調(diào)用使用HttpHandlerFactory的過(guò)程一般如下:首先定義實(shí)際處理HttpHandler的類,這個(gè)類會(huì)在HandlerFactory中被調(diào)用

14、以進(jìn)行實(shí)際的處理:public class BasicHandler : IHttpHandler . 然后,定義自己的HandlerFactory:public class BasicHandlerFactory : IHttpHandlerFactorypublic IHttpHandler GetHandler(HttpContext ctx,string requestType,string url,string pathTranslated)return new BasicHandler();public void ReleaseHandler(IHttpHandler handle

15、r) 最后,在Web.Config文件中注冊(cè)這個(gè)Factory:<configuration><system.web><httpHandlers><add verb="POST" path="*.foo"type="MyNamespace.BasicHandlerFactory, MyAssembly" /></httpHandlers></system.web></configuration>五、異步Handler通過(guò)實(shí)現(xiàn)IHttpAsyncHand

16、ler可以實(shí)現(xiàn)對(duì)HTTP請(qǐng)求的異步處理。IHttpAsyncHandler接口繼承IHttpHandler,也需要實(shí)現(xiàn)ProcessRequest 方法和 IsReusable 屬性,同時(shí),需要實(shí)現(xiàn) BeginProcessRequest 和 EndProcessRequest 方法。BeginProcessRequest 啟動(dòng)異步調(diào)用以處理單個(gè)的 HTTP 請(qǐng)求,而 EndProcessRequest 則在該進(jìn)程結(jié)束時(shí)執(zhí)行清理代碼。IHttpAsyncHandler的實(shí)現(xiàn)和注冊(cè)同IHttpHandler類似,讀者可以參考MSDN的相關(guān)文檔。六、HttpModule的實(shí)現(xiàn)HttpModules

17、實(shí)現(xiàn)了類似于ISAPI Filter的功能,在開(kāi)發(fā)上,通常需要經(jīng)過(guò)以下步驟:1. 編寫(xiě)一個(gè)類,實(shí)現(xiàn)IhttpModule接口2. 實(shí)現(xiàn)Init 方法,并且注冊(cè)需要的方法3. 實(shí)現(xiàn)注冊(cè)的方法 4. 實(shí)現(xiàn)Dispose方法,如果需要手工為類做一些清除工作,可以添加Dispose方法的實(shí)現(xiàn),但這不是必需的,通??梢圆粸镈ispose方法添加任何代碼。5. 在Web.config文件中,注冊(cè)您編寫(xiě)的類 下面是一個(gè)HttpModules的示例,在這個(gè)示例中,只是簡(jiǎn)單的注冊(cè)了HttpApplication 的BeginRequest 和 EndRequest事件,并且通過(guò)這些事件的實(shí)現(xiàn)方法,將相關(guān)的信息打

18、印出來(lái)。例 1using System;using System.Web; namespace MyModulepublic class MyModule : IHttpModule public void Init(HttpApplication application) application.BeginRequest += (new EventHandler(this.Application_BeginRequest);application.EndRequest += (new EventHandler(this.Application_EndRequest); private voi

19、d Application_BeginRequest(Object source, EventArgs e) HttpApplication Application = (HttpApplication)source; HttpResponse Response=Application.Context.Response;Response.Write("<h1>Beginning of Request</h1><hr>"); private void Application_EndRequest(Object source, EventAr

20、gs e) HttpApplication application = (HttpApplication)source;HttpResponse Response=Application.Context.Response;Response.Write("<h1>End of Request</h1><hr>"); public void Dispose() 程序的開(kāi)始引用了如下名稱空間:using System;using System.Web;因?yàn)镠ttpApplication 、HttpContext、HttpResponse等類在S

21、ystem.Web中定義,因此,System.Web名稱空間是必須引用的。MyModule類實(shí)現(xiàn)了IhttpModule接口。在Init方法中,指明了實(shí)現(xiàn)BeginRequest 和EndRequest 事件的方法。在這兩個(gè)方法中,只是簡(jiǎn)單的分別打印了一些信息。下面,在Web.config文件中注冊(cè)這個(gè)類,就可以使用這個(gè)HttpModule了,注冊(cè)的方法如下:<configuration> <system.web> <httpModules> <add name=" MyModule " type=" MyModule,

22、MyModule" /> </httpModules> </system.web></configuration>現(xiàn)在來(lái)看一下效果。編寫(xiě)一個(gè)Aspx頁(yè)面test.aspx,內(nèi)容如下:<%Response.Write("<h1>This is the Page</h1><hr>");%>運(yùn)行以后的界面如圖所示:圖1七、深入研究HttpModuleHttpModule通過(guò)對(duì)HttpApplication對(duì)象的一系列事件的處理來(lái)對(duì)HTTP處理管道施加影響,這些事件在HttpModu

23、le的Init方法中進(jìn)行注冊(cè),包括:BeginRequestAuthenticateRequestAuthorizeRequestResolveRequestCacheAcquireRequestStatePreRequestHandlerExecutePostRequestHandlerExecuteReleaseRequestStateUpdateRequestCacheEndRequest其中部分事件同Global.asax中的事件相對(duì)應(yīng),對(duì)應(yīng)關(guān)系如下:HttpModuleGlobal.asaxBeginRequestApplication_BeginRequestAuthenticat

24、eRequestApplication_AuthenticateRequestEndRequestApplication_EndRequest圖3在例1中,處理了BeginRequest和EndRequest事件,其他事件的處理方式基本上類似。同HttpHandler對(duì)應(yīng)來(lái)看,這些事件,有些在HttpHandler之前發(fā)生,有些在HttpHandler處理完后發(fā)生。了解事件發(fā)生的順序非常重要,因?yàn)?,服?wù)器端的對(duì)象在不同的時(shí)間段有著不同的表現(xiàn)。例子之一是Session的使用。不是所有的事件中都能對(duì)Session進(jìn)行處理,而只能在有限的幾個(gè)事件中進(jìn)行處理。詳細(xì)的過(guò)程可以參考下面的HTTP Requ

25、est處理生命周期圖。HttpRequest開(kāi)始HttpModuleHttpModule.AcquireRequestStateHttpModule.PreSendRequestContent建立HttpHandler控制點(diǎn)HttpHandler.ProcessRequestHttpHandlerHttpModule.BeginRequestHttpModule.AuthorizeRequest將處理的數(shù)據(jù)返回客戶端,處理結(jié)束HttpModule.PostRequestHandlerExecuteHttpModule.ResolveRequestCacheHttpModule.PreReque

26、stHandlerExecuteHttpModule.PreSendRequestHeadersHttpModule.EndRequestHttpModule.UpdateRequestCacheHttpModule.ReleaseRequestState進(jìn)入HttpModule首次截獲HttpRequest初始化HttpHandlerHttpModule繼續(xù)處理。HttpHandler已經(jīng)建立,此后Session可用進(jìn)入HttpHandler處理HttpRequest返回HttpModule,HttpHandler結(jié)束,Session失效八、使用HttpModule實(shí)現(xiàn)權(quán)限系統(tǒng)我們?cè)陂_(kāi)發(fā)應(yīng)用

27、系統(tǒng)的時(shí)候,應(yīng)用系統(tǒng)的權(quán)限控制是非常重要的一個(gè)部分。在ASP中,要實(shí)現(xiàn)權(quán)限的控制是比較麻煩的事情,因?yàn)槲覀儽仨氃诿總€(gè)需要控制權(quán)限的ASP頁(yè)面中添加權(quán)限控制代碼,從而控制客戶對(duì)頁(yè)面的訪問(wèn)。這樣帶來(lái)的問(wèn)題,除了編寫(xiě)大量重復(fù)代碼外,由于權(quán)限控制部分同業(yè)務(wù)處理部分的模塊緊密耦合在一起,對(duì)權(quán)限控制模塊的修改,往往又會(huì)帶來(lái)大量的修改工作,甚至造成大量的Bug。所以,我們現(xiàn)在需要將權(quán)限控制和業(yè)務(wù)處理模塊進(jìn)行解耦,使得兩個(gè)部分可以獨(dú)立開(kāi)發(fā)和修改,而不會(huì)互相影響,或者,將影響減到最低。在Jsp程序中,這個(gè)目的可以通過(guò)引入一個(gè)前端控制器來(lái)實(shí)現(xiàn)權(quán)限過(guò)濾(關(guān)于前端控制器模式,可以參見(jiàn)J2EE核心模式一書(shū))。在ASP.Net中,我們可以利用HttpModule實(shí)現(xiàn)同樣的效果。下面來(lái)看一下實(shí)現(xiàn)的過(guò)程。首先,我們會(huì)構(gòu)建一個(gè)權(quán)限處理系統(tǒng),可以檢測(cè)某個(gè)用戶對(duì)某個(gè)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論