IHttpModule在webconfig中的注冊


在asp.net中,提供了兩種方式用來解決獲取由asp.net服務器創建和維護的HttpApplication對象,方便注冊HttpApplication對象的事件處理。這兩種方式為:IHtpModule和global.asax方式。這兩種方式相同點核心都是IHttpModule接口。

通過IHttpModule接口創建HttpApplication的事件處理程序

該接口在命名空間System.Web下,專門用來定義HttpApplication對象的事件處理。

實現該接口的類稱為HttpModule,在asp.net中,該接口的定義如下:

#region Assembly System.Web.dll, v4.0.0.0
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Web.dll
#endregion

using System;

namespace System.Web
{
    // Summary:
    //     Provides module initialization and disposal events to the implementing class.
    public interface IHttpModule
    {
        // Summary:
        //     Disposes of the resources (other than memory) used by the module that implements
        //     System.Web.IHttpModule.
        void Dispose();
        //
        // Summary:
        //     Initializes a module and prepares it to handle requests.
        //
        // Parameters:
        //   context:
        //     An System.Web.HttpApplication that provides access to the methods, properties,
        //     and events common to all application objects within an ASP.NET application
        void Init(HttpApplication context);
    }
}

Dispose方法,用來回收Module所使用的非托管資源,如果沒有,直接返回即可。

Init方法,這個方法有一個HttpApplication類型的參數,在asp.net中,每當創建一個HttpApplication對象實例,將遍歷注冊的HttpModule類型,通過反射,依次創建每個注冊的HttpModule類型的實例對象,並將這個HttpApplication實例通過Init方法傳遞給各個HttpModule,這樣HttpModule就可以在第一時間完成對HttpApplication的事件注冊。

    public class MyHttpModule : IHttpModule
    {
        public void Dispose()
        {
            throw new NotImplementedException();
        }

        public void Init(HttpApplication context)
        {
            context.PostAuthenticateRequest += context_PostAuthenticateRequest;
        }

        void context_PostAuthenticateRequest(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }
    }

在asp.net中,實現了接口IHttpModule接口只是實現了HttpModule的第一步,如果要讓其起作用,我們還需要,將其注冊在網站的配置文件中。

說到配置文件,我們必須說說在.net中,網站配置文件的執行順序,也可以說是級別。

在.Net的系統文件夾中,有針對服務器所有.Net程序的配置文件,配置文件所在的文件夾位於操作系統的:C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config目錄下,當然不同的.net版本對應的也不同。

在這個文件夾下,有兩個重要的配置文件:machine.config和web.config。

machine.config配置文件中保存有針對服務器所有.net程序的基本配置參數。web.config配置文件中保存針對針對此服務器所有web應用程序的基本配置參數。在我們開發的網站項目中的web.config中所做的配置,是專門針對這個網站應用程序的配置文件,在網站因公程序中起作用的配置參數來自這三個配置文件的整合。

在asp.net的網站配置文件web.config中,system.web配置元素的子元素httpModules用來配置網站所使用的HttpModule:httpModules的子元素add用來增加一個新的HttpModule,clear將清楚前面注冊的所有HttpModule。

add元素有兩個必選的屬性name和type。

name:表示這個HttpModule在程序中的名字,在網站應用程序中,可以通過這個名字來找到這個HttpModule對象的引用。HttpApplication的Modules屬性表示這個對象所關聯的所有HttpModule對象,通過這個name作為索引器,可以找到對應的HttpModule對象。

type:表示HttpModule對象的類型名,asp.net網站可以使用這個類型名,通過反射來動態創建HttpModule對象,類型的寫法就是反射中要求的類型名稱寫法,如果這個類定義在網站中,那么就是一個包含命名空間的類的全名。否則的話,在全名的后面使用逗號翻個,還需要跟上類型所在的程序集的名稱,這個程序集的名稱不需要包含.dll擴展名。

例如,我們有一個專門的Module類庫UserModule,對應的程序集的名稱為UserModule.dll,該程序集中有一個處理在線用戶的OnlineUserModule,那么我們在配置文件中注冊就應該是這樣子的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace UserModule
{
    public class OnlineUserModule:IHttpModule
    {
        public void Dispose()
        {
            throw new NotImplementedException();
        }

        public void Init(HttpApplication context)
        {
            throw new NotImplementedException();
        }
    }
}
    <httpModules>
      <add name="online" type="UserModule.OnlineUserModule"/>
    </httpModules>

對於IIS7.0來說,需要在配置文件的system.webServer配置節點中注冊HttpModule。注意此時的配置元素名稱為modules。在iis7.0中,可以為MapRequestHandler,LogRequest和PostLogRequest事件添加處理程序。只有在iis7.0集成模式下運行並且與.NET framework3.0或者更高版本一起運行的應用程序,才可以支持這些事件。

  <system.webServer>
    <modules>
      <add name="online" type="UserModule.OnlineUserModule"/>
    </modules>
  </system.webServer>

拓展代碼塊也可以在iis7.0配置存儲區(ApplicationHost.config)的modules元素中注冊。在ApplicationHost.config文件中注冊的模塊具有全局范圍,因為他們為所有由IIS7.0承載的web應用程序注冊。同樣,在ApplicationHost.config文件的globalModules元素中定義的本機代碼模塊,也具有全局范圍。如果web應用不需要全局模塊,則可以將其禁用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM