本演练演示自定义 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 模块类

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

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

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

  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() { }
}

创建 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>
 
在 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>

创建和注册自定义 HTTP 模块的更多相关文章

  1. 演练:创建和注册自定义 HTTP 模块

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

  2. 创建自定义 HTTP 模块

    本主题中描述的自定义 HTTP 模块阐释了 HTTP 模块的基本功能.在响应下面两个事件时调用该模块:BeginRequest 事件和 EndRequest 事件.这使该模块可以在处理页请求之前和之后 ...

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

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

  4. [BS-13] 创建和注册UITableViewCell及Storyboard和Xib区别

    创建和注册UITableViewCell及Storyboard和Xib区别 // 界面创建完成被调用 - (void)viewDidLoad { [super viewDidLoad]; /** 如果 ...

  5. 自定义HttpFilter模块完善

    自定义HttpFilter模块完善   背景 在12月由于要针对项目做用户操作日志,但不想在每个方法里去增加代码,写入用户日志.因为这样具体的方法违背职责单一的原则,若后期日志内容格式发生变更,或其他 ...

  6. Lua和C++交互 学习记录之八:C++类注册为Lua模块

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...

  7. Lua和C++交互 学习记录之七:C++全局函数注册为Lua模块

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...

  8. WPF 创建自定义控件及自定义事件

    1 创建自定义控件及自定义事件 /// <summary> /// 演示用的自定义控件 /// </summary> public class ExtButton : Butt ...

  9. 组件注册-自定义TypeFilter指定过滤规则

    组件注册-自定义TypeFilter指定过滤规则 4.1 FilterType.ANNOTATION 按照注解方式 4.2 FilterType.ASSIGNABLE_TYPE 按照给定的类型 @Co ...

随机推荐

  1. C#中引用变量是否应该加ref?

    看如下代码:   void Test(T t); void Test(ref T t); 当T是值类型的时候,很好判断,第一种并不能改变方法外变量的值,需要第二种方法才可以.通过查看IL代码,可以看到 ...

  2. 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(2)

    第一部分: http://www.cnblogs.com/cgzl/p/8478993.html 为Domain Model添加约束 前一部分, 我们已经把数据库创建出来了. 那么我们先看看这个数据库 ...

  3. Mysql(六):数据备份、pymysql模块

    一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接 ...

  4. window 环境变量保存位置在哪里?

    注册表-regedit.exe 用户变量: HKEY_CURRENT_USER\Environment 系统变量: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSe ...

  5. JavaScript基础教程2-20160612

    1.JavaScript之操作html元素,Dom Dom是抽象出来的网页对象,需要了解面向对象的思想:调用对象下的方法实现相应的功能 使用JS调用dom来创建标签. //document是网页对象 ...

  6. linux dhcp 设置路由及主机名

    自动获取ipDHCP方式获取ip:dhclient [网络接口]释放通过DHCP获取的ip地址:dhclient -r [网络接口]查看网络接口 ifconfig -a(列出所有接口含禁用的) eth ...

  7. hiredis的安装

    Hiredis客户端下载地址:https://github.com/antirez/hiredis/zipball/master Hiredis安装步骤: tar zxvf antirez-hired ...

  8. R︱Rstudio 1.0版本尝鲜(R notebook、下载链接、sparkR、代码时间测试profile)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 2016年11月1日,RStudio 1.0版 ...

  9. HI3531的DDR3配置流程

    DDR3 初始化配置流程 系统上电之后,必须先完成DDR3 SDRAM 的初始化操作,系统才能访问DDR3 SDRAM.在进行初始化之前需要注意以下几点: 对DDR3 SDRAM 进行上电操作时,需要 ...

  10. Srtuts2实现登录界面(不连接数据库)报错(四)

    1.利用Struts2写一个登录界面,出现以下问题 三月 01, 2014 12:26:18 下午 org.apache.struts2.dispatcher.Dispatcher warn 警告: ...