• 深度剖析ASP.NET架构—HttpModule(二)


      前言

        我们在上节讲了使用ISAPI是一种重要的技术,可以让我们扩展服务器的功能,有两个手段实现,一个是ISAPI扩展,一个是ISAPI过滤器,我们下面就来说说其中的这个ISAPI过滤器。

      阅读目录

        一:ISAPI筛选器

        二:HttpModule

        三:HttpModule的实现

        四:HttpModule的运行机制

        五:运行效果

        六:运行效果

      一:ISAPI筛选器

         IIS本身是不支持动态页面的,也就是仅仅支持静态.html页面的内容,对于.asp,.aspx,.php,.java,IIS并不会处理这些标记,IIS会把这些文件当做文本,不做处理发送给客户端,为了解决这种问题,IIS没有这种处理能力,IIS就让别人来处理,就是ISAPI筛选器,它是一个COM组件。

        .asp有它的筛选器asp_isapi,.aspx有它的筛选器aspnet_isapi,php有它对应的筛选器。

        ASP.NET服务注册到IIS的时候,会把每个可以处理的文件扩展名注册到IIS里面(比如:*.aspx,*.ascx),这些*.aspx,*.ascx默认情况下IIS是不知道如何处理的,要是装了ASP.NET以后,要让IIS认识它们,但是IIS还是不认识它们,只不过是把这些*.aspx,*.ascx交给aspnet_isapi.dll来处理了,扩展好了以后,只要你请求.aspx文件,就会自动的跳转到专门的代码处理当中,也就是交给aspnet_isapi.dll处理,aspnet_isapi.dll处理完了以后生成标准HTML代码(比如:你建立了个test.aspx,在test.aspx.cs里面的代码是Response.Write("测试"),那么运行后,会输出“测试”俩字, 这就是标准HTML代码),加入到原有的HTML代码中(比如:你建立了个test.aspx,里面的HTML代码是<body></body>,这就是原有的HTML代码),合起来就是<body>测试</body>,这就是完整的HTML代码,最后把完整的HTML代码返回给IIS,IIS再把HTML代码发给浏览器解释执行,说到这里我们可以看到,IIS只认识静态的HTML代码,对于一些动态的文件都专门交给专门的东西来处理了,.asp是asp_isapi,.aspx是aspnet_isapi等。

        我们看下面这张图安装了ASP.NET环境以后,就把很多扩展名为其他的文件都注册到IIS里面了,其中ASP.NET的环境里需要处理的文件都是由aspnet_isapi来处理的。

        

        

        二:HttpModule

          HttpModule实现了ISAPI Filter过滤器的功能,我们上面提到ISAPI扩展实现有两个手段,一个是ISAPI扩展,一个是ISAPI过滤器,而HttpModule就是ISAPI过滤器这个手段,所以我们可以自己来写HttpModule,它是通过继承自System.Web.IHttpModule接口来进行处理的。

          HttpModule模块是实现了System.Web.IHttpModule接口的.NET组件,这些组件通过在某些事件中注册自身,把自己插入到HTTP请求处理管道,当这些事件发生的时候,ASP.NET调用对请求有兴趣的模块,这样该模块就能处理请求了。

        三:HttpModule的实现

          3.1 编写一个类,该类实现System.Web.IHttpModule接口

          3.2 实现Init方法,并且注册需要的方法

          3.3 实现注册的方法

          

           3.4 在web.config中注册编写的类

             <httpModules>
                <!-- add的意思是将HttpModule类添加到应用程序,name没有讲究的,type有讲究的,逗号前面是命名空间.类名,逗号后面的指的是dll的文件名称不带后缀-->
                <add name="myHttpModule" type="ClassLibrary.CustomHttpModule,ClassLibrary"/>
               </httpModules>

        四:HttpModule的运行机制

          从例子看出来,一上来在Default.aspx运行之前,先运行这个模块里的Init()方法,由于在Init()方法里注册了一个事件处理程序,最终会运行Init()方法里的AuthenticateRequest()事件处理程序。

          这些模块在某些事件中注册自身,把自己插入到ASP.NET请求管道中,当某些事件发生的时候,ASP.NET调用对请求有兴趣的Http模块,这样该模块就能处理请求了。

          总结一句话就是HttpModule通过对HttpApplication对象的一系列事件处理来达到对Http处理管道施加影响,这些事件在HttpModule的Init()方法中注册,事件执行顺序如下。

          

        五:Http请求的处理过程

          从下图中可以看出HttpMoulde贯穿了HttpHandler的前后,分别出现在了HttpHandler之前和之后。

          

        六:运行效果

        我们可以看出,无论我创建无数个页面,只要不带参数请求都输出“用户名或者密码为空,不能登陆”,尽管我的所有*.cs文件里任何代码都没有写,这是因为 app.AuthenticateRequest += new EventHandler(this.AuthenticateRequest);这句代码的事件是鉴定请求到达事件,是一切事件的开始。

        

        

        

  • 相关阅读:

    字符串比较
    String对象的简单方法(特别讲解length()方法的实现。
    Character类
    线性结构应用实例:多项式加法运算
    队列的顺序和链式存储实现
    堆栈用数组和用链表实现
    广义表和多重链表(十字链表)
    powerDesigner的name和comment转化
    jquery-validate
  • 原文地址:https://www.cnblogs.com/menglin2010/p/2309348.html
Copyright © 2020-2023  润新知