您的位置:首页 > 理论基础 > 计算机网络

ASP.NET温故而知新学习系列之深度剖析ASP.NET架构—HttpModule(二)

2012-01-04 18:22 645 查看
前言
  我们在上节讲了使用ISAPI是一种重要的技术,可以让我们扩展服务器的功能,有两个手段实现,一个是ISAPI扩展,一个是ISAPI过滤器,我们下面就来说说其中的这个ISAPI过滤器。

  一: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,它是通过继承自IHttpModule接口来进行处理的。

  三:HttpModule的实现

  3.1 编写一个类,该类实现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()方法中注册,事件执行顺序如下

  




  五:运行效果

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

  


  


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐