HttpModule與HttpHandler的區別整理

原本我們在舊版的作業系統上(如XP,Server2003)要讓每個使用者訪問網頁時先進行驗證,判斷是否由外部連結或者是種種的驗證可以直接使用ISAPI來進行(使用C撰寫),但是近年來作業系統的版本已經到了Server2008+,IIS的版本也由原本的IIS6變成了IIS7,因此有些主機在ISAPI的運行變得異常或者是不能執行(但這個問題經過證實是64位元作業系統的問題,變更IIS設定就可以解決這個問題),因此在資料過濾的部份我們除了可以使用ISAPI可以幫我們進行資料過濾,也可運用微軟提供的HttpModule與HttpHandler來處理相同的問題,下面就對者兩者的差異進行說明。

執行順序的部分
當Client端發送頁面請求時,IIS會根據請求頁的類型調用對應的處理程序( .asp --> asp.dll ; .aspx --> aspnet_isapi.dll),而處理程序在處理的過程中則必須要經過HttpModule與HttpHandler的處理,HttpModule負責處理進入頁面前與後的事件,如下圖所示,而HttpHandler則負責頁面的處理。


使用時機
由下圖兩個介面的執行順序可以看出需要執行什麼樣的功能就必須將所需的程式寫在哪個部分,以權限管理的功能來看的話,我們在開始Client發出Http Request的時候就必須要判斷使用者是否有瀏覽的權限,因此我們在HttpModule的部分就先進行判斷,如果沒有權限的話就直接將畫面導到特定頁面,就不需要執行HttpHandler了(在這個例子當中並無使用到Session)。

HttpModule: Web.Config配置如 由上面的設定可以看出並無特定說明哪個檔案適用,因此所有的檔案在Client提出請求的時候後都會通過HttpModule。

HttpHandler: Web.Config配置如,由上面Path可以看出個端倪,如果我們要對的定檔案進行授權的過濾的話可以上用HttpHandler,如要對所有的Gif圖檔進行過濾的話就在Path處改成【*.gif】,上面的例子【*.*】代表所有檔案都要進行過濾,這樣的寫法就要另外處理【*.aspx】的檔案


其他說明 以上說明是針對IIS7的說明,在IIS7的環境下只需在HttpModule寫好判斷邏輯並在Web.Config寫好上面的語法就可以正常執行不需在做額外的設定,但是在IIS6的環境下HttpModule只會處理【*.aspx】的檔案類型,對於其他類型的檔案置之不理,因此必須做額外的設定才可以正常的執行,詳細說明請參考http://www.blogger.com/forums.iis.net/t/1150329.aspx,但經過這樣的設定之後,可能是【*.asp】檔套用aspnet.dll的關係變成了強型別的語法,在Response.Write "字串" 這個部分(必須為【Response.Write ("字串")】,或者沒經過宣告的變數都會出現錯誤。

留言