asp.net本质论——HttpModule
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                asp.net本质论——HttpModule
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            處理 HttpApplication 的事件HttpApplication 提供了基于事件的擴展機制,允許程序員借助于處理管道中的事件進行處理過程擴展。由于 HttpApplication 對象是由 ASP.NET 基礎架構來創建和維護的,那么,如何才能獲取這個對象引用,以便于注冊 HttpApplication 對象的事件處理,就是程序員首先要解決的問題。在 ASP.NET 中,提供了兩種方式來解決這個問題:IHttpModule 方式和 global.asax 方式。這兩種方式的核心都是 IHttpModule 接口。通過 IHttpModule 創建 HttpApplication 的事件處理程序在 ASP.NET中,定義在System.Web 命名空間下的 IHttpModule 接口專門用來定義 HttpApplication對象的事件處理。實現 IHttpModule 接口的類稱為 HttpModule。IHttpModule 接口的定義如下,其中僅僅包含兩個成員:public interface IHttpModule??{
??????void Dispose()
??????void Init( HttpApplication context )
??}其中,Dispose 方法用于回收 Module 所使用的非托管資源,如果沒有的話,直接返回即可。最重要的是 Init 方法,可以看到,這個方法接收一個 HttpApplication 類型的參數,在 ASP.NET 中,每當創建一個 HttpApplication 對象實例,將遍歷注冊的 HttpModule 類型,通過反射,依次創建每個注冊 HttpModule 類型的一個實例對象,并將這個 HttpApplication 實例通過 Init 方法傳遞給各個 HttpModule,這樣 HttpModule 就可以在第一時間完成針對 HttpApplication 對象的事件注冊了。例如,希望寫一個處理 PostAuthenticateRequest 事件的 HttpModule,那么,可以如下完成事件的注冊:public void Init(System.Web.HttpApplication application)??
{
??????application.PostAuthenticateRequest?
???????+= new EventHandler(Application_PostAuthenticateRequest);??
} 注冊 HttpModule在 ASP.NET 中,實現 IHttpModule 接口只是實現 HttpModule 的第一步,在 ASP.NET 中所使用的 HttpModule 還必須在網站配置文件中進行注冊才能真正生效,并在 ASP.NET 中使用。在 .NET 中,網站的配置文件分成三個級別,首先,在 .NET 的系統文件夾中,有針對本服務器所有 .NET 程序的配置文件,配置文件所在的文件夾位于如下位置:操作系統文件夾\Microsoft.NET\Framework\ASP.NET版本\Config在這個文件夾中,有兩個重要的配置文件: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 擴展名。例如,自定義的 HttpModule 類位于程序集 OnlineUserModule 中,類的全名為 com.aspnet.OnlineUserModule,將這個自定義的 HttpModule 注冊到網站中,那么配置文件中的定義如下所示:<httpModules>
????<add name="online" type="com.aspnet.OnlineUserModule,OnlineUserModule"/>
</httpModules>對于 IIS 7.0來說,需要在配置文件的 system.webServer 配置節中注冊 HttpModule。注意此時的配置元素名稱變為了 modules。 在 IIS 7.0 中,可以為 MapRequestHandler,LogRequest 和 PostLogRequest 事件添加處理程序。只有在 IIS 7.0 集成模式下運行并且與 .NET Framework 3.0 或更高版本一起運行的應用程序,才可以支持這些事件。<system.webServer>
???<modules>
?????<add name="ModuleExample" type="Samples.ModuleExample"/>
???</modules>
</system.webServer>托管代碼模塊也可以在 IIS 7.0 配置存儲區(ApplicationHost.config 文件)的 modules 元素中注冊。在 ApplicationHost.config 文件中注冊的模塊具有全局范圍,因為它們為所有由 IIS 7.0 承載的 Web 應用程序而注冊。同樣,在 ApplicationHost.config 文件的 globalModules 元素中定義的本機代碼模塊也具有全局范圍。如果 Web 應用程序不需要全局模塊,則可以將其禁用。不使用配置文件注冊 HttpModule在 ASP.NET 4.0 中,還可以不通過修改配置文件來完成 Moudle 的注冊。從 .NET 3.5 開始,新提供的 PreApplicationStartMethodAttribute 特征可以應用在程序集上,使得自定義的網站初始化代碼可以在 Web 應用程序的Application_Start初始化環節之前就執行。這個步驟甚至在動態編譯和執行 Application_Start 之前。對于每個程序集,可以定義一次。特征的定義如下:[AttributeUsageAttribute(AttributeTargets.Assembly,AllowMultiple = false)]
public sealed class PreApplicationStartMethodAttribute : Attribute??{
??????public Type Type { get; }
??????public string MethodName { get; }
??????......??
}Type 用來指定定義了初始化方法的類型,MethodName 用來指定將要執行的初始化方法。這樣,可以不在配置文件中固定配置 HttpModule,而是定義一個方法,這個方法可以返回需要動態注冊的 HttoModule,將這個方法以委托的形式登記在一個集合中。在網站啟動之后,每當 HttpApplicationFactory 創建一個 HttpApplication 對象,完成正常注冊的 HttpModule 創建及初始化之后,再來創建我們動態注冊的這些 HttpModule。對于 HttpApplication 來說,其 Init 方法將在網站正常注冊的 HttpModule 創建及注冊之后被調用,用來完成自定義的 HttpApplication 初始化。我們可以在這個時間點動態注冊 HttpModule。在 ASP.NET 網站中,Global.asax 文件用來生成一個 HttpApplication 的派生類,這個類用來創建網站中使用的 HttpApplication 對象,我們可以重寫這個派生類的 Init 方法,完成動態注冊的 HttpModule 創建和注冊工作。<script runat="server">
??????private List<IHttpModule> dynamicModules;
??????public override void Init()
??????{
??????????base.Init();
???????????this.dynamicModules = DynamicHttpModuleManager.GetModules();
??????????foreach (IHttpModule module in this.dynamicModules)
??????????{
??????????????module.Init(this);
??????????}
??????}
//這個在Global.asax文件在網站初始化之前,將需要注冊的 Module 類型記錄在一個集合中。public delegate IHttpModule CreateDynamicHttpModule(??);
public static class DynamicHttpModuleManager
{
??????private static List<CreateDynamicHttpModule> _createModuleHandlerList = new List<CreateDynamicHttpModule>();
???????public static void RegisterDynamicModule(CreateDynamicHttpModule handler )
??????{
??????????_createModuleHandlerList.Add(handler);
??????}
???????public static List<IHttpModule> GetModules()
??????{
??????????List<IHttpModule> list = new List<IHttpModule>();
??????????foreach (CreateDynamicHttpModule handler in _createModuleHandlerList)
??????????{
??????????????IHttpModule module = handler();
??????????????list.Add(module);
??????????}
??????????return list;
??????}
}在 Module 中增加一個用于注冊的方法 Register,注意,必須是 public 和 static 。namespace DiskFileUpload
{
??????public class UploadModule : System.Web.IHttpModule
??????{
??????????public static void Register()
??????????{
??????????????DynamicHttpModuleManager.RegisterDynamicModule
??????????????????(
??????????????????????()=>new UploadModule()
??????????????????);
??????????}
??????}
}最后,在項目的 AssemblyInfo.cs 文件中增加 PreApplicationStartMethod 特征完成動態注冊。[assembly: PreApplicationStartMethod(typeof(DiskFileUpload.UploadModule),"Register")] 常見的 HttpModule在 ASP.NET 中,已經預定義了許多HttpModule,甚至已經在服務器的網站配置文件中進行了注冊,在系統文件夾 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config 中,web.config 文件中已經注冊了 14 個 HttpModule。<httpModules>
?????<add name="OutputCache" type="System.Web.Caching.OutputCacheModule" />
?????<add name="Session" type="System.Web.SessionState.SessionStateModule" />
?????<add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" />
?????<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
?????<add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule" />
?????<add name="RoleManager" type="System.Web.Security.RoleManagerModule" />
?????<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
?????<add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" />
?????<add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule" />
?????<add name="Profile" type="System.Web.Profile.ProfileModule" />
?????<add name="ErrorHandlerModule" type="System.Web.Mobile.ErrorHandlerModule, System.Web.Mobile, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
?????<add name="ServiceModel" type="System.ServiceModel.Activation.HttpModule, System.ServiceModel.Activation,Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
?????<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
?????<add name="ScriptModule-4.0" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>主要的HttpModule的解釋如下:OutputCacheMudole 完成ASP.NET的輸出緩存管理工作。OutputCacheMudole的配置參數通過system.web配置元素的caching子元素的 outputCache元素進行定義。當啟用輸出緩存之后,OutputCacheMudole 將注冊 HttpApplication 的ResolveRequestCache 和 UpdateRequestCache 兩個事件完成輸出緩存的管理。SessionStateModule 完成 Session 的管理工作。這個 Module 的配置參數通過配置文件中的 system.web 配置元素的 sessionState 子元素進行配置。當啟用 Session 狀態管理之后,SessionStateModule 將注冊 HttpApplication 的AcquireRequestState、ReleaseRequestState、EndRequest三個事件完成 Session 狀態的管理工作。ProfileModule 在 .NET 2.0 之后,提供個性化數據管理。這是一個自定義的類似于 Session 的會話狀態管理,但是,個性化數據的讀取和保存可以由程序員完全控制,并且提供了強類型的數據訪問方式。這個 Module 的配置參數在 system.web 的子元素 profile 中進行說明。當啟用了個性化數據管理之后,Module 將注冊 HttpApplicaiton 的 AcquireRequestState 和EndRequest 事件處理。AnonymousIdentificationModule 提供匿名用戶的標識。是否啟用匿名用戶標識在配置文件的system.web配置元素的子元素 anonymousIdentification 中定義,還可以配置匿名標識的管理方式。由于在 AuthenticateRequest 事件中將驗證用戶,獲取用戶名,所以,這個 Module 注冊了 PostAuthenticateRequest 的事件處理,當用戶沒有經過驗證的時候,為用戶分配一個唯一的匿名標識。WindowsAuthenticationModule、FormsAuthenticationModule和PassportAuthenticationModule用來完成用戶的驗證工作。它們通過配置文件中 system.web 的子元素 authentication 子元素定義,mode 屬性用來指定網站當前使用的驗證方式,也就是哪一個 Module 將被用來完成驗證工作。在啟用驗證的情況下,FormsAuthenticationModule 和 PassportAuthenticationModule將注冊 HttpApplication 的AuthenticateRequest 和 EndRequest 事件進行用戶的驗證處理。 WindowsAuthenticationModule 將注冊 AuthenticateRequest 的事件處理。RoleManagerModule、UrlAuthorizationModule、FileAuthorizationModule 用來完成用戶的授權管理。授權管理的配置參數來自 system.web 的 authorization 子元素。UrlAuthorizationModule 和 FileAuthorizationModule 注冊了 HttpApplication 的 AuthorizeRequest 事件處理,用來檢查 Url 和 文件的訪問授權。RoleManagerModule 在 Url 和 文件訪問授權檢查通過之后,通過用戶的標識和角色來完成用戶的授權檢查,RoleManagerModule 注冊了 HttpApplication 的 PostAuthenticateRequest 和 EndRequest 事件處理。HttpModule的事件每個 HttpModule 也可以觸發自定義的事件,但是,處理這些 HttpModule事件更加麻煩一些,因為這些 HttpModule 對象實例也不是我們自己創建的。一般來說,可以通過 HttpApplication 的 Modules 屬性獲取特定的 HttpModule ,這個屬性的定義如下:public HttpModuleCollection Modules { get; }可以使用定義 HttpModule 時候的 name 做為索引器來獲取對應的 HttpModule。例如,獲取前面定義的 HttpModule 對象的引用,可以如下進行。application. Modules["online" ]然后,就可以定義這個 HttpModule 的事件處理了。不過,這樣比較麻煩,更加簡單的方式是在 Global.asax 中進行事件處理。創建和注冊自定義 HTTP 模塊? http://msdn.microsoft.com/zh-cn/library/ms227673(v=vs.100).aspx IHttpModule 接口?? http://msdn.microsoft.com/zh-cn/library/system.web.ihttpmodule(v=vs.80).aspx
通過 為知筆記 發布
 
                        
                        
                        ??????void Dispose()
??????void Init( HttpApplication context )
??}其中,Dispose 方法用于回收 Module 所使用的非托管資源,如果沒有的話,直接返回即可。最重要的是 Init 方法,可以看到,這個方法接收一個 HttpApplication 類型的參數,在 ASP.NET 中,每當創建一個 HttpApplication 對象實例,將遍歷注冊的 HttpModule 類型,通過反射,依次創建每個注冊 HttpModule 類型的一個實例對象,并將這個 HttpApplication 實例通過 Init 方法傳遞給各個 HttpModule,這樣 HttpModule 就可以在第一時間完成針對 HttpApplication 對象的事件注冊了。例如,希望寫一個處理 PostAuthenticateRequest 事件的 HttpModule,那么,可以如下完成事件的注冊:public void Init(System.Web.HttpApplication application)??
{
??????application.PostAuthenticateRequest?
???????+= new EventHandler(Application_PostAuthenticateRequest);??
} 注冊 HttpModule在 ASP.NET 中,實現 IHttpModule 接口只是實現 HttpModule 的第一步,在 ASP.NET 中所使用的 HttpModule 還必須在網站配置文件中進行注冊才能真正生效,并在 ASP.NET 中使用。在 .NET 中,網站的配置文件分成三個級別,首先,在 .NET 的系統文件夾中,有針對本服務器所有 .NET 程序的配置文件,配置文件所在的文件夾位于如下位置:操作系統文件夾\Microsoft.NET\Framework\ASP.NET版本\Config在這個文件夾中,有兩個重要的配置文件: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 擴展名。例如,自定義的 HttpModule 類位于程序集 OnlineUserModule 中,類的全名為 com.aspnet.OnlineUserModule,將這個自定義的 HttpModule 注冊到網站中,那么配置文件中的定義如下所示:<httpModules>
????<add name="online" type="com.aspnet.OnlineUserModule,OnlineUserModule"/>
</httpModules>對于 IIS 7.0來說,需要在配置文件的 system.webServer 配置節中注冊 HttpModule。注意此時的配置元素名稱變為了 modules。 在 IIS 7.0 中,可以為 MapRequestHandler,LogRequest 和 PostLogRequest 事件添加處理程序。只有在 IIS 7.0 集成模式下運行并且與 .NET Framework 3.0 或更高版本一起運行的應用程序,才可以支持這些事件。<system.webServer>
???<modules>
?????<add name="ModuleExample" type="Samples.ModuleExample"/>
???</modules>
</system.webServer>托管代碼模塊也可以在 IIS 7.0 配置存儲區(ApplicationHost.config 文件)的 modules 元素中注冊。在 ApplicationHost.config 文件中注冊的模塊具有全局范圍,因為它們為所有由 IIS 7.0 承載的 Web 應用程序而注冊。同樣,在 ApplicationHost.config 文件的 globalModules 元素中定義的本機代碼模塊也具有全局范圍。如果 Web 應用程序不需要全局模塊,則可以將其禁用。不使用配置文件注冊 HttpModule在 ASP.NET 4.0 中,還可以不通過修改配置文件來完成 Moudle 的注冊。從 .NET 3.5 開始,新提供的 PreApplicationStartMethodAttribute 特征可以應用在程序集上,使得自定義的網站初始化代碼可以在 Web 應用程序的Application_Start初始化環節之前就執行。這個步驟甚至在動態編譯和執行 Application_Start 之前。對于每個程序集,可以定義一次。特征的定義如下:[AttributeUsageAttribute(AttributeTargets.Assembly,AllowMultiple = false)]
public sealed class PreApplicationStartMethodAttribute : Attribute??{
??????public Type Type { get; }
??????public string MethodName { get; }
??????......??
}Type 用來指定定義了初始化方法的類型,MethodName 用來指定將要執行的初始化方法。這樣,可以不在配置文件中固定配置 HttpModule,而是定義一個方法,這個方法可以返回需要動態注冊的 HttoModule,將這個方法以委托的形式登記在一個集合中。在網站啟動之后,每當 HttpApplicationFactory 創建一個 HttpApplication 對象,完成正常注冊的 HttpModule 創建及初始化之后,再來創建我們動態注冊的這些 HttpModule。對于 HttpApplication 來說,其 Init 方法將在網站正常注冊的 HttpModule 創建及注冊之后被調用,用來完成自定義的 HttpApplication 初始化。我們可以在這個時間點動態注冊 HttpModule。在 ASP.NET 網站中,Global.asax 文件用來生成一個 HttpApplication 的派生類,這個類用來創建網站中使用的 HttpApplication 對象,我們可以重寫這個派生類的 Init 方法,完成動態注冊的 HttpModule 創建和注冊工作。<script runat="server">
??????private List<IHttpModule> dynamicModules;
??????public override void Init()
??????{
??????????base.Init();
???????????this.dynamicModules = DynamicHttpModuleManager.GetModules();
??????????foreach (IHttpModule module in this.dynamicModules)
??????????{
??????????????module.Init(this);
??????????}
??????}
//這個在Global.asax文件在網站初始化之前,將需要注冊的 Module 類型記錄在一個集合中。public delegate IHttpModule CreateDynamicHttpModule(??);
public static class DynamicHttpModuleManager
{
??????private static List<CreateDynamicHttpModule> _createModuleHandlerList = new List<CreateDynamicHttpModule>();
???????public static void RegisterDynamicModule(CreateDynamicHttpModule handler )
??????{
??????????_createModuleHandlerList.Add(handler);
??????}
???????public static List<IHttpModule> GetModules()
??????{
??????????List<IHttpModule> list = new List<IHttpModule>();
??????????foreach (CreateDynamicHttpModule handler in _createModuleHandlerList)
??????????{
??????????????IHttpModule module = handler();
??????????????list.Add(module);
??????????}
??????????return list;
??????}
}在 Module 中增加一個用于注冊的方法 Register,注意,必須是 public 和 static 。namespace DiskFileUpload
{
??????public class UploadModule : System.Web.IHttpModule
??????{
??????????public static void Register()
??????????{
??????????????DynamicHttpModuleManager.RegisterDynamicModule
??????????????????(
??????????????????????()=>new UploadModule()
??????????????????);
??????????}
??????}
}最后,在項目的 AssemblyInfo.cs 文件中增加 PreApplicationStartMethod 特征完成動態注冊。[assembly: PreApplicationStartMethod(typeof(DiskFileUpload.UploadModule),"Register")] 常見的 HttpModule在 ASP.NET 中,已經預定義了許多HttpModule,甚至已經在服務器的網站配置文件中進行了注冊,在系統文件夾 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config 中,web.config 文件中已經注冊了 14 個 HttpModule。<httpModules>
?????<add name="OutputCache" type="System.Web.Caching.OutputCacheModule" />
?????<add name="Session" type="System.Web.SessionState.SessionStateModule" />
?????<add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" />
?????<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
?????<add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule" />
?????<add name="RoleManager" type="System.Web.Security.RoleManagerModule" />
?????<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
?????<add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" />
?????<add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule" />
?????<add name="Profile" type="System.Web.Profile.ProfileModule" />
?????<add name="ErrorHandlerModule" type="System.Web.Mobile.ErrorHandlerModule, System.Web.Mobile, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
?????<add name="ServiceModel" type="System.ServiceModel.Activation.HttpModule, System.ServiceModel.Activation,Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
?????<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
?????<add name="ScriptModule-4.0" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>主要的HttpModule的解釋如下:OutputCacheMudole 完成ASP.NET的輸出緩存管理工作。OutputCacheMudole的配置參數通過system.web配置元素的caching子元素的 outputCache元素進行定義。當啟用輸出緩存之后,OutputCacheMudole 將注冊 HttpApplication 的ResolveRequestCache 和 UpdateRequestCache 兩個事件完成輸出緩存的管理。SessionStateModule 完成 Session 的管理工作。這個 Module 的配置參數通過配置文件中的 system.web 配置元素的 sessionState 子元素進行配置。當啟用 Session 狀態管理之后,SessionStateModule 將注冊 HttpApplication 的AcquireRequestState、ReleaseRequestState、EndRequest三個事件完成 Session 狀態的管理工作。ProfileModule 在 .NET 2.0 之后,提供個性化數據管理。這是一個自定義的類似于 Session 的會話狀態管理,但是,個性化數據的讀取和保存可以由程序員完全控制,并且提供了強類型的數據訪問方式。這個 Module 的配置參數在 system.web 的子元素 profile 中進行說明。當啟用了個性化數據管理之后,Module 將注冊 HttpApplicaiton 的 AcquireRequestState 和EndRequest 事件處理。AnonymousIdentificationModule 提供匿名用戶的標識。是否啟用匿名用戶標識在配置文件的system.web配置元素的子元素 anonymousIdentification 中定義,還可以配置匿名標識的管理方式。由于在 AuthenticateRequest 事件中將驗證用戶,獲取用戶名,所以,這個 Module 注冊了 PostAuthenticateRequest 的事件處理,當用戶沒有經過驗證的時候,為用戶分配一個唯一的匿名標識。WindowsAuthenticationModule、FormsAuthenticationModule和PassportAuthenticationModule用來完成用戶的驗證工作。它們通過配置文件中 system.web 的子元素 authentication 子元素定義,mode 屬性用來指定網站當前使用的驗證方式,也就是哪一個 Module 將被用來完成驗證工作。在啟用驗證的情況下,FormsAuthenticationModule 和 PassportAuthenticationModule將注冊 HttpApplication 的AuthenticateRequest 和 EndRequest 事件進行用戶的驗證處理。 WindowsAuthenticationModule 將注冊 AuthenticateRequest 的事件處理。RoleManagerModule、UrlAuthorizationModule、FileAuthorizationModule 用來完成用戶的授權管理。授權管理的配置參數來自 system.web 的 authorization 子元素。UrlAuthorizationModule 和 FileAuthorizationModule 注冊了 HttpApplication 的 AuthorizeRequest 事件處理,用來檢查 Url 和 文件的訪問授權。RoleManagerModule 在 Url 和 文件訪問授權檢查通過之后,通過用戶的標識和角色來完成用戶的授權檢查,RoleManagerModule 注冊了 HttpApplication 的 PostAuthenticateRequest 和 EndRequest 事件處理。HttpModule的事件每個 HttpModule 也可以觸發自定義的事件,但是,處理這些 HttpModule事件更加麻煩一些,因為這些 HttpModule 對象實例也不是我們自己創建的。一般來說,可以通過 HttpApplication 的 Modules 屬性獲取特定的 HttpModule ,這個屬性的定義如下:public HttpModuleCollection Modules { get; }可以使用定義 HttpModule 時候的 name 做為索引器來獲取對應的 HttpModule。例如,獲取前面定義的 HttpModule 對象的引用,可以如下進行。application. Modules["online" ]然后,就可以定義這個 HttpModule 的事件處理了。不過,這樣比較麻煩,更加簡單的方式是在 Global.asax 中進行事件處理。創建和注冊自定義 HTTP 模塊? http://msdn.microsoft.com/zh-cn/library/ms227673(v=vs.100).aspx IHttpModule 接口?? http://msdn.microsoft.com/zh-cn/library/system.web.ihttpmodule(v=vs.80).aspx
通過 為知筆記 發布
轉載于:https://www.cnblogs.com/weapon/archive/2012/12/22/2828746.html
總結
以上是生活随笔為你收集整理的asp.net本质论——HttpModule的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 在Access中执行SQL语句
- 下一篇: DevExpress之TreeList节
