一、IHttpModule相關概述
using System; namespace System.Web { public interface IHttpModule { // 銷毀不再被HttpModule使用的資源 void Dispose(); // 初始化一個Module,為捕獲HttpRequest做准備 void Init(HttpApplication context); } }
功能概述:向實現類提供模塊初始化和處置事件.它能夠截獲所有請求,如同windows hook一樣.所以你能夠利用它做很多你想要做的事情.
必然url重寫、大文件上傳、sql注入檢測......
Asp.net會為每個請求分配一個HttpApplication對象.
二、IIS7、IIS6 web.config注冊HttpModule
1)IIS6注冊HttpModule
<system.web>
<httpModules>
<add name="..." type="MyApplication.RequestDurationLoggerModule, MyApplication"/>
</httpModules>
</system.web>
2)IIS7注冊HttpModule
<system.webServer>
<modules>
<add name="..." type="MyApplication.RequestDurationLoggerModule, MyApplication"/>
</modules>
</system.webServer>
三、動態注冊
http://www.cnblogs.com/TomXu/p/3756846.html
四、HttpModule的事件
參考:http://www.cnblogs.com/tangself/archive/2011/03/28/1998007.html
事件名稱 | 功能介紹 |
BeginRequest | 指示請求處理開始 |
AuthenticateRequest | 封裝請求身份驗證過程 |
AuthorizeRequest | 封裝檢查是否能利用以前緩存的輸出頁面處理請求的過程 |
ResolveRequestCache | 從緩存中得到響應時觸發 |
AcquireRequestState | 加載初始化Session時候觸發 |
PreRequestHandlerExecute | 在Http請求進入HttpHandler之前觸發 |
PostRequestHandlerExecute | 在Http請求進入HttpHandler之后觸發 |
ReleaseRequestState | 存儲Session狀態時候觸發 |
UpdateRequestCache | 更新緩存信息時觸發 |
EndRequest | 在Http請求處理完成的時候觸發 |
PreSendRequestHenaders | 在向客戶端發送Header之前觸發 |
PreSendRequestConternt | 在向客戶端發送內容之前觸發 |
說明:
a、BenginRequest和EndRequest分別是HttpModule容器最開始的和最后的事件;
b、EndRequest之后還會觸發PreSendRequestHeaders事件和PreSendRequestContent事件,這不是在HttpModule外的兩個事件,表示HttpModule結束,即將開始向Client發送數據。
五、完整的httpmodule運行過程
說明:
a、對於一個HttpModule,在BeginRquest中終止,但是仍然會調用EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件。也可以說是直接跳轉到EndRequest事件,而不會調用這期間的事件
b、如果有兩個HttpModule,在第一個HttpModule的BeginRequest中終止,僅僅不會調用第二個HttpModule的BeginRequest,但仍然會調用兩個EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件。看下面的圖示: