天天看點

ASP.Net HttpHandler (轉)ASP.Net中自定義Http處理及應用之HttpHandler篇

在開發基于Microsoft IIS的應用時,開發者除了可以編寫ASP程式外,還可以使用Visual C++等開發工具,開發ISAPI應用,以擷取更為強大的功能。可以編寫兩種ISAPI擴充:一種是ISAPI Server Extention,另一種是ISAPI Filter,但是,ISAPI擴充應用的編寫通常對開發者有比較高的要求,開發和部署的難度比較大。 在開發ASP.Net應用時,我們仍然可以編寫ISAPI應用,以擴充IIS的功能,但是,ASP.Net為我們提供了另外一種選擇——使用HTTP Handler 和HTTP Module。這是通過使用IHttpHandler 和 IHttpModule接口來實作的。HTTP Handler提供了類似于ISAPI Server Extention的功能,而HttpModule實作了類似于ISAPI Filter的功能,并且,比ISAPI,在開發和部署上都要簡單的多。 應用HttpHandler和HttpModule,使應用程式可以與IIS Web伺服器的低級别請求和響應服務互動。本文首先介紹HttpHandler和HttpModule的概念和基本使用方法,并介紹了一個應用HttpModule實作權限系統的案例。

HTTP 處理管道的基本模型

要對HttpModule和IHttpHandler進行研究,必須先對ASP.Net的處理管道有一個了解。 在ASP.Net應用程式中,系統使用一組相關的類,通過一定的順序來處理用戶端的請求(Request),ASP.NET應用程式的處理模式可稱之為HTTP處理管道。HttpModule和IhttpHandler就是這個處理管道上的兩個處理環節。 HTTP處理管道中的類在System.Web名稱空間中定義,主要有以下類型: · HttpWorkerRequest 抽象類定義了ASP.Net頁面處理請求的基本方法; · HttpRuntime 提供了處理應用的一組服務; · HttpContext 儲存了處理一次請求的所有相關上下文資訊; · HttpApplicationFactory 提供相關目錄的應用程式; · HttpApplication 定義了所有ASP.Net應用程式的通用的方法、屬性和事件。這個類也是在使用者在global.asax檔案中定義的應用的基類; · Modules 處理請求前和響應後的事件; · HandlerFactories 提供應用程式中的Handlers; · Handlers 處理請求和響應。 HTTP處理管道的模型如下:

ASP.Net HttpHandler (轉)ASP.Net中自定義Http處理及應用之HttpHandler篇

圖1:HTTP 處理管道

在Windows平台上,HTTP Pipline需要IIS的支援。為了運作ASP.NET應用,IIS需要以下兩個檔案:ASPNET_ISAPI.DLL和ASPNET_WP.EXE · ASPNET_ISAPI.DLL是一個ISAPI Extention他将發向IIS的請轉交ASPNET_WP.EXE處理 · ASPNET_WP.EXE使用HttpRuntime對請求進行具體處理 處理的過程可以用圖表示如下:

ASP.Net HttpHandler (轉)ASP.Net中自定義Http處理及應用之HttpHandler篇

圖2:IIS上的HTTP處理管道

HttpHandler的實作

HttpHandler實作了類似于ISAPI Extention的功能,他處理請求(Request)的資訊和發送響應(Response)。HttpHandler功能的實作通過實作IHttpHandler接口來達到。實際上,我們在編寫ASP.Net頁面時,ASP.Net頁面所繼承的基類——System.Web.UI.Page——也實作了HttpHandler接口,也是一個HttpHandler,看一下它的定義就知道了(C#):

public class Page : TemplateControl, IhttpHandler

接口IHttpHandler的定義如下:

<code>interface IHttpHandler { void ProcessRequest(HttpContext ctx); bool IsReuseable { get; } }</code>接口中ProcessRequest是添加自己的代碼,進行相應處理的地方。IsReuseable屬性指明該HttpHandler的實作類是否需要緩存。 下面的示例展示了HttpHandler的基本使用: 1、建立一個名為MyNameSpace的工程,添加一個類,名稱為MyHandler,代碼如下:

例1:

<code>namespace MyNameSpace { public class MyHandler : IHttpHandler { public void ProcessRequest(HttpContext ctx) { HttpResponse Response Response.Write("This is my handler");} public bool IsReusable { get { return true; } } } }</code>

2、将上面的代碼編譯,生成MyNameSpace.Dll檔案; 3、建立一個新的WebApplication項目,或打開一個WebApplication項目,将檔案MyNameSpace.Dll添加到項目的引用中,或複制到項目的bin目錄下; 4、修改Web.Config,添加如下内容:

<code><configuration&gt; <system.web&gt; <httpHndlers&gt; <add verb="*" path="*.aspx" type=" MyNameSpace.MyHandr, MyNameSpace" /&gt; </httpHndlers&gt; </system.web&gt; </configuration&gt;</code>

配置檔案中的選項說明: · verb可以是"GET"或"POST",表示對GET或POST的請求進行處理。"*"表示對所有請求進行處理。 · Path指明對相應的檔案進行處理,"*.aspx"表示對發給所有ASPX頁面的請求進行處理。可以指明路徑,如"/test/*.aspx",表明隻對test目錄下的ASPX檔案進行處理。 · Type屬性中,逗号前的字元串指明HttpHandler的實作類的類名,後面的字元串指明Dll檔案的名稱。 現在,請求項目中的任何ASPX頁面,頁面上顯示的始終隻有如下一行字:

This is my handler

因為,我們自定義的Handler截獲了所有發向ASPX頁面的請求,并且用自己的的方法來處理這些請求了。 為了使我們的ASPX頁面能夠順利運作,我們需要修改Web.Config檔案:

<code><configuration&gt; <system.web&gt; <httpHndlers&gt; <add verb="*" path="*.foo" type=" MyNameSpace.MyHandr,hander" /&gt; </httpHndlers&gt; </system.web&gt; </configuration&gt;</code>

為了讓對字尾名為.foo的檔案的請求能夠被我們的Handler截獲運作,我們還需要一些額外的工作。打開IIS的管理控制台,又鍵單擊站點,選擇"屬性",跳出站點的屬性對話框。選擇主目錄選項。如圖3:

ASP.Net HttpHandler (轉)ASP.Net中自定義Http處理及應用之HttpHandler篇

圖3:Web站點屬性對話框

選擇配置,彈出應用程式配置對話框,将".foo"添加到應用程式映射中,如圖4:

ASP.Net HttpHandler (轉)ASP.Net中自定義Http處理及應用之HttpHandler篇

圖4:添加應用程式映射

好了,我們現在可以在項目中添加一個.foo檔案,當向該檔案發送請求時,浏覽器顯示:

而對其他ASPX檔案的通路不受影響。

實作Handler Factory

實作HttpHandler功能的另外一個選擇是實作一個Handler Factory,這是通過實作IHttpHandlerFactory接口來實作的。 IHttpHandlerFactory接口的定義如下:

<code>interface IHttpHandlerFactory { IHttpHandler GetHandler(HttpContext ctx, string requestType, string url, string pathTranslated); void ReleaseHandler(IHttpHandler handler); }</code>

GetHandler方法在請求開始的時候被調用,而ReleaseHandler在請求結束,所有的Handler都不再需要的時候被調用。 使用HttpHandlerFactory的過程一般如下: 首先定義實際處理HttpHandler的類,這個類會在HandlerFactory中被調用以進行實際的處理:

<code>public class BasicHandler : IHttpHandler { ... }</code>

然後,定義自己的HandlerFactory:

<code>public class BasicHandlerFactory : IHttpHandlerFactory { public IHttpHandler GetHandler(HttpContext ctx, string requestType, string url, string pathTranslated) { return new BasicHandler(); } public void ReleaseHandler(IHttpHandler handler) {} }</code>

最後,在Web.Config檔案中注冊這個Factory:

<code><configuration&gt; <system.web&gt; <httpHandlers&gt; <add verb="POST" path="*.foo" type="MyNamespace.BasicHandlerFactory, MyAssembly" /&gt; </httpHandlers&gt; </system.web&gt; </configuration&gt;</code>異步Handler

通過實作IHttpAsyncHandler可以實作對HTTP請求的異步處理。IHttpAsyncHandler接口繼承IHttpHandler,也需要實作ProcessRequest 方法和 IsReusable 屬性,同時,需要實作 BeginProcessRequest 和 EndProcessRequest 方法。BeginProcessRequest 啟動異步調用以處理單個的 HTTP 請求,而 EndProcessRequest 則在該程序結束時執行清理代碼。 IHttpAsyncHandler的實作和注冊同IHttpHandler類似,讀者可以參考MSDN的相關文檔。 現在,大家是否對HTTP Handler的概念和應用有了一定的了解?在下一篇文章中,我們将主要介紹HTTP Module的的應用,并給出使用HttpModule實作權限系統的執行個體。  

部落格園大道至簡

<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>

轉載請注明:部落格園

繼續閱讀