在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應用不需要全局模塊,則可以將其禁用。