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

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

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

    webConfig中的session超时详细设置 我们在webConfig中设置Session超时的时候,如果最后发行的地址是远程服务器,我们很多不是必须的属性并不用设置,如果设之后,倒不能让 ses ...

  2. log4net保存到数据库系列一:WebConfig中配置log4net

    园子里面有很多关于log4net保存到数据库的帖子,但是要动手操作还是比较不易,从头开始学习log4net数据库日志 一.WebConfig中配置log4net 二.独立配置文件中配置log4net ...

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

    一.64位系统中的注册表 以 LocalMachine 中的启动项为例: 64位应用的注册表位置还是在: SOFTWARE\Microsoft\Windows\CurrentVersion\Run 而 ...

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

    在spring中,所有的bean都是由BeanFactory进行管理的.下面是BeanFactory的类体系结构: 我们清楚的看到,DefaultListableBeanFactory继承了BeanF ...

  5. asp.net中通过注册表来检测是否安装Office(迅雷/QQ是否已安装)

    原文  asp.net中通过注册表来检测是否安装Office(迅雷/QQ是否已安装) 检测Office是否安装以及获取安装 路径 及安装版本  代码如下 复制代码 #region 检测Office是否 ...

  6. Asp.Net webconfig中使用configSections的用法

    最近闲来无事,研究研究公司的框架,无意中打开了webconfig页面,发现了一个我不认识的节点<configSections></configSections>,于是百度之,大 ...

  7. webConfig中System.Web 和 System.WebServer节点读取

    webConfig中System.Web 和 System.WebServer节点读取根据应用程序池中托管管道模式有关. 在网站发布到服务器的IIS上时,应用程序池中托管管道模式分为经典和集成. Sy ...

  8. EF获取DbContext中已注册的所有实体类型

    /// <summary> /// 获取DbContext中已注册的实体类型 /// </summary> /// <typeparam name="T&quo ...

  9. springCloud中的注册中心Nacos

    springCloud中的注册中心Nacos 三个模块: 1.注册中心 2.服务提供者(生产者) 提供服务 3.服务消费者(消费者)调用服务 流程:消费者和生产者都要向注册中心注册,注册的是二者中服务 ...

随机推荐

  1. Gt9xx芯片,在规格书+Linux驱动的基础上,移植为USB裸机经验。直接用开发板,不去碰硬件的坑。

    1,用内核代码和规格书来印证数据格式: //命令3字节,IC地址 u8 end_cmd[] = {GTP_READ_COOR_ADDR >> , GTP_READ_COOR_ADDR &a ...

  2. Java:静态代理 and 动态代理

    代理模式是常用的设计模式,其特征是代理类与委托类具有相同的接口,在具体实现上,有静态代理和动态代理之分.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并 ...

  3. Gitlab的develop角色的人没有权限无法提交的问题解决方案

    问题 事情是这样的,最近跟几位同事搞一些东西,打算在Gitlab上建一个仓库,然后协同开发. 我建好仓库,将其他几位同事添加进来,角色分配为Develop. 之后提交初始代码到master分支后,他们 ...

  4. WPF开发时光之痕日记本(一)——富文本编辑器

    本篇给大家推荐一个 WPF 版的富文本编辑器,SmithHtmlEditor,具体网址大家可以找一找,我在这个编辑器的基础上修改了界面,增加了一些功能,模仿了kindeditor 的界面,鉴于自己现在 ...

  5. android之文件存储和读取

    一.权限问题 手机中存储空间分为ROM和SDcard,ROM中放着操作系统以及我们安装的APP,而sdcard中一般放置着我们APP产生的数据.当然,Android也为每个APP在ROM中创建一个数据 ...

  6. WCF 入门(15)

    前言 度过了一个阳光明媚的周末. 一个阴霾的周日夜晚. 第15集 WCF里面的异常处理(1)  Exception handling in WCF 大致看了一下,这个WCF视频里面总共有6集,这个是第 ...

  7. jQuery使用之(二)设置元素的样式

    css是页面不能分隔的部分,jQuery中也提供了一些css相关的实用的办法.前面章节中有使用过 addClass()为元素添加css样式风格.本节主要介绍jQuery如何设置页面的样式风格.包括添加 ...

  8. jQuery使用之(三)处理页面的元素

    对于页面的元素,在DOM编程中可以通过各种查询.修改手段进行管理,非常麻烦.jQuery提供了一整套的方法来处理页面的元素.包括元素的内容.复制.移动和替换等.本节将介绍一些常用的内容. 1.直接获取 ...

  9. Grovvy初识

    1.Groovy和Java对比 Groovy的松散的语法允许省略分号和修饰符 除非另行指定,Grovvy的所有内容都为public Grovvy允许定义简单脚本,同时无需定义正规的class对象 Gr ...

  10. web.xml中配置固定数据

    在web.xml单个servlet中配置的数据的存取 存: <servlet> <description>This is the description of my J2EE ...