zoukankan      html  css  js  c++  java
  • 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只能使用一次

  • 相关阅读:
    EntityFramework优缺点
    领导者与管理者的区别
    七个对我最好的职业建议(精简版)
    The best career advice I’ve received
    Difference between Stored Procedure and Function in SQL Server
    2015年上半年一次通过 信息系统项目管理师
    Difference between WCF and Web API and WCF REST and Web Service
    What’s the difference between data mining and data warehousing?
    What is the difference between a Clustered and Non Clustered Index?
    用new创建函数的过程发生了什么
  • 原文地址:https://www.cnblogs.com/ljp-sun/p/4526270.html
Copyright © 2011-2022 走看看