在開發基于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檔案:
<addverb="*"path="*.foo"
type="mynamespace.myhandr,hander"/>
為了讓對字尾名為.foo的檔案的請求能夠被我們的handler截獲運作,我們還需要一些額外的工作。打開iis的管理控制台,又鍵單擊站點,選擇"屬性",跳出站點的屬性對話框。選擇主目錄選項。如圖3:
圖3:web站點屬性對話框
選擇配置,彈出應用程式配置對話框,将".foo"添加到應用程式映射中,如圖4:
圖4:添加應用程式映射
好了,我們現在可以在項目中添加一個.foo檔案,當向該檔案發送請求時,浏覽器顯示:
而對其他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,
stringpathtranslated)
returnnewbasichandler();
publicvoidreleasehandler(ihttphandlerhandler){}
最後,在web.config檔案中注冊這個factory:
<httphandlers>
<addverb="post"path="*.foo"
type="mynamespace.basichandlerfactory,myassembly"/>
</httphandlers>
異步handler
通過實作ihttpasynchandler可以實作對http請求的異步處理。ihttpasynchandler接口繼承ihttphandler,也需要實作processrequest方法和isreusable屬性,同時,需要實作beginprocessrequest和endprocessrequest方法。beginprocessrequest啟動異步調用以處理單個的http請求,而endprocessrequest則在該程序結束時執行清理代碼。ihttpasynchandler的實作和注冊同ihttphandler類似,讀者可以參考msdn的相關文檔。現在,大家是否對httphandler的概念和應用有了一定的了解?在下一篇文章中,我們将主要介紹httpmodule的的應用,并給出使用httpmodule實作權限系統的執行個體。