学习笔记

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只能使用一次