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应用不需要全局模块,则可以将其禁用。

时间: 2024-08-07 08:35:57

IHttpModule在webconfig中的注册的相关文章

c# webConfig中的session超时详细设置

webConfig中的session超时详细设置 我们在webConfig中设置Session超时的时候,如果最后发行的地址是远程服务器,我们很多不是必须的属性并不用设置,如果设之后,倒不能让 session超时奏效.我在做现在的程序的时候,就是这样,写sessionState的时候,按照如下的方式设置之后,session设置的 timeout时间不能够起作用:但是不用了一些属性之后,就能够起作用了. 服务器上发行后不能起作用的设置: <sessionState mode="InProc&

Asp.Net webconfig中使用configSections的用法

最近闲来无事,研究研究公司的框架,无意中打开了webconfig页面,发现了一个我不认识的节点<configSections></configSections>,于是百度之,大致的了解了它的作用,还是蛮重要的!!!但是我居然不知道!!!这是最骚的,瞬间觉得自己还是太年轻了!!!好了,不BB了,言归正传了. 1.configSections有什么用 大家都知道,webconfig文件中不能随意的添加节点,稍有不慎,浏览器就GG了,报错了,玩完了,整个人都不好了,(当然仅限于配置文件,

(spring-第8回【IoC基础篇】)BeanDefinition在IoC容器中的注册

在spring中,所有的bean都是由BeanFactory进行管理的.下面是BeanFactory的类体系结构: 我们清楚的看到,DefaultListableBeanFactory继承了BeanFactory的优良传统,同时又实现了BeanDefinitionRegistry这个注册器,那么无疑,BeanDefinition在容器中的注册任务,非他莫属.事实上,DefaultListableBeanFactory拥有一个私有的BeanDefinitonMap属性,这个属性是个哈希Map,通过

设置项目中控件的样式:webconfig中system.web下的Pages节点

关于system.web下面的Pages节点的详细说明,MSDN上面有,看这里. 这个Pages节点下的theme属性可以设置项目中控件的样式,直接引用skin文件来设置样式,不用在每个页面中添加,可以保证页面风格的一致性: <pages theme= "defaultTheme" /> 关于theme的添加: 创建主题完毕之后,在App_Themes文件夹下创建自己的样式,pages里面就可以直接使用了. 当然,如果要在某个页面中添加自定义的样式,可以在aspx中指定pa

64位Windows操作系统中的注册表

x64系统上有x64.x86两种注册表,记录下. 64 位Windows系统中的注册表分为 32 位注册表项和 64 位注册表项,许多 32 位注册表项与其相应的 64 位注册表项同名. 在64位版本系统的注册表编辑器中,32 位注册表项显示在以下注册表项下: HKEY_LOCAL_MACHINE\Software\WOW6432Node 使用默认的 64 位版本注册表编辑器%systemroot%\Syswow64\regedt.exe,可以查看或编辑 64 位和 32 位的注册表项和项值.

无法读取此系统上以前注册的服务器的列表。请在“已注册的服务器”窗口中重新注册您的服务器

环境: 服务器系统: 数据库版本:Microsoft SQL Server 2008 R2 错误提示如下图: 截图来自:点击打开链接 详细错误信息: 有关调用实时(JIT)调试而不是此对话框的详细信息, 请参见此消息的结尾. ************** 异常文本 ************** Microsoft.SqlServer.Management.RegisteredServers.RegisteredServerException: 无法读取此系统上以前注册的服务器的列表.请在"已注册

webconfig中的httpRunTime属性

1.在webconfig中httpconfig属性只能出现一次 配置httpRunTime也可以让FileUpload上传更大的文件,不过设置太大了会因用户将大量文件传递到该服务器而导致的拒绝服务攻击(属性有说明) <httpRuntime> <httpRuntime useFullyQualifiedRedirectUrl="true|false" maxRequestLength="size in kbytes" executionTimeou

使用.NET 4.0+ 操作64位系统中的注册表

一.64位系统中的注册表 以 LocalMachine 中的启动项为例: 64位应用的注册表位置还是在: SOFTWARE\Microsoft\Windows\CurrentVersion\Run 而 32位应用的注册表位置却是在: SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run 二.在.NET4.0以前(不含4.0)操作注册表的方法 RegistryKey hklm = Registry.LocalMachine; Regis

Ms和W3c中事件注册中的this问题

Ms中的事件注册: 1 ele.attachEvent('on' + type, fnHandler) W3c中事件注册: 1 ele.addEventListener(type, fnHandler, false) ?有时我们要在事件注册的函数引用里,引用调用该事件监听器的当前对象 如果是W3c可以直接用this,形如: 1 2 3 function fnHandler(){     console.log(this); } fnHandler中的this就相当于ele了 但是在IE中是不行的