閱讀997 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

在開發基於MicrosoftIIS的應用時,開發者除了可以編寫ASP程序外,還可以使用VisualC++等開發工具,開發ISAPI應用,以獲取更為強大的功能。可以編寫兩種ISAPI擴展:一種是ISAPIServerExtention,另一種是ISAPIFilter,但是,ISAPI擴展應用的編寫通常對開發者有比較高的要求,開發和部署的難度比較大。在開發ASP.Net應用時,我們仍然可以編寫ISAPI應用,以擴充IIS的功能,但是,ASP.Net為我們提供了另外一種選擇——使用HTTPHandler和HTTPModule。這是通過使用IHttpHandler和IHttpModule接口來實現的。HTTPHandler提供了類似於ISAPIServerExtention的功能,而HttpModule實現了類似於ISAPIFilter的功能,並且,比ISAPI,在開發和部署上都要簡單的多。應用HttpHandler和HttpModule,使應用程序可以與IISWeb服務器的低級別請求和響應服務交互。本文首先介紹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處理管道的模型如下:


圖1:HTTP處理管道

在Windows平台上,HTTPPipline需要IIS的支持。為了運行ASP.NET應用,IIS需要以下兩個文件:ASPNET_ISAPI.DLL和ASPNET_WP.EXE·ASPNET_ISAPI.DLL是一個ISAPIExtention他將發向IIS的請轉交ASPNET_WP.EXE處理·ASPNET_WP.EXE使用HttpRuntime對請求進行具體處理處理的過程可以用圖表示如下:


圖2:IIS上的HTTP處理管道

HttpHandler的實現

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

接口IHttpHandler的定義如下:



interfaceIHttpHandler
{
voidProcessRequest(HttpContextctx);
boolIsReuseable{get;}
}


接口中ProcessRequest是添加自己的代碼,進行相應處理的地方。IsReuseable屬性指明該HttpHandler的實現類是否需要緩存。下麵的示例展示了HttpHandler的基本使用:1、建立一個名為MyNameSpace的工程,添加一個類,名稱為MyHandler,代碼如下:

例1:


namespaceMyNameSpace
{
publicclassMyHandler:IHttpHandler
{
publicvoidProcessRequest(HttpContextctx)
{
HttpResponseResponse
Response.Write("Thisismyhandler");}
publicboolIsReusable
{
get{returntrue;}
}
}
}

2、將上麵的代碼編譯,生成MyNameSpace.Dll文件;3、建立一個新的WebApplication項目,或打開一個WebApplication項目,將文件MyNameSpace.Dll添加到項目的引用中,或複製到項目的bin目錄下;4、修改Web.Config,添加如下內容:


<configuration>
<system.web>
<httpHndlers>
<addverb="*"path="*.aspx"
type="MyNameSpace.MyHandr,MyNameSpace"/>
</httpHndlers>
</system.web>
</configuration>

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


Thisismyhandler

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


<configuration>
<system.web>
<httpHndlers>
<addverb="*"path="*.foo"
type="MyNameSpace.MyHandr,hander"/>
</httpHndlers>
</system.web>
</configuration>

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

 
圖3:Web站點屬性對話框
選擇配置,彈出應用程序配置對話框,將".foo"添加到應用程序映射中,如圖4:

 
圖4:添加應用程序映射
好了,我們現在可以在項目中添加一個.foo文件,當向該文件發送請求時,瀏覽器顯示:


Thisismyhandler


而對其他ASPX文件的訪問不受影響。

實現HandlerFactory

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


interfaceIHttpHandlerFactory
{
IHttpHandlerGetHandler(HttpContextctx,
stringrequestType,
stringurl,
stringpathTranslated);
voidReleaseHandler(IHttpHandlerhandler);
}

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


publicclassBasicHandler:IHttpHandler{...}

然後,定義自己的HandlerFactory:


publicclassBasicHandlerFactory:IHttpHandlerFactory
{
publicIHttpHandlerGetHandler(HttpContextctx,
stringrequestType,
stringurl,
stringpathTranslated)
{
returnnewBasicHandler();
}
publicvoidReleaseHandler(IHttpHandlerhandler){}
}

最後,在Web.Config文件中注冊這個Factory:


<configuration>
<system.web>
<httpHandlers>
<addverb="POST"path="*.foo"
type="MyNamespace.BasicHandlerFactory,MyAssembly"/>
</httpHandlers>
</system.web>
</configuration>

異步Handler

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

最後更新:2017-04-02 00:06:32

  上一篇:go .net打包自動安裝數據庫
  下一篇:go ssi