Asp.net 中HttpHandler,HttpModule,IHttpHandlerFactory的原理與應用(一))

來源:互聯網
上載者:User

最近對頁面的生命週期比較感興趣,看了一些牛人們寫的文章,感覺似懂非懂(仍需要繼續努力^_^).
生命週期中涉及到幾個非常重要的對象:HttpHandler,HttpModule,IHttpHandlerFactory,他們的執行(順序)和IIS又有著莫大的聯絡(回頭琢磨清楚了再補上這一篇)。

大致的執行過程是這樣的:client端發送頁面請求,被IIS的某個進程截獲,它根據申請的頁面尾碼(.aspx)不同,調用不同的頁面處理常式(.asp->asp.dll; .aspx->ISAPI.dll).而頁面處理常式在處理過程中,則要經曆HttpModule,HttpHandler的處理:前者用於頁面處理前和處理後的一些事件的處理,後者進行真正的頁面的處理。
如前所說,HttpModule會在頁面處理前和後對頁面進行處理,所以它不會影響真正的頁面請求。通常用在給每個頁面的頭部或者尾部添加一些資訊(如著作權聲明)等.曾經見過一些免費的空間,我們的頁面上傳上去後,瀏覽的時候發現,在每個頁面的頭部和尾部多了很多小廣告....,如果理解了HttpModule的原理,要做這個就不是很難了~
1.建立一個WebSite
2.建立一個class,命名HttpModuleTest,在這個類裡面對IHttpModule介面進行繼承實現.查看msdn可知道IHttpModule中主要包括這個方法Init(), Dispose().

//Class: HttpModuleTest.cs
//---------------------------------------------
  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>
/// HttpModuleTest 的摘要描述
/// </summary>
public class HttpModuleTest:IHttpModule
...{
    //Init方法用來註冊HttpApplication 事件。
    public void Init(HttpApplication application)
    ...{
         application.BeginRequest +=
             (new EventHandler(this.Application_BeginRequest));
         application.EndRequest +=
             (new EventHandler(this.Application_EndRequest));
     }

    //在頁面處理前執行這個事件方法
    private void Application_BeginRequest(Object source,
          EventArgs e)
    ...{
         HttpApplication application = (HttpApplication)source;
         HttpContext context = application.Context;
         context.Response.Write("<h1><font color=red> HelloWorldModule: Beginning of Request</font></h1><hr>");
         context.Response.Write("<a href='http://www.baidu.com'><h2><font color=blue>click here you will see some ads</font></h2></a>");
     }

    //在頁面處理前執行這個事件方法
    private void Application_EndRequest(Object source, EventArgs e)
    ...{
         HttpApplication application = (HttpApplication)source;
         HttpContext context = application.Context;
         context.Response.Write("<hr><h1><font color=red>HelloWorldModule: End of Request</font></h1>");
     }

    //資源釋放
    public void Dispose()
    ...{
     }
}
//-----------------------------------------------

3.把這個class編譯成Dll:
運行VS2005命令列工具:輸入csc /t:library /r:System.Web.dll D:\Demo\HttpContextDemo\App_Code\HttpModuleTest.cs 而後到D:\Program Files\Microsoft Visual Studio 8\VC 下找到HttpModuleTest.dll,把它複製到當前項目Bin目錄下.
4.配置Web.config,以便處理常式能夠找到我們自訂的httpmodule>
   在System.Web下加入:

  <httpModules >
      <add name="test" type ="HttpModuleTest,HttpModuleTest"/>
    </httpModules>

   注意:name隨便起名字,type前半部分是實現IHttpModule的類名,後半部分是處理檔案名稱(.Dll名稱).
5.建立頁面運行。
你會發現,無論你運行哪個頁面,除了頁面本文外,在頭部和尾部都會出現額外的自訂資訊。

===========
當然,這個只是一個Demo,在實際的應用中,模組可以訪問當前請求的上下文,我們可以根據上下文資訊對請求執行任何操作》

public class IpFilterModule:IHttpModule
...{
    public void Init(HttpApplication context)
    ...{
         context.BeginRequest += new EventHandler(context_BeginRequest);
     }

    void context_BeginRequest(object sender, EventArgs e)
    ...{
        //在事件處理過程中,我們可以獲得當前請求的上下文,根據請求的上下文,我們可以對
        //請求執行任何操作

         HttpApplication app = sender as HttpApplication; //獲得當前應用程式
        if (app != null)
        ...{
            //app.Context 獲得當前上下文資訊
            string hostname = app.Context.Request.UserHostName;

            if (hostname!="cc")
            ...{
                 app.Context.Response.StatusCode = 404;
                 app.Context.Response.End();
             }
         }
     }
    public void Dispose()
    ...{

     }
}

待續......

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.