要對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名稱空間中定義,主要有以下類型: ·        圖1:http 處理管道       圖2:iis上的http處理管道   接口ihttphandler的定義如下:    接口中processrequest是添加自己的代碼,進(jìn)行相應(yīng)處理的地方。isreuseable屬性指明該httphandler的實現(xiàn)類是否需要緩存。 下面的示例展示了httphandler的基本使用: 1、建立一個名為mynamespace的工程,添加一個類,名稱為myhandler,代碼如下:    2、將上面的代碼編譯,生成mynamespace.dll文件; 3、建立一個新的webapplication項目,或打開一個webapplication項目,將文件mynamespace.dll添加到項目的引用中,或復(fù)制到項目的bin目錄下; 4、修改web.config,添加如下內(nèi)容:    配置文件中的選項說明: · verb可以是"get"或"post",表示對get或post的請求進(jìn)行處理。"*"表示對所有請求進(jìn)行處理。 · path指明對相應(yīng)的文件進(jìn)行處理,"*.aspx"表示對發(fā)給所有aspx頁面的請求進(jìn)行處理。可以指明路徑,如"/test/*.aspx",表明只對test目錄下的aspx文件進(jìn)行處理。 · type屬性中,逗號前的字符串指明httphandler的實現(xiàn)類的類名,后面的字符串指明dll文件的名稱。 現(xiàn)在,請求項目中的任何aspx頁面,頁面上顯示的始終只有如下一行字:      圖3:web站點屬性對話框     圖4:添加應(yīng)用程序映射
  在開發(fā)基于microsoft iis的應(yīng)用時,開發(fā)者除了可以編寫asp程序外,還可以使用visual c++等開發(fā)工具,開發(fā)isapi應(yīng)用,以獲取更為強(qiáng)大的功能。可以編寫兩種isapi擴(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。這是通過使用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ù)交互。本文首先介紹httphandler和httpmodule的概念和基本使用方法,并介紹了一個應(yīng)用httpmodule實現(xiàn)權(quán)限系統(tǒng)的案例。 
http 處理管道的基本模型
 
httpworkerrequest 抽象類定義了asp.net頁面處理請求的基本方法; · httpruntime 提供了處理應(yīng)用的一組服務(wù); · httpcontext 保存了處理一次請求的所有相關(guān)上下文信息; · httpapplicationfactory 提供相關(guān)目錄的應(yīng)用程序; · httpapplication 定義了所有asp.net應(yīng)用程序的通用的方法、屬性和事件。這個類也是在用戶在global.asax文件中定義的應(yīng)用的基類; · modules 處理請求前和響應(yīng)后的事件; · handlerfactories 提供應(yīng)用程序中的handlers; · handlers 處理請求和響應(yīng)。 http處理管道的模型如下: 
 
  在windows平臺上,http pipline需要iis的支持。為了運行asp.net應(yīng)用,iis需要以下兩個文件:aspnet_isapi.dll和aspnet_wp.exe · aspnet_isapi.dll是一個isapi extention他將發(fā)向iis的請轉(zhuǎn)交aspnet_wp.exe處理 · aspnet_wp.exe使用httpruntime對請求進(jìn)行具體處理 處理的過程可以用圖表示如下: 
 
 
 httphandler的實現(xiàn)
  httphandler實現(xiàn)了類似于isapi extention的功能,他處理請求(request)的信息和發(fā)送響應(yīng)(response)。httphandler功能的實現(xiàn)通過實現(xiàn)ihttphandler接口來達(dá)到。實際上,我們在編寫asp.net頁面時,asp.net頁面所繼承的基類——system.web.ui.page——也實現(xiàn)了httphandler接口,也是一個httphandler,看一下它的定義就知道了(c#): 
public class page : templatecontrol, ihttphandler
 
interface ihttphandler
{
void processrequest(httpcontext ctx);
bool isreuseable { get; }
}
 
例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; } 
}
}
}
 
<configuration>    
   <system.web>
   <httphndlers>
<add verb="*" path="*.aspx" 
type=" mynamespace.myhandr, mynamespace" /> 
      </httphndlers>
</system.web>
</configuration>
 
this is my handler
 
  因為,我們自定義的handler截獲了所有發(fā)向aspx頁面的請求,并且用自己的的方法來處理這些請求了。 為了使我們的aspx頁面能夠順利運行,我們需要修改web.config文件: 
<configuration>    
    <system.web>
   <httphndlers>
<add verb="*" path="*.foo" 
type=" mynamespace.myhandr,hander" /> 
      </httphndlers>
</system.web>
</configuration>
 
  為了讓對后綴名為.foo的文件的請求能夠被我們的handler截獲運行,我們還需要一些額外的工作。打開iis的管理控制臺,又鍵單擊站點,選擇"屬性",跳出站點的屬性對話框。選擇主目錄選項。如圖3: 
 
  選擇配置,彈出應(yīng)用程序配置對話框,將".foo"添加到應(yīng)用程序映射中,如圖4: 
 
好了,我們現(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接口的定義如下: 
interface ihttphandlerfactory
{
ihttphandler gethandler(httpcontext ctx,
string requesttype,
string url,
string pathtranslated);
void releasehandler(ihttphandler handler);
}
 
g  ethandler方法在請求開始的時候被調(diào)用,而releasehandler在請求結(jié)束,所有的handler都不再需要的時候被調(diào)用。 使用httphandlerfactory的過程一般如下: 首先定義實際處理httphandler的類,這個類會在handlerfactory中被調(diào)用以進(jìn)行實際的處理: 
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文件中注冊這個factory: 
<configuration>
<system.web>
<httphandlers>
<add verb="post" path="*.foo"
type="mynamespace.basichandlerfactory, myassembly" />
</httphandlers>
</system.web>
</configuration>
 
 
 異步handler
  通過實現(xiàn)ihttpasynchandler可以實現(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)文檔。 現(xiàn)在,大家是否對http handler的概念和應(yīng)用有了一定的了解?在下一篇文章中,我們將主要介紹http module的的應(yīng)用,并給出使用httpmodule實現(xiàn)權(quán)限系統(tǒng)的實例。
 
新聞熱點
疑難解答
圖片精選