本演练演示自定义 HTTP 模块的基本功能。 对于每个请求,都需要调用 HTTP 模块以响应 BeginRequest 和 EndRequest 事件。 因此,该模块在处理请求之前和之后运行。

如果 ASP.NET 应用程序是在 IIS 6.0 下运行,则可以使用 HTTP 模块自定义针对 ASP.NET 所提供的资源的请求。 这些资源包括 ASP.NET Web 页(.aspx 文件)、Web 服务(.asmx 文件)、ASP.NET 处理程序(.ashx 文件)和您已经映射到 ASP.NET 的任何文件类型。 如果 ASP.NET 应用程序是在 IIS 7.0 下运行,则可以使用 HTTP 模块自定义针对 IIS 所提供的任何资源的请求。 这不仅包括 ASP.NET 资源,还包括 HTML 文件(.htm 或 .html 文件)、图形文件等等。有关更多信息,请参见 IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述和 IIS 7.0 的 ASP.NET 应用程序生命周期概述。

本主题中的示例模块在任何 HTTP 请求的开始阶段都向所请求的 ASP.NET 网页中添加一个消息。 在页面得到处理之后,它将添加另外一个消息。 该模块还包含相应的代码,以确保它不会向针对任何其他文件类型的请求中添加文本。

每个事件处理程序都编写为该模块的私有方法。 在引发已注册的事件时,ASP.NET 将调用该模块中适当的处理程序,以便将信息写入 ASP.NET 网页。

本演练演示以下任务:

  • 如何创建 HTTP 模块的代码。

  • 如何在 Web.config 文件中注册该模块。

前提条件

若要完成本演练,您需要:

  • Visual Studio或 Visual Web Developer。

本演练还假定您使用的是 IIS 6.0 或 IIS 7.0。 但是,即使您运行的是 ASP.NET 开发服务器,您也可以看到该模块的功能。

创建自定义 HTTP 模块类

首先,您需要创建一个类文件以实现该模块。

创建自定义 HTTP 模块类

  1. 创建一个 ASP.NET 网站并将它命名为 Handler。

    注意

    可以为网站选择任何名称。

  2. 如果网站还没有 App_Code 文件夹,请在该站点的根目录下创建一个这样的文件夹。

  3. 在 App_Code 目录中,创建一个名为 HelloWorldModule.vb(对于 Visual Basic)或名为 HelloWorldModule.cs(对于 C#)的类文件。

    注意

    另外,如果您使用的是 Visual Studio(而不是 Visual Web Developer 速成版),则可以将 HelloWorldModule 创建为一个类库项目,对它进行编译,并将生成的程序集放到 Web 应用程序的 Bin 目录中。

  4. 将下面的代码添加到类文件中:

    using System;
    using System.Web;
    public class HelloWorldModule : IHttpModule
    {public HelloWorldModule(){}public String ModuleName{get { return "HelloWorldModule"; }}// In the Init function, register for HttpApplication // events by adding your handlers.public void Init(HttpApplication application){application.BeginRequest += (new EventHandler(this.Application_BeginRequest));application.EndRequest += (new EventHandler(this.Application_EndRequest));}private void Application_BeginRequest(Object source, EventArgs e){// Create HttpApplication and HttpContext objects to access// request and response properties.HttpApplication application = (HttpApplication)source;HttpContext context = application.Context;string filePath = context.Request.FilePath;string fileExtension = VirtualPathUtility.GetExtension(filePath);if (fileExtension.Equals(".aspx")){context.Response.Write("<h1><font color=red>" +"HelloWorldModule: Beginning of Request" +"</font></h1><hr>");}}private void Application_EndRequest(Object source, EventArgs e){HttpApplication application = (HttpApplication)source;HttpContext context = application.Context;string filePath = context.Request.FilePath;string fileExtension = VirtualPathUtility.GetExtension(filePath);if (fileExtension.Equals(".aspx")){context.Response.Write("<hr><h1><font color=red>" +"HelloWorldModule: End of Request</font></h1>");}}public void Dispose() { }
    }

  5. 保存并关闭类文件。

  6. 在“生成”菜单上单击“生成网站”。

    如果网站未生成,请更正存在的任何问题。 必须对自定义 HTTP 模块进行编译,否则无法注册该模块。

在 IIS 6.0 和 IIS 7.0 经典模式中注册 HTTP 模块

创建 HelloWorldModule 类之后,可以通过在 Web.config 文件中创建一个项来注册该模块。 通过注册 HTTP 模块,可使其能够订阅请求管道通知。

在 IIS 7.0 中,应用程序可以在经典模式或集成模式下运行。 在经典模式下,请求的处理方式与在 IIS 6.0 中基本相同。 在集成模式下,IIS 7.0 使用管道(管道使其可以与 ASP.NET 共享请求、模块和其他功能)来管理请求。

在 IIS 7.0 经典模式和 IIS 7.0 集成模式下,注册模块的过程有所不同。 本节描述与 IIS 6.0 和 IIS 7.0 经典模式相对应的过程。 下一节将描述用于注册在 IIS 7.0 集成模式下运行的模块的过程。

为 IIS 6.0 和在经典模式下运行的 IIS 7.0 注册模块

  1. 如果网站还没有 Web.config 文件,请在该站点的根目录下创建一个这样的文件。

  2. 将下面突出显示的代码添加到该 Web.config 文件中:

    <configuration><system.web><httpModules><add name="HelloWorldModule" type="HelloWorldModule"/></httpModules></system.web>
    </configuration>

    这段代码用 HelloWorldModule 的类名和模块名注册该模块。

在 IIS7.0 集成模式下注册 HTTP 模块

在 IIS 7.0 集成模式下注册模块的过程与 IIS 7.0 经典模式下的注册过程稍有不同。

为在集成模式下运行的 IIS7.0 注册模块

  1. 如果网站还没有 Web.config 文件,请在该站点的根目录下创建一个这样的文件。

  2. 将下面突出显示的代码添加到该 Web.config 文件中:

    <configuration><system.webServer><modules><add name="HelloWorldModule" type="HelloWorldModule"/></modules></system.webServer>
    </configuration>

    注意

    您还可以使用 IIS 管理器注册模块。 有关更多信息,请参见 Configuring Modules in IIS 7.0(在 IIS 7.0 中配置模块)。

    这段代码用 HelloWorldModule 的类名和模块名注册该模块。

测试自定义 HTTP 模块

创建并注册自定义 HTTP 模块后,可以对它进行测试。

测试自定义 HTTP 模块

  1. 在应用程序中添加一个新的 ASP.NET 页面。

  2. 右击刚添加的页,选择“在浏览器中查看”。

    HTTP 模块会将一个字符串追加到响应的开头和末尾。 在对其扩展名已分配给 ASP.NET 的文件进行任何请求的过程中,该模块都将自动运行。 有关更多信息,请参见 HTTP 处理程序和 HTTP 模块概述。

转载于:https://www.cnblogs.com/ChineseMoonGod/p/5379215.html

演练:创建和注册自定义 HTTP 模块相关推荐

  1. html中模块怎么创建,在Joomla中创建一个自定义HTML模块,不显示

    我有几个Joomla!我感到有信心的网站.我的Joomla!网站有一个artisteer模板. 我最近做了一个"戳出"的图片,突出了纸张的边缘,并展示了一个android" ...

  2. angular 自定义组件_如何创建Angular 6自定义元素和Web组件

    angular 自定义组件 by Prateek Mishra 通过Prateek Mishra 如何创建Angular 6自定义元素和Web组件 (How to create Angular 6 C ...

  3. TensorFlow中的设备管理——Device的创建与注册机制

    背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 作为一款优秀的异构深度学习算法框架,TensorFlow可以在多种设备上运行算 ...

  4. 实现第一个自定义nginx模块

    实现第一个自定义nginx模块 下面的过程详细记录了如何实现第一个自定义的nginx模块,对nginx入门者包括我很有参考价值,特记录如下. 前提 假定以root身份已经在CentOS 6.8 x86 ...

  5. Ionic中自定义公共模块以及在自定义模块中使用ionic内置模块

    场景 Ionic介绍以及搭建环境.新建和运行项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/106308166 在上面搭建起 ...

  6. JBoss AS 7:自定义登录模块

    JBoss AS 7很整洁,但是仍然缺少文档(错误消息没有那么有用). 这篇文章总结了如何创建自己的兼容JavaEE的登录模块,以对部署在JBoss AS上的Web应用程序的用户进行身份验证. 提供了 ...

  7. ios 自定义字体_如何仅用几行代码在iOS应用中创建一致的自定义字体

    ios 自定义字体 by Yuichi Fujiki 藤木雄一 In this article, you'll learn how to create a unified custom look th ...

  8. 使用php创建一个注册表单,如何实现一个简单的注册表单

    创建一个注册表单是非常容易的 - 它事实上意味着,你只需要创建一个表单,表单将更新一些User的模型对象(这个例子是一个Doctrine实体)并保存它. 受欢迎的FOSUserBundle 提供了一个 ...

  9. Qt自定义QML模块

    自定义QML模块 含义为将常用风格的Button,Text,RadioButton,或者自定义的控件作为一个控件进行使用,节省代码. 优点: 代码简洁,减少重复代码 自定义的控件进行封装重复使用 可以 ...

最新文章

  1. 2017-2018-1 20155202 《信息安全系统设计基础》第9周学习总结
  2. 【iOS】Mapkit的使用:地图显示、定位、大头针、气泡等
  3. Web Service和Servlet的区别
  4. 每天学习点--------第五天(2017-10-9) 摘要: 常用的集合
  5. UE4手册中文翻译速查表
  6. 金山云纳斯达克敲钟上市,雷军手中又多了家上市公司
  7. 关于Element UI中页面样式小问题
  8. 如何一个动态创建对象?
  9. 数据库性能Quest Performance Analysis Overview
  10. Oracle问题小记五:服务启动-索引-子查询-分页存储过程
  11. 搭建自己的以图搜图系统 (一):10 行代码以图搜图
  12. 红帽linux安装intel(R) wifi link 5100 AGN总结
  13. 小白到高级UI设计师,如何实现完美蜕变?
  14. sql语句练习题或面试题
  15. 【渝粤题库】陕西师范大学165205 组织设计与人力资源规划 作业(专升本)
  16. 《秋波媚·七月十六日晚登高兴亭望长安南山》 陆游
  17. How MonoRail works
  18. c语言中%加字母是啥意思,%C是什么意思? C语言中%c,%s分别代表什么意思?
  19. EBYTE E103-W02 WIFI模块配置总结(TCP+UDP+HTTP+云透传)
  20. CNS无线电信号覆盖分析系统

热门文章

  1. 百度地图搜索返回地址中经纬度为null
  2. android网络获取经纬,Android中透过GPS或NetWork获取当前位置的经纬度
  3. Explain执行计划
  4. apache环境下配置服务器支持https
  5. 由一棵二叉树的先序序列和中序序列可唯一确定这棵二叉树
  6. C#利用ICSharpCode.SharpZipLib.dll压缩文件和解压文件
  7. maven的pom报plugins错误的解决方法.
  8. iOS11隐藏导航条后顶部有20单位的空白或者pop页面时明显感觉前一个页面有上移的异常动画的解决办法。
  9. java.util.ConcurrentModificationException异常原因及解决方法
  10. Maven国内阿里镜像(Maven下载慢的解决方法)