IHttpModule介面 說明

來源:互聯網
上載者:User
IHttpModule向實作類別提供模組初始化和處置事件。
IHttpModule包含兩個方法:

public void Init(HttpApplication context);
public void Dispose();

Init():這個方法接受一個HttpApplication對象,HttpApplication代表了當前的應用程式,我們需要在這個方法內註冊 HttpApplication對象暴露給用戶端的事件。可見,這個方法僅僅是用來對事件進行註冊,而實際的事件處理常式,需要我們另外寫方法。

整個過程很好理解:

1.       當網站第一個資源被訪問的時候,Asp.Net會建立HttpApplication類的執行個體,它代表著網站應用程式,同時會建立所有在Web.Config中註冊過的Module執行個體。
2.       在建立Module執行個體的時候會調用Modul的Init()方法。
3.       在Init()方法內,對想要作出響應的HttpApplication暴露出的事件進行註冊。(僅僅進行方法的簡單註冊,實際的方法需要另寫)。
4.       HttpApplication在其應用程式周期中觸發各類事件。
5.       觸發事件的時候調用Module在其Init()方法中註冊過的方法。

Dispose():它可以在進行記憶體回收之前進行一些清理工作。

public class ModuleDemo:IHttpModule
{
    public void Init(HttpApplication context) {
        // 註冊HttpApplication應用程式 BeginRequest 事件
        // 也可以是其他任何HttpApplication暴露出的事件
        context.BeginRequest += new EventHandler(context_BeginRequest);
    }

    void context_BeginRequest(object sender, EventArgs e) {
        HttpApplication application = (HttpApplication)sender;
        HttpContext context = application.Context;
        // 做些實際的工作,HttpContext對象都獲得了,剩下的基本可以自由發揮了
    }

    public void Dispose() {
    }
}

通過Http Module向Http請求輸出資料流中寫入文字

本例中,我們僅用BeginRequest事件和 EndRequest 事件對 Http Module 的使用作以說明。我們通過這個範例,瞭解 Http Module 基本的使用方法。

首先,請建立一個新的網站,在App_Code目錄中添加類檔案: ModuleDemo.cs:

public class ModuleDemo:IHttpModule
{
    // Init方法僅用於給期望的事件註冊方法
    public void Init(HttpApplication context) {
        context.BeginRequest += new EventHandler(context_BeginRequest);
        context.EndRequest += new EventHandler(context_EndRequest);
    }

    // 處理BeginRequest 事件的實際代碼
    void context_BeginRequest(object sender, EventArgs e) {
        HttpApplication application = (HttpApplication)sender;
        HttpContext context = application.Context;
        context.Response.Write("<h1 style='color:#00f'>來自HttpModule 的處理,請求到達</h1><hr>");
    }

    // 處理EndRequest 事件的實際代碼
    void context_EndRequest(object sender, EventArgs e) {
        HttpApplication application = (HttpApplication)sender;
        HttpContext context = application.Context;
        context.Response.Write("<hr><h1 style='color:#f00'>來自HttpModule的處理,請求結束</h1>");
    }
       
    public void Dispose() {
    }
}

上面的代碼很簡單,它註冊了 HttpApplication執行個體的 BeginRequest 事件 和 EndRequest事件,事件處理方法的作用僅僅是在http請求開始和結束的時候,給http請求的輸入資料流中分別寫入不同的內容。

接下來在 Web.config 的 System.web 結點中寫入以下內容:

<system.web>
    <httpModules>
        <add name="MyModule" type="ModuleDemo" />
    </httpModules>
</system.web>

在這冊我們自己的http module 時,假設類名為ModuleDemo,位於myNameSpace命名空間下,程式集名稱為myDll,我們只需將myDll.dll拷貝到Bin目錄下,並在網站的 web.config 檔案 system.web 結點下建立 httpModules 結點:

<system.web>
    <httpModules>
        <add name="CustomModuleName" type="myNameSpace.ModuleDemo, myDll"/>
    </httpModules>
</system.web>

type屬性由分號“,”分為兩部分,前面是命名空間及類名,也就是類型名;後面是程式集名。如果我們將代碼建立在App_Code目錄中,則不需要再指定程式集名。

name屬性由我們自己命名,不一定與類名相同,此處我將它命名為“CustomModuleName”。我們可以通過應用程式(HttpApplication) 的Modules屬性擷取HttpModuleCollection集合,然後通過name屬性,進一步擷取HttpModule對象。

通過name屬性,我們還可以在global.asax中檔案中編寫自訂HttpModule暴露出的事件的處理常式,它採用的格式是:void ModuleName_EventName(object sender, EventArgs e)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.