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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

7、: TemplateControl, IhttpHandler接口IHttpHandler的定義如下:interface IHttpHandlervoid ProcessRequest(HttpContext ctx);bool IsReuseable get; 接口中ProcessRequest是添加自己的代碼,進(jìn)行相應(yīng)處理的地方。IsReuseable屬性指明該HttpHandler的實現(xiàn)類是否需要緩存。下面的示例展示了HttpHandler的基本使用:1、建立一個名為MyNameSpace的工程,添加一個類,名稱為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、建立一個新的WebApplication項目,或打開一個WebApplication項目,將文件MyNameSpace.Dll添加到項目的引用中,或復(fù)制到項

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

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

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

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

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

14、以進(jìn)行實際的處理: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文件中注冊這個Factory:<configuration><system.web><httpHandlers><add verb="POST" path="*.foo"type="MyNamespace.BasicHandlerFactory, MyAssembly" /></httpHandlers></system.web></configuration>五、異步Handler通過實現(xiàn)IHttpAsyncHand

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

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

18、印出來。例 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() 程序的開始引用了如下名稱空間:using System;using System.Web;因為HttpApplication 、HttpContext、HttpResponse等類在S

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

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

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

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

25、est處理生命周期圖。HttpRequest開始HttpModuleHttpModule.AcquireRequestStateHttpModule.PreSendRequestContent建立HttpHandler控制點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實現(xiàn)權(quán)限系統(tǒng)我們在開發(fā)應(yīng)用

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

溫馨提示

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

最新文檔

評論

0/150

提交評論