關於IHttpModule的相關知識總結

1、IHttpModule相關概述

相關IHttpModule接口:
複製代碼
using System;
namespace System.Web
{
    public interface IHttpModule
    {
        //   銷燬再也不被HttpModule使用的資源
        void Dispose();
        // 初始化一個Module,爲捕獲HttpRequest作準備
        void Init(HttpApplication context);
    }
}
複製代碼

 

功能概述:向實現類提供模塊初始化和處置事件.它可以截獲全部請求,如同windows hook同樣.因此你可以利用它作不少你想要作的事情.html

必然url重寫、大文件上傳、sql注入檢測......web

Asp.net會爲每一個請求分配一個HttpApplication對象.sql

管道

2、IIS七、IIS6 web.config註冊HttpModule

1)IIS6註冊HttpModulewindows

 <system.web>
    <httpModules>
      <add name="..."  type="MyApplication.RequestDurationLoggerModule, MyApplication"/>
    </httpModules>
  </system.web>

2)IIS7註冊HttpModule緩存

<system.webServer>
<modules>app

   <add name="..."    type="MyApplication.RequestDurationLoggerModule, MyApplication"/>post

</modules>ui

</system.webServer>this

3、動態註冊

http://www.cnblogs.com/TomXu/p/3756846.htmlurl

4、HttpModule的事件

參考:http://www.cnblogs.com/tangself/archive/2011/03/28/1998007.html

 

 事件名稱  功能介紹
BeginRequest 指示請求處理開始
AuthenticateRequest 封裝請求身份驗證過程
AuthorizeRequest 封裝檢查是否能利用之前緩存的輸出頁面處理請求的過程
ResolveRequestCache 從緩存中獲得響應時觸發
AcquireRequestState 加載初始化Session時候觸發
PreRequestHandlerExecute 在Http請求進入HttpHandler以前觸發
PostRequestHandlerExecute 在Http請求進入HttpHandler以後觸發
ReleaseRequestState 存儲Session狀態時候觸發
UpdateRequestCache 更新緩存信息時觸發
EndRequest 在Http請求處理完成的時候觸發
PreSendRequestHenaders 在向客戶端發送Header以前觸發
PreSendRequestConternt 在向客戶端發送內容以前觸發


說明:
a、BenginRequest和EndRequest分別是HttpModule容器最開始的和最後的事件;
b、EndRequest以後還會觸發PreSendRequestHeaders事件和PreSendRequestContent事件,這不是在HttpModule外的兩個事件,表示HttpModule結束,即將開始向Client發送數據。

5、完整的httpmodule運行過程

HttpModuleHandler

說明:
a、HttpModule容器會將HttpRequest傳遞到HttpHandler容器,這個時間點是ResolveRequestCache事件
b、HttpModule容器會創建HttpHandler實例做爲入口——Session今後生效
c、觸發AcquireRequestState事件以及PreRequestHandlerExecute事件
d、HttpModule容器便將對HttpRequest的控制權轉讓給HttpHandler容器
e、HttpHandler容器處理HttpRequest——使用自身的ProcessRequest方法,將對其控制權又還給HttpModule容器——以後Session失效。

再次說明: 
a、對於一個HttpModule,在BeginRquest中終止,可是仍然會調用EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件。也能夠說是直接跳轉到EndRequest事件,而不會調用這期間的事件 
b、若是有兩個HttpModule,在第一個HttpModule的BeginRequest中終止,僅僅不會調用第二個HttpModule的BeginRequest,但仍然會調用兩個EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件。看下面的圖示:

驗證生命週期代碼:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
 
 
namespace MyHttpModule
{
    public class ValidaterHttpModuleEvents : IHttpModule
    {
 
 
        public void Dispose()
        { }
 
 
        /// <summary>
        /// 驗證HttpModule事件機制
        /// </summary>
        /// <param name="application"></param>
        public void Init(HttpApplication application)
        {
            application.BeginRequest += new EventHandler(application_BeginRequest);
            application.EndRequest += new EventHandler(application_EndRequest);
            application.AcquireRequestState += new EventHandler(application_AcquireRequestState);
            application.AuthenticateRequest += new EventHandler(application_AuthenticateRequest);
            application.AuthorizeRequest += new EventHandler(application_AuthorizeRequest);
            application.PreRequestHandlerExecute += new EventHandler(application_PreRequestHandlerExecute);
            application.PostRequestHandlerExecute += new EventHandler(application_PostRequestHandlerExecute);
            application.ReleaseRequestState += new EventHandler(application_ReleaseRequestState);
            application.ResolveRequestCache += new EventHandler(application_ResolveRequestCache);
            application.PreSendRequestHeaders += new EventHandler(application_PreSendRequestHeaders);
            application.PreSendRequestContent += new EventHandler(application_PreSendRequestContent);
        }
 
 
        private void application_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            application.Context.Response.Write("application_BeginRequest<br/>");
        }
 
 
        private void application_EndRequest(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            application.Context.Response.Write("application_EndRequest<br/>");
        }
 
 
        private void application_PreRequestHandlerExecute(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            application.Context.Response.Write("application_PreRequestHandlerExecute<br/>");
        }
 
 
        private void application_PostRequestHandlerExecute(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            application.Context.Response.Write("application_PostRequestHandlerExecute<br/>");
        }
 
 
        private void application_ReleaseRequestState(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            application.Context.Response.Write("application_ReleaseRequestState<br/>");
        }
 
 
        private void application_AcquireRequestState(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            application.Context.Response.Write("application_AcquireRequestState<br/>");
        }
 
 
        private void application_PreSendRequestContent(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            application.Context.Response.Write("application_PreSendRequestContent<br/>");
        }
 
 
        private void application_PreSendRequestHeaders(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            application.Context.Response.Write("application_PreSendRequestHeaders<br/>");
        }
 
 
        private void application_ResolveRequestCache(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            application.Context.Response.Write("application_ResolveRequestCache<br/>");
        }
 
 
        private void application_AuthorizeRequest(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            application.Context.Response.Write("application_AuthorizeRequest<br/>");
        }
 
 
        private void application_AuthenticateRequest(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            application.Context.Response.Write("application_AuthenticateRequest<br/>");
        }
    }
}

 

<add name="HttpModule1" type="MyHttpModule.HttpModule1,MyHttpModule"/>
<add name="HttpModule2" type="MyHttpModule.HttpModule2,MyHttpModule"/>

 

HttpModule1和HttpModule2模仿ValidaterHttpModuleEvents編寫(除了類名改變外,事件和方法不變),不貼代碼了。運行結果以下:

HttpModuleCompare

從運行結果能夠看到,在web.config文件中引入自定義HttpModule的順序就決定了多個自定義HttpModule在處理一個HTTP請求的接管順序。

 

(3)、利用HttpModule實現終止這次HttpRequest請求

在BeginRequest事件中,使用HttpApplication.CompleteRequest()方法能夠實現當知足必定條件時終止這次HttpRequest請求

using System;
using System.Web;
 
 
namespace ClassLibrary1
{
    public class MyHttpModule : IHttpModule
    {
        public void Dispose() { }
 
 
        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(Application_BeginRequest);
        }
 
 
        public void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication application = sender as HttpApplication;
            application.CompleteRequest();
            application.Context.Response.Write("請求被終止");
        }
    }
}

2010-03-11_105150

 

說明:
a、對於一個HttpModule,在BeginRquest中終止,可是仍然會調用EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件。也能夠說是直接跳轉到EndRequest事件,而不會調用這期間的事件
b、若是有兩個HttpModule,在第一個HttpModule的BeginRequest中終止,僅僅不會調用第二個HttpModule的BeginRequest,但仍然會調用兩個EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件。看下面的圖示:

MultiModule

 

出處:http://www.cnblogs.com/humble/p/3913078.html

相關文章
相關標籤/搜索