自己做免费网站的视频参考消息电子版手机版
news/
2025/9/26 12:41:10/
文章来源:
自己做免费网站的视频,参考消息电子版手机版,小程序介绍内容怎么写,网站建设方案书模版处理 HttpApplication 的事件HttpApplication 提供了基于事件的扩展机制#xff0c;允许程序员借助于处理管道中的事件进行处理过程扩展。由于 HttpApplication 对象是由 ASP.NET 基础架构来创建和维护的#xff0c;那么#xff0c;如何才能获取这个对象引用#xff0c;以便…处理 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 用来配置网站所使用的 HttpModulehttpModules的子元素 add 用来增加一个新的 HttpModuleclear 将清除前面注册的所有 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 nameonline typecom.aspnet.OnlineUserModule,OnlineUserModule//httpModules对于 IIS 7.0来说需要在配置文件的 system.webServer 配置节中注册 HttpModule。注意此时的配置元素名称变为了 modules。 在 IIS 7.0 中可以为 MapRequestHandlerLogRequest 和 PostLogRequest 事件添加处理程序。只有在 IIS 7.0 集成模式下运行并且与 .NET Framework 3.0 或更高版本一起运行的应用程序才可以支持这些事件。system.webServer modules add nameModuleExample typeSamples.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 runatserver private ListIHttpModule 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 ListCreateDynamicHttpModule _createModuleHandlerList new ListCreateDynamicHttpModule(); public static void RegisterDynamicModule(CreateDynamicHttpModule handler ) { _createModuleHandlerList.Add(handler); } public static ListIHttpModule GetModules() { ListIHttpModule list new ListIHttpModule(); 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 nameOutputCache typeSystem.Web.Caching.OutputCacheModule / add nameSession typeSystem.Web.SessionState.SessionStateModule / add nameWindowsAuthentication typeSystem.Web.Security.WindowsAuthenticationModule / add nameFormsAuthentication typeSystem.Web.Security.FormsAuthenticationModule / add namePassportAuthentication typeSystem.Web.Security.PassportAuthenticationModule / add nameRoleManager typeSystem.Web.Security.RoleManagerModule / add nameUrlAuthorization typeSystem.Web.Security.UrlAuthorizationModule / add nameFileAuthorization typeSystem.Web.Security.FileAuthorizationModule / add nameAnonymousIdentification typeSystem.Web.Security.AnonymousIdentificationModule / add nameProfile typeSystem.Web.Profile.ProfileModule / add nameErrorHandlerModule typeSystem.Web.Mobile.ErrorHandlerModule, System.Web.Mobile, Version4.0.0.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a / add nameServiceModel typeSystem.ServiceModel.Activation.HttpModule, System.ServiceModel.Activation,Version4.0.0.0, Cultureneutral, PublicKeyToken31bf3856ad364e35 / add nameUrlRoutingModule-4.0 typeSystem.Web.Routing.UrlRoutingModule / add nameScriptModule-4.0 typeSystem.Web.Handlers.ScriptModule, System.Web.Extensions, Version4.0.0.0, Cultureneutral, PublicKeyToken31bf3856ad364e35//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(vvs.100).aspx IHttpModule 接口 http://msdn.microsoft.com/zh-cn/library/system.web.ihttpmodule(vvs.80).aspx通过 为知笔记 发布转载于:https://www.cnblogs.com/weapon/archive/2012/12/22/2828746.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918249.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!