HttpModule在Web.config的配置和动态配置

学习笔记

ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pipeline中各个HttpModule的处理,最后将HTML发送到客户端浏览器中。
生命周期中涉及到几个非常重要的对象:HttpHandler,HttpModule,IHttpHandlerFactory

题外话

HttpModule和HttpHander

页面处理程序在处理过程中,则要经历HttpModule,HttpHandler的处理:

前者HttpModule用于页面处理前和处理后的一些事件的处理,后者HttpHandler进行真正的页面的处理

如前所说,HttpModule会在页面处理前和后对页面进行处理,所以它不会影响真正的页面请求

HttpModule与IHttpHandler的区别
1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行的,一些是在Handler之后运行的

2.对请求的处理上:
   IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.
   IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.
3.IHttpHandler按照你的请求生成响应的内容,IHttpModule对请求进行预处理,如验证、修改、过滤等等,同时也可以对响应进行处理

在Web.config中配置(经典模式下不可行哦)

1.定义继承了IHttpModule类

2.注册事件

3.在Web.config配置

创建类

public class MyHttpMoudle:IHttpModule
  {

public void Init(HttpApplication context)
      {
          context.BeginRequest += context_BeginRequest;
      }

void context_BeginRequest(object sender, EventArgs e)
      {
          HttpApplication app = sender as HttpApplication;
          if (app != null)
          {
              app.Context.Response.Write("你好啊");

}
      }

public void Dispose()
      {

}
  }

配置

在System.Web节点下

<httpModules>
      <add name="Test" type="Webs复习.Util.MyHttpMoudle"/>
    </httpModules>

这样就将自定义的HttpModule类MyHttpModule插入到了当前web的HttpModule的Pipeline中。 HttpModule主要功能是对Application的各个事件进行截取,在这些事件中完成自己的处理。其实如果自己开发一些项目,直接在 Global.asax中处理已经足够了。如果是开发一个Framework或者是某些方面的组件,需要在事件中添加处理,开发自定义
的 HttpModule,可以避免使用Framework或者组件时,还得手工在Global.asax中添加代码。目前想到的开发自定义HttpModule的用途,有全局的身份/权限验证、自定义网站访问/操作日志的记录、处于管理/调试等目的对站点进行监控追踪等。

动态注册HttpModule

如果我们不想很麻烦的在配置文件里就进行配置,我们可以动态的配置。HttpApplication在初始化的时候会初始化所有配置文件里注册的HttpModules,当然这个也是第一种的,不过还好,第二种动态加载在没有读取配置文件,也就是没有编译之前也可以完成添加HttpModule的功能,因为,读取配置文件是在HttpApplication的处理过程,所以应该能想到如果想添加HttpModule肯定在创建HttpApplication之上,事实上也正是这样。就是在HostingEnvironment这个类中

ASP.NET MVC3发布的时候提供了一个Microsoft.Web.Infrastructure.dll文件,这个文件就是提供了动态注册HttpModule的功能

该程序集的静态类DynamicModuleUtility里面有个RegisterModule是可以将我们定义的HttpModule类添加进去的

不过通过查看方法具体过程是这样的

1。创建实现了IHttpModule的类

2.程序集标记为PreApplicationStartMethodAttribute特性

3.创建一个类,里面包含一个静态方法,注册自定义的类

因为HostingEnvironment的一个方法会遍历应用程序下的所有程序集

判断如果程序集标记为PreApplicationStartMethodAttribute特性,就会执行这个特性里指定的方法(静态方法)

具体实现过程如下

定义类

public class MyHttpMoudle:IHttpModule
  {

public void Init(HttpApplication context)
      {
          context.BeginRequest += context_BeginRequest;
      }

void context_BeginRequest(object sender, EventArgs e)
      {
          HttpApplication app = sender as HttpApplication;
          if (app != null)
          {
              app.Context.Response.Write("自定义HttpModule");

}
      }

public void Dispose()
      {

}
  }

中间类(里面包含了一个静态的注册方法)

public class RegisterModules
{

private static bool hasLoad;
    public static void LoadPre()
    {
        if (!hasLoad)
        {
            hasLoad = true;

//命名空间    Microsoft.Web.Infrastructure.DynamicModuleHelper;

DynamicModuleUtility.RegisterModule(typeof(MyHttpMoudle));
        }
    }
}

最后按照要求添加特性如下

[assembly: PreApplicationStartMethod(typeof(RegisterModules), "LoadPre")]

运行结果

总结:

1、配置HttpModule的方式有两种,一种直接在Web.config添加,第二种 动态的配置,不过需要引入程序集

2、需求不是很大的话我们可以直接使用Global.asax配置

3、动态加载注册自定义HttpModule只能使用一次

时间: 2024-11-03 22:10:44

HttpModule在Web.config的配置和动态配置的相关文章

web.config中sessionState节点的配置方案

web.config中sessionState节点的配置方案 web.config关于sessionState节点的配置方案,sessionState有五种模式:Custom,off,inProc,StateServer,SqlServer. 1.Custom模式  会话状态将使用自定义数据存储区来存储会话状态信息. 2.off模式 从字面上就可以看出这个是关闭模式,如果当前页面不需要session的值,为了减少服务器资源,你可以去掉Session的开销. <sessionState mode=

TP5.1:连接数据库(全局配置、动态配置、DSN配置)

前提: (1)在app\index\controller文件下新建一个名为Connect.php的控制器文件 (2)建立一个名为user_curd数据库,里面有一张user表,表内容为: 通过全局配置连接数据库(建议使用) 1.打开全局配置文件:think\config\databases.php 2.在connect.php中输入: 输入网址:localhost/TP5的安装目录/think/public/index.php/index/connect/connect,结果为: 通过动态配置连

web.config访问走代理的配置

<system.net> <defaultProxy> <proxy bypassonlocal="False" usesystemdefault="True" proxyaddress="http://127.0.0.1:8888" /> </defaultProxy> </system.net>

Asp.net中的web.config配置

目录 Asp.net中的web.config配置... 1 一. 配置文件保存位置... 2 二. 配置文件加载顺序... 2 三. 配置文件节点介绍... 3 1. . 3 2. . 5 3. . 5 4. . 6 . 11 四. 针对配置文件的一些编程操作... 11 1. 运行时进行配置文件的修改... 11 2. 配置节点的加密... 12 web.config是asp.net中保存配置信息(比如数据库连接字符串等)的重要文件.它是基于xml的文本文件方式放在Web应用程序的任何目录中,

web.config配置(转载)

Asp.net中的web.config配置 By Bendon 20101123 目录 Asp.net中的web.config配置... 1 一. 配置文件保存位置... 2 二. 配置文件加载顺序... 2 三. 配置文件节点介绍... 3 1. <configSections>. 3 2. <appSettings>. 5 3. <connectionStrings>. 5 4. <system.web>. 6 <location>. 11

App.config和Web.config配置文件的自定义配置节点

前言 昨天修改代码发现了一个问题,由于自己要在WCF服务接口中添加了一个方法,那么在相应调用的地方进行更新服务就可以了,不料意外发生了,竟然无法更新.左查右查终于发现了问题.App.config配置文件中的配置貌似出现了问题.查找节点发现是如下节点: <configSections> <section name="Test1" type="Demo.Section1,Demo"/> .............. </configSect

配置子目录Web.config使其消除继承,用虚拟目录创建多个网站的方法

ASP.NET提供了强大的Web.config来配置网站,一般来说一个网站只有一个根目录下的Web.config文件,有时候我们希望子目录有着不同的权限或者参数设置,则可以在相应子目录增加一个Web.config配置文件,加入我们新的配置参数.这里需要注意的是,子目录web.config是继承父目录的所有设置的,因此,如果子目录放的是一个和父目录里不一样的网站,就不能共享父目录的配置了,否则很可能会冲突.比如很多主机都提供了将域名绑定到子目录从而能够建立多个网站的方法,以Godaddy的Wind

配置子目录Web.config使其消除继承,iis7.0设置路由

iis7.0设置路由 ,url转向,伪静态 <system.webServer>      <modules runAllManagedModulesForAllRequests="true" />      </system.webServer> 配置子目录Web.config使其消除继承 不用修改根目录的Web.config文件,而是修改子目录的Web.config.假设根目录的Web.config设置了一个名为 BlogEngine的连接字符串

Web.config配置详解

一.认识Web.config文件 Web.config 文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.NET Web 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中.当你通过.NET新建一个Web应用程序后,默认情况下会在根目录自动创建一个默认的 Web.config文件,包括默认的配置设置,所有的子目录都继承它的配置设置.如果你想修改子目录的配置设置,你可以在该子目录下新建一个 Web.config文件.它可以提供除从父目