明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

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

[摘要]在開(kāi)發(fā)基于Microsoft IIS的應(yīng)用時(shí),開(kāi)發(fā)者除了可以編寫ASP程序外,還可以使用Visual C++等開(kāi)發(fā)工具,開(kāi)發(fā)ISAPI應(yīng)用,以獲取更為強(qiáng)大的功能。可以編寫兩種ISAPI擴(kuò)展:一種是ISAPI Server Extention,另一種是ISAPI Filter,但是,ISAPI擴(kuò)展應(yīng)...

在開(kāi)發(fā)基于Microsoft IIS的應(yīng)用時(shí),開(kāi)發(fā)者除了可以編寫ASP程序外,還可以使用Visual C++等開(kāi)發(fā)工具,開(kāi)發(fā)ISAPI應(yīng)用,以獲取更為強(qiáng)大的功能?梢跃帉憙煞NISAPI擴(kuò)展:一種是ISAPI Server Extention,另一種是ISAPI Filter,但是,ISAPI擴(kuò)展應(yīng)用的編寫通常對(duì)開(kāi)發(fā)者有比較高的要求,開(kāi)發(fā)和部署的難度比較大。 在開(kāi)發(fā)ASP.Net應(yīng)用時(shí),我們?nèi)匀豢梢跃帉慖SAPI應(yīng)用,以擴(kuò)充IIS的功能,但是,ASP.Net為我們提供了另外一種選擇——使用HTTP Handler 和HTTP Module。這是通過(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ù)交互。本文首先介紹HttpHandler和HttpModule的概念和基本使用方法,并介紹了一個(gè)應(yīng)用HttpModule實(shí)現(xiàn)權(quán)限系統(tǒng)的案例。
HTTP 處理管道的基本模型
要對(duì)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名稱空間中定義,主要有以下類型: · HttpWorkerRequest 抽象類定義了ASP.Net頁(yè)面處理請(qǐng)求的基本方法; · HttpRuntime 提供了處理應(yīng)用的一組服務(wù); · HttpContext 保存了處理一次請(qǐng)求的所有相關(guān)上下文信息; · HttpApplicationFactory 提供相關(guān)目錄的應(yīng)用程序; · HttpApplication 定義了所有ASP.Net應(yīng)用程序的通用的方法、屬性和事件。這個(gè)類也是在用戶在global.asax文件中定義的應(yīng)用的基類; · Modules 處理請(qǐng)求前和響應(yīng)后的事件; · HandlerFactories 提供應(yīng)用程序中的Handlers; · Handlers 處理請(qǐng)求和響應(yīng)。 HTTP處理管道的模型如下:

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

圖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è)诰帉慉SP.Net頁(yè)面時(shí),ASP.Net頁(yè)面所繼承的基類——System.Web.UI.Page——也實(shí)現(xiàn)了HttpHandler接口,也是一個(gè)HttpHandler,看一下它的定義就知道了(C#):
public class Page : TemplateControl, IhttpHandler
 

接口IHttpHandler的定義如下:
interface IHttpHandler
{
void ProcessRequest(HttpContext ctx);
bool IsReuseable { get; }
}
 

接口中ProcessRequest是添加自己的代碼,進(jìn)行相應(yīng)處理的地方。IsReuseable屬性指明該HttpHandler的實(shí)現(xiàn)類是否需要緩存。 下面的示例展示了HttpHandler的基本使用: 1、建立一個(gè)名為MyNameSpace的工程,添加一個(gè)類,名稱為MyHandler,代碼如下:
例1:
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; }
}
}
}
 

2、將上面的代碼編譯,生成MyNameSpace.Dll文件; 3、建立一個(gè)新的WebApplication項(xiàng)目,或打開(kāi)一個(gè)WebApplication項(xiàng)目,將文件MyNameSpace.Dll添加到項(xiàng)目的引用中,或復(fù)制到項(xiàng)目的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ō)明: · verb可以是"GET"或"POST",表示對(duì)GET或POST的請(qǐng)求進(jìn)行處理。"*"表示對(duì)所有請(qǐng)求進(jìn)行處理。 · Path指明對(duì)相應(yīng)的文件進(jìn)行處理,"*.aspx"表示對(duì)發(fā)給所有ASPX頁(yè)面的請(qǐng)求進(jìn)行處理?梢灾该髀窂,如"/test/*.aspx",表明只對(duì)test目錄下的ASPX文件進(jìn)行處理。 · Type屬性中,逗號(hào)前的字符串指明HttpHandler的實(shí)現(xiàn)類的類名,后面的字符串指明Dll文件的名稱。 現(xiàn)在,請(qǐng)求項(xiàng)目中的任何ASPX頁(yè)面,頁(yè)面上顯示的始終只有如下一行字:
This is my handler
 


因?yàn)椋覀冏远x的Handler截獲了所有發(fā)向ASPX頁(yè)面的請(qǐng)求,并且用自己的的方法來(lái)處理這些請(qǐng)求了。 為了使我們的ASPX頁(yè)面能夠順利運(yùn)行,我們需要修改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),又鍵單擊站點(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接口的定義如下:
interface IHttpHandlerFactory
{
IHttpHandler 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)用以進(jìn)行實(shí)際的處理:
public class BasicHandler : IHttpHandler { ... }
 


然后,定義自己的HandlerFactory:
public class BasicHandlerFactory : IHttpHandlerFactory
{
public IHttpHandler GetHandler(HttpContext ctx,
string requestType,
string url,
string pathTranslated)
{
return new BasicHandler();
}
public void ReleaseHandler(IHttpHandler handler) {}
}
 


最后,在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)IHttpAsyncHandler可以實(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)文檔。 現(xiàn)在,大家是否對(duì)HTTP Handler的概念和應(yīng)用有了一定的了解?在下一篇文章中,我們將主要介紹HTTP Module的的應(yīng)用,并給出使用HttpModule實(shí)現(xiàn)權(quán)限系統(tǒng)的實(shí)例。