惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
Last Week in AI
Last Week in AI
U
Unit 42
aimingoo的专栏
aimingoo的专栏
Engineering at Meta
Engineering at Meta
博客园 - 聂微东
小众软件
小众软件
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Announcements
Recent Announcements
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
博客园_首页
M
MIT News - Artificial intelligence
博客园 - 司徒正美
T
The Blog of Author Tim Ferriss
D
DataBreaches.Net
IT之家
IT之家
C
Check Point Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
D
Docker
Microsoft Security Blog
Microsoft Security Blog
Google DeepMind News
Google DeepMind News

博客园 - steventong

JAVA電子書下載 實用的網站 Eclipse熱鍵 在Tomcat中安装JSTL 對象的序列化和反序列化 开发宝典:程序开发新手入门之Jave ME 15+ Free Visual Studio Add-Ins Linguatec Personal Translator v2008 Professional English-Chinese xmlhttprequest 中文參考 內存調試技巧 AJAX列表 9月2日照片 在ASP.NET中實現AJAX Atlas Framework 快速上手體驗 微軟 ASP.NET 2.0 的 AJAX 利劍 ~ Atlas Framework What is iBATIS? --SQL MAP [轉] ATF -- eclipse的AJAX插件安装指南 [轉]探索 Eclipse 的 Ajax Toolkit Framework SAJAX FOR PHP
使用HTTP模块扩展 ASP.NET 处理
steventong · 2007-09-03 · via 博客园 - steventong

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

鳴謝:劉琦及其各位分享技術的高手

出自 51CTO.COM博客