HTTP 模块是一个通过实现实现 IHttpModule 接口和处理事件,在每次针对应用程序发出请求时调用的程序集。HTTP 模块作为 ASP.NET 请求管线的一部分调用,能够在整个请求过程中访问生命周期事件。因此,HTTP 模块使我们有机会检查传入和传出的请求,并根据该请求采取操作。甚至我们可以通过实现HTTP模块来参与ASP.NET运行的管理,例如,ASP.NET 提供了 SessionStateModule 来向应用程序提供会话状态服务。    好了,在使用HTTP模块之前,先让我们回顾一下一次请求的生命周期事件:在这里特别提到一点,HTTP 模块不同于 HTTP 处理程序。对于所有的请求和响应都可调用 HTTP 模块,而 HTTP 处理程序仅在响应特定的请求时才运行。
HTTP 模块典型的用法包括:
        安全性。因为您可以检查传入的请求,所以 HTTP 模块可以在请求页、XML Web services 或调用处理程序之前执行自定义的身份验证或其他安全检查。
        统计信息和日志记录。因为 HTTP 模块是在每次请求时调用的,所以,您可以将请求统计信息和日志记录信息收集到一个集中的模块中,而不是收集到各页中。自定义的页眉或页脚。因为您可以修改出站响应,所以可以在每一个页面或 XML Web services 响应中注入内容,如自定义的标头信息。
        模块针对所有的请求运行,这与 ISAPI 筛选器类似。但是它们是用托管代码编写的,而且可以与 ASP.NET 应用程序的生命周期完全集成。编写 ASP.NET   HttpModule 的一般过程为:
实现 IHttpModule 接口.
处理 Init 方法并为所需事件进行注册。
处理该事件。
如果必须进行清理,还可根据需要实现 Dispose 方法。
在 Web.config 中注册该模块。

下面,咱们通过一个例子体会一下Http模块的强大。该例子实现在每个页面中添加页头和页脚,效果图如下:

实现步骤

1. 在 App_Code 目录中,创建一个名为 HelloWorldModule.cs的类文件。如果网站还没有 App_Code 文件夹,请在该站点的根目录下创建这样的一个文件夹。

2. 类文件全部代码如下:

///</summary>
///</summary>
class HelloWorldModule : IHttpModule
///<summary>
///
///<param name="application"></param>
public void Init(HttpApplication application)
    {
        application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
        application.EndRequest += (new EventHandler(this.Application_EndRequest));
    }
///<summary>
///
///<param name="source"></param>
///<param name="e"></param>
private void Application_BeginRequest(Object source, EventArgs e)
    {
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;
        context.Response.Write("<h1><font color=red>HTTP
    }
///<summary>
/// ///</summary>
///<param name="source"></param>
///<param name="e"></param>
private void Application_EndRequest(Object source, EventArgs e)
    {
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;
        context.Response.Write("<hr><h1><font color=red>HTTP
    }

3. 在 Web.config 文件中注册该模块

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

4. 测试自定义 HTTP 模块

单独建立一页,在页面中输入“页面正文”,模拟页面内容。运行,看到了吧?

另外举一个常用例子,就是登录验证的问题,如果用户没有登录或者没有权限,就特别处理,比如跳转到错误页面或者登录页面。

实现步骤

1. 在 App_Code 目录中,创建一个名为 LoginModule.cs的类文件。如果网站还没有 App_Code 文件夹,请在该站点的根目录下创建这样的一个文件夹。

2. 类文件全部代码如下:

为了节省篇幅,登录与权限验证只是用了null判断表示一下。

void Init(HttpApplication application)
    {
        application.AcquireRequestState += (new EventHandler(this.Application_AcquireRequestState));
    }
private void Application_AcquireRequestState(Object source, EventArgs e)
    {
        HttpApplication Application = (HttpApplication)source;
if (Application.Context.Session["User"] == null)
        {
            Application.Context.Server.Transfer("ErrorPage.aspx");//        }       
    }

3. 在 Web.config 文件中注册该模块

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

4. 再次测试一下吧。

非常简单的例子,但是已经能说明HTTP模块的基本使用了。

http://www.cnblogs.com/tuyile006/archive/2007/09/10/888208.html

使用HTTP模块扩展 ASP.NET 处理相关推荐

  1. 【译】CodeIgniter HMVC模块扩展使用文档

    CodeIgniter HMVC扩展说明 原文地址:Modular Extensions - HMVC 模块扩展--HMVC 模块扩展让CodeIgniter框架模块化.模块是一组独立的组件(通常有模 ...

  2. 如何用C++ 写Python模块扩展(一)

    最近做一个小软件需要用到虚拟摄像头,在网上找了找虚拟摄像头软件 发现 Vcam 软件有个API 可以用,有API当然是最好的啦,但是这个API只有C++和C#的.都说 "人生苦短,得用pyt ...

  3. Iptables防火墙iprange模块扩展匹配规则

    Iptables防火墙iprange模块扩展匹配规则 iprange模块可以同时设置多个IP或者设置IP的某一段连续的范围,通过iprange模块可以对多个来源地址同时设置策略. iprange模块的 ...

  4. 2021-05-26 芯旺微推出车规新品,车身控制单元模块扩展到70%

    张通社获悉,5月25日,芯旺微电子在广州国际汽车技术展上重磅推出了车规新品KF32A156,主要应用于车身车载模块控制,拥有512KB Flash.64KB RAM,支持2路CANFD,同时工作范围达 ...

  5. python ctypes模块安装_ctypes模块扩展python

    文章1 前言 朋友的公司是做GPS的,上周联系到我要帮做个程序把他们平台的车辆定位跟踪数据和省里的平台对接.看一下官方提供的三个文档,洋洋洒洒共一百多页,一大堆协议的定义甚是齐全,好在官方的文件中也带 ...

  6. Python学习笔记(迭代、模块扩展、GUI 、编码处理等)

    PythonIDLE中的编码处理 http://www.tuicool.com/articles/NbyEBr 原文标题:Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来 ...

  7. python用什么来写模块-Python 3.1 用C写模块 扩展(序)

    注意.此方式只在win下用vc2008成功.其他编译器/环境未试验: 1. 在vc中建立一个dll的project. 假定我们的module的名字是mytest.那么我们的dll名字就是mytest. ...

  8. 蝉知门户系统迁移到SAE平台-File模块扩展

    安装完成后虽然可以正常浏览网站了,但是由于upload目录没有写权限,还需要对文件管理模块进行修改以适应sae的环境,经过导师指点查看了禅道sae3.0版本的迁移方案,初步确定修改思路.也使用了部分原 ...

  9. 【nginx 扩容及常用模块扩展】

    Nginx高级 第一部分:扩容 通过扩容提升整体吞吐量 1.单机垂直扩容:硬件资源增加 云服务资源增加 整机:IBM.浪潮.DELL.HP等 CPU/主板:更新到主流 网卡:10G/40G网卡 磁盘: ...

最新文章

  1. Resource entery xx is already defined
  2. Oracle的悲观锁和乐观锁
  3. Jupyter notebook 多行注释 输出注释的文本
  4. php nsdata,在iPhone中加密nsdata并在php中解密
  5. 记录备份2020-07-13 - 清除多余无用的Windows10环境变量
  6. android获取图片方向并旋转,Android 判断imageview角度并旋转
  7. 【 全干货 】5 分钟带你看懂 Docker ! 1
  8. 如何linux安装apache服务器,Linux中如何安装Apache服务器
  9. MultCloud – 支持数据互传的网盘管理
  10. HTML - 'MARQUEE'
  11. GoAhead2.5源代码分析之10-web server主程序(main.c)
  12. Swift和Object-C的区别和优缺点
  13. 有重复组合公式及其证明方法
  14. 来,给产品狗起个正儿八经的名字!
  15. 如何在latex中用tikz画一把“圣剑“
  16. 二分查找算法应用-实现求平方根函数
  17. thinkpad申请恢复盘_移动硬盘坏了是什么体验?(含数据恢复和换货全过程)
  18. 《格鲁夫给经理人的第一课》
  19. 数据挖掘算法原理与实践:数据预处理
  20. bitmap亮度的互转,RBG获取等

热门文章

  1. vi常用命令以及 冒号输入
  2. C# 里怎样得到当前执行的函数名,当前代码行,源代码文件名。
  3. 正则表达式简介及在C++11中的简单使用
  4. Linux中获取当前程序路径的方法
  5. 在对话框中应用CScrollView显示图像
  6. 服务器怎么设置网站写入权限,如何设置服务器写入权限设置方法
  7. php 重新载入类文件夹,php-如何配置Behat从应用程序特定文件夹自动加载类
  8. git 强制推送_Git 常用命令清单,掌握这些,轻松驾驭版本管理
  9. db2 linux 数据导出_linux db2 导出数据库
  10. Mybatis入门:3(动态sql)