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


    学习笔记

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

    题外话

    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")]

    运行结果

    image

    总结:

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

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

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

  • 相关阅读:
    网站统计中的数据收集原理及实现
    启动hadoop报ERROR org.apache.hadoop.hdfs.server.namenode.FSImage: Failed to load image from FSImageFile
    淘宝(大数据库应用)--转载
    MapReduce作业的map task和reduce task调度参数
    Spark和Hadoop作业之间的区别
    分析MapReduce执行过程
    MapReduce框架Partitioner分区方法
    LVS+keepalived实现负载均衡
    Tomcat 详解
    linux Tomcat restart脚本简单版
  • 原文地址:https://www.cnblogs.com/ljp-sun/p/4526270.html
Copyright © 2020-2023  润新知