http module概述
暫時先不考慮我們自己實現http module的情況。在.net中,http module 是實現了ihttpmodule介面的程式集。ihttpmodule 介面本身並沒有什麼好大寫特寫的,由它的名字可以看出,它不過是乙個普普通通的介面而已。實際上,我們關心的是實現了這些介面的類,如果我們也編寫**實現了這個介面,那麼有什麼用途。一般來說,我們可以將asp.net中的事件分成三個級別,最頂層是 應用程式級事件、其次是頁面級事件、最下面是控制項級事件,事件的觸發分別與 應用程式週期、頁面週期、控制項週期緊密相關。而 http module 的作用是與應用程式事件 密切相關的。
我們通過http module在http請求管道(pipeline)中註冊期望對應用程式事件做出反應的方法,在相應的事件觸發的時候(比如說beginrequest事件,它在應用程式收到乙個http請求並即將對其進行處理時觸發),便會呼叫http module註冊了的方法,實際的工作在這些方法中執行。.net 本身已經有很多的http module,其中包括 表單驗證module(formsauthenticationmodule), session 狀態module(sessionstatemodule),輸出快取module (outputcachemodule)等。
註冊 http module
在註冊我們自己編寫的 http module 之前,先來看看asp.net中已經有的httpmodule。與 http handler類似,我們需要開啟機器上c:\windows\microsoft.net\framework\ v2.0.50727\config 目錄下的 web.config 檔案。找到 結點,應該可以看到下面的內容:
... 略
通過name屬性,我們還可以在global.asax中檔案中編寫自定義httpmodule暴露出的事件的處理程式,它採用的格式是:void modulename_eventname(object sender, eventargs e)。我們將在後面做更詳細介紹。
asp.net 內建的 http modules
下面這張**列出了c:\windows\microsoft.net\framework\ v2.0.50727\config下的web.config中的 asp.net 內建的http modules 及其主要作用。
名稱 型別 功能
outputcache system.web.caching.outputcachemodule 頁面級輸出快取
session system.web.sessionstate.sessionstatemodule session狀態管理
windowsauthentication system.web.security.windowsauthenticationmodule 用整合windows身份驗證進行客戶端驗證
formsauthentication system.web.security.formsauthenticationmodule 用基於cookie的窗體身份驗證進行客戶端身份驗證
passportauthentication system.web.security.passportauthenticationmodule 用ms護照進行客戶身份驗證
rolemanager system.web.security.rolemanagermodule 管理當前使用者角色
urlauthorization system.web.security.urlauthorizationmodule 判斷使用者是否被授權訪問某一url
fileauthorization system.web.security.fileauthorizationmodule 判斷使用者是否被授權訪問某一資源
anonymousidentification system.web.security.anonymousidentificationmodule 管理asp.net應用程式中的匿名訪問
profile system.web.profile.profilemodule 管理使用者檔案檔案的創立 及相關事件
errorhandlermodule system.web.mobile.errorhandlermodule 捕捉異常,格式化錯誤提示字元,傳遞給客戶端程式
我們將在後面用程式設計的方式來檢視它。
ihttpmodule介面
看了這麼多理論知識,本節將開始動手寫點程式,實現自己的http module。我們首先需要看下ihttpmodule 介面,它包括下面兩個方法:
整個過程很好理解:
dispose():它可以在進行垃圾**之前進行一些清理工作。
綜上所述:實現乙個 ihttpmodule 的模板一般是這樣的:
public void dispose()
}通過http module向http請求輸出流中寫入文字
本例中,我們僅用beginrequest事件和 endrequest 事件對 http module 的使用作以說明。我們通過這個範例,了解 http module 基本的使用方法。
");}
接下來在 web.config 的 system.web 結點中寫入以下內容:
然後,開啟建立站點時自動建立的 default.aspx檔案,在裡面打幾個字,為了做區分,我輸入的是:位於.aspx頁面上的文字。然後,我們在瀏覽器中開啟它,應該會看到像這樣:
然後我們再新建乙個 default2.aspx,在瀏覽器中瀏覽,可以看到,兩個頁面的效果相同。這說明對於不同的兩個檔案,http module都起了作用,可見它確實是位於應用程式級,而非頁面級。
現在,我們再開啟站點中的一張檔案,發現顯示出的是乙個紅叉叉,為什呢?因為http module 針對是http 請求,而不是某個或某一類檔案,所以當請求一張的時候,我們編寫的http module依然會起作用,將文字插入到二進位制中,破壞了檔案格式,自然只能顯示紅叉叉了。
note:如果你發現你的顯示正常,請不要驚訝,事情是這樣的:回想一下第一節我們討論到的,對於檔案,由iis直接處理,並不會交由aspnet_isapi.dll,所以,module無法捕獲對於型別檔案的請求。解決方法就是在iis中進行設定一下。
這裡需要提請注意的是:如果你使用vs2005自帶的local server,那麼你無需對iis進行設定,所有的不論還是任何檔案型別,都會交由aspnet_isapi.dll處理。
遍歷http module集合
現在,我們通過遍歷 httpmodulecollection 集合來檢視註冊給應用程式的所有 http module 的名稱。
新建乙個檔案 registeredmodules.aspx,在**後置檔案中新增如下方法:
// 獲取所有的 module 名稱
string modulenames = modulecollection.allkeys;
system.text.stringbuilder results = new system.text.stringbuilder(); //遍歷結果集
return results.tostring();
}然後在page_load方法中輸出一下:
protected void page_load(object sender, eventargs e)
我們應該可以看到下面這樣的畫面:
與之前列出的那張**比較一下,可以看出是幾乎完全一致的(多了乙個defaultauthentication)。另外注意上圖的倒數第四行,那不是我們自己定義的module麼?name為mymodule,型別為moduledemo。
HttpModule工作機制
httpmodule是如何工作的 當乙個http 請求到達 時,整個 asp.net framework 系統還並沒有對這個 請求做任何處理,也就是說此時對於 請求來講,是乙個http 請求的 必經之路 所以可以在這個 請求傳遞到真正的請求處理中心 之前附加一些需要的資訊在這個 請求資訊之上,或者針...
使用httpModule做許可權系統
reference 頁面請求過程 例如使用前者 usingsystem usingsystem.web usingsystem.security.principal namespacemymodules publicvoiddispose privatevoidauthenticaterequest...
使用httpmodule驗證使用者登入
當 要驗證使用者是否登入時,每個頁面都進行驗證,實在是一件費時費力的事情,當需要修改時,那更是純粹的浪費體力。所以,我們可以採取當使用者請求 時,每個頁面都進行驗證,這就涉及到頁面的生命週期。首先,要修改配置檔案,在web.config配置檔案中增加一節 其次是要寫驗證了,寫乙個類繼承system....