HTTP 模塊是一個通過實現實現 IHttpModule 接口和處理事件,在每次針對應用程序發出請求時調用的程序集。HTTP 模塊作為 ASP.NET 請求管線的一部分調用,能夠在整個請求過程中訪問生命週期事件。因此,HTTP 模塊使我們有機會檢查傳入和傳出的請求,並根據該請求採取操作。甚至我們可以通過實現HTTP模塊來參與ASP.NET運行的管理,例如,ASP.NET 提供了 SessionStateModule 來向應用程序提供會話狀態服務。
    好了,在使用HTTP模塊之前,先讓我們回顧一下一次請求的生命週期事件:
    在這裡特別提到一點,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模塊的強大。該例子實現在每個頁面中添加頁頭和頁腳,效果圖如下:
實現步驟
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
鳴謝:劉琦及其各位分享技術的高手
posted on 2007-09-03 14:14  steventong  阅读(168)  评论(0编辑  收藏  举报

页脚Html代码