HTTP 模塊是一個通過實現實現 IHttpModule 接口和處理事件,在每次針對應用程序發出請求時調用的程序集。HTTP 模塊作為 ASP.NET 請求管線的一部分調用,能夠在整個請求過程中訪問生命週期事件。因此,HTTP 模塊使我們有機會檢查傳入和傳出的請求,並根據該請求採取操作。甚至我們可以通過實現HTTP模塊來參與ASP.NET運行的管理,例如,ASP.NET 提供了 SessionStateModule 來向應用程序提供會話狀態服務。
![](http://blog.51cto.com/attachment/200707/200707231185160814656.jpg)
好了,在使用HTTP模塊之前,先讓我們回顧一下一次請求的生命週期事件:
![](http://blog.51cto.com/attachment/200707/200707231185160814656.jpg)
在這裡特別提到一點,HTTP 模塊不同於 HTTP 處理程序。對於所有的請求和響應都可調用 HTTP 模塊,而 HTTP 處理程序僅在響應特定的請求時才運行。
HTTP 模塊典型的用法包括:
l 安全性。因為您可以檢查傳入的請求,所以 HTTP 模塊可以在請求頁、XML Web services 或調用處理程序之前執行自定義的身份驗證或其他安全檢查。
l 統計信息和日誌記錄。因為 HTTP 模塊是在每次請求時調用的,所以,您可以將請求統計信息和日誌記錄信息收集到一個集中的模塊中,而不是收集到各頁中。
l 自定義的頁眉或頁腳。因為您可以修改出站響應,所以可以在每一個頁面或 XML Web services 響應中注入內容,如自定義的標頭信息。
ASP.NET HTTP 模塊針對所有的請求運行,這與 ISAPI 篩選器類似。但是它們是用托管代碼編寫的,而且可以與 ASP.NET 應用程序的生命週期完全集成。編寫 ASP.NET HttpModule 的一般過程為:
l 實現 IHttpModule 接口。
l 處理 Init 方法並為所需事件進行註冊。
l 處理該事件。
l 如果必須進行清理,還可根據需要實現 Dispose 方法。
l 在 Web.config 中註冊該模塊。
下面,咱們通過一個例子體會一下Http模塊的強大。該例子實現在每個頁面中添加頁頭和頁腳,效果圖如下:
![](http://blog.51cto.com/attachment/200707/200707231185160860078.jpg)
實現步驟
1. 在 App_Code 目錄中,創建一個名為 HelloWorldModule.cs的類文件。如果網站還沒有 App_Code 文件夾,請在該站點的根目錄下創建這樣的一個文件夾。
2. 類文件全部代碼如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/// <summary>
/// 簡單的HTTP模塊例子,實現自動添加頁頭和頁腳
/// </summary>
public class HelloWorldModule : IHttpModule
{
/// <summary>
/// 初始化,綁定事件
/// </summary>
/// <param name="application"></param>
public void Init(HttpApplication application)
{
application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
application.EndRequest += (new EventHandler(this.Application_EndRequest));
}
/// <summary>
/// 請求開始時,頁面添加頁頭
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void Application_BeginRequest(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("<h1><font color=red>HTTP模塊添加的題頭</font></h1><hr>");
}
/// <summary>
/// 請求結束時,添加頁腳
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void Application_EndRequest(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("<hr><h1><font color=red>HTTP模塊添加的頁腳</font></h1>");
}
}
3. 在 Web.config 文件中註冊該模塊
<system.web>
<httpModules>
<add name="HelloWorldModule" type="HelloWorldModule"/>
</httpModules>
</system.web>
4. 測試自定義 HTTP 模塊
單獨建立一頁,在頁面中輸入「頁面正文」,模擬頁面內容。運行,看到了吧?
另外舉一個常用例子,就是登錄驗證的問題,如果用戶沒有登錄或者沒有權限,就特別處理,比如跳轉到錯誤頁面或者登錄頁面。
實現步驟
1. 在 App_Code 目錄中,創建一個名為 LoginModule.cs的類文件。如果網站還沒有 App_Code 文件夾,請在該站點的根目錄下創建這樣的一個文件夾。
2. 類文件全部代碼如下:
為了節省篇幅,登錄與權限驗證只是用了null判斷表示一下。
public void Init(HttpApplication application)
{
application.AcquireRequestState += (new EventHandler(this.Application_AcquireRequestState));
}
private void Application_AcquireRequestState(Object source, EventArgs e)
{
HttpApplication Application = (HttpApplication)source;
if (Application.Context.Session["User"] == null)
{
Application.Context.Server.Transfer("ErrorPage.aspx");//引導到錯誤處理的頁面
}
}
3. 在 Web.config 文件中註冊該模塊
<system.web>
<httpModules>
<add name="HelloWorldModule" type="HelloWorldModule"/>
<add name="LoginModule" type=" LoginModule "/>
</httpModules>
</system.web>
4. 再次測試一下吧。
非常簡單的例子,但是已經能說明HTTP模塊的基本使用了。
參考文獻
《Microsoft .NET Framework SDK v2.0》
MSDN
鳴謝:劉琦及其各位分享技術的高手
出自 51CTO.COM博客