背景: 一个请求在到达处理器时 可能需要做很多重复的工作 比如使用固定的算法推算出用户id 角色   如果在应用程序各处做重复解析 会产生大量代码冗余 还有能想到的诸如记录访问者 应用日志 统计流量 等等....

自定义作用: asp.net 框架设计时 除了提供如 mvc webfrom 等高层次框架 还提供了底层接口 如Ihttphandler Ihttpmodule 通过重新实现这些接口定制符合自己业务需要的应用程序 可以节省一些重复工作 通过统一的管道进行处理 更有利于代码结构不复杂化

第一步:

创建一个cs文件 继承自IHttpModule

实现IHttpModule的init方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace WebApplication1
{ internal class myModule : IHttpModule
{ public void Init(HttpApplication app)
{
app.BeginRequest += new EventHandler(app_BeginRequest);
} void app_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
app.Response.Write("玩一下");
} public void Dispose()
{
}
}
}

  以上代码是实现了一个IHttpModule的类 它的功能是向管道BeginRequest事件添加一个调用函数(可以有多个 进行多播调用) 该事件是进入管道的第一个事件 在request初始化后调用

第二步:

在web.config文件中指定当前HttpAppliation使用的module

iis6级以下版本在httpModules节点下添加子节点      <!--<add name="myModule" type="WebApplication1.myModule"/>-->

我这里使用的是iis7以上版本 添加子节点到  <add name="myModule" type="WebApplication1.myModule"/> 到system.webServer下子节点modules下

运行效果

  1. BeginRequest                #发出信号表示创建任何给定的新请求。 此事件始终被引发,并且始终是请求处理期间发生的第一个事件
  2. AuthenticateRequest         #发出信号表示配置的身份验证机制已对当前请求进行了身份验证。 订阅 AuthenticateRequest 事件可确保在处理附加模块或事件处理程序之前对请求进行身份验证
  3. PostAuthenticateRequest     #预订 PostAuthenticateRequest 事件的功能可以访问由 PostAuthenticateRequest 处理的任何数据
  4. AuthorizeRequest            #发出信号表示 ASP.NET 已对当前请求进行了授权。 订阅 AuthorizeRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证和授权
  5. PostAuthorizeRequest        #发出信号表示 ASP.NET 已对当前请求进行了授权。 订阅 PostAuthorizeRequest 事件可确保在处理附加的模块或处理程序之前对请求进行身份验证和授权
  6. ResolveRequestCache         #引发这个事件来决定是否可以使用从输出缓冲返回的内容来结束请求。这依赖于Web应用程序的输出缓冲时怎样设置的
  7. PostResolveRequestCache     #在 ASP.NET 跳过当前事件处理程序的执行并允许缓存模块满足来自缓存的请求时发生
  8. MapRequestHandler           #ASP.NET 基础结构使用 MapRequestHandler 事件来确定用于当前请求的请求处理程序
  9. PostMapRequestHandler       #在 ASP.NET 已将当前请求映射到相应的事件处理程序时发生
  10. AcquireRequestState         #当 ASP.NET 获取与当前请求关联的当前状态(如会话状态)时发生
  11. PostAcquireRequestState     #预订 AcquireRequestState 事件的功能可以访问由 PostAcquireRequestState 处理的任何数据
  12. PreRequestHandlerExecute    #在ASP.NET开始执行HTTP请求的处理程序之前引发这个事件。在这个事件之后,ASP.NET 把该请求转发给适当的HTTP处理程序
  13. PostRequestHandlerExecute   #在 ASP.NET 事件处理程序(例如,某页或某个 XML Web service)执行完毕时发生
  14. ReleaseRequestState         #在 ASP.NET 执行完所有请求事件处理程序后发生。 该事件将使状态模块保存当前状态数据
  15. PostReleaseRequestState     #在 ASP.NET 已完成所有请求事件处理程序的执行并且请求状态数据已存储时发生
  16. UpdateRequestCache          #当 ASP.NET 执行完事件处理程序以使缓存模块存储将用于从缓存为后续请求提供服务的响应时发生
  17. PostUpdateRequestCache      #在 ASP.NET 完成缓存模块的更新并存储了用于从缓存中为后续请求提供服务的响应后,发生此事件
  18. OnLogRequest                #恰好在 ASP.NET 为当前请求执行任何记录之前发生,即使发生错误,也会引发 LogRequest 事件
  19. PostLogRequest              #在 ASP.NET 处理完 LogRequest 事件的所有事件处理程序后发生
  20. EndRequest                  #在 ASP.NET 响应请求时作为 HTTP 执行管线链中的最后一个事件发生
  21. PreSendRequestContent       #恰好在 ASP.NET 向客户端发送内容之前发生,可能发生多次
  22. PreSendRequestHeaders       #恰好在 ASP.NET 向客户端发送 HTTP 标头之前发生
  23. RequestCompleted            #在任何托管模块和处理程序执行后,它使模块清理资源

以上是可以注册的事件列表 执行顺序与列表顺序相同

访问一个页面的过程中,依次触发23个事件,HttpModule可订阅的事件个数为25个, Error事件在发生错误的情况下执行 Disposed在会话结束后触发。

ASP.Net 自定义HttpModule注册管道事件的更多相关文章

  1. ASP.NET机制详细的管道事件流程(转)

    ASP.NET机制详细的管道事件流程 第一:浏览器向服务器发送请求. 1)浏览器向iis服务器发送请求网址的域名,根据http协议封装成请求报文,通过dns解析请求的ip地址,接着通过socket与i ...

  2. ASP.NET MVC自定义Module记录管道事件执行顺序

    1. 在Visual Studio 新建项目,模板为空,下面结构选择MVC. 2. 在项目中新建一个类MyModule,实现IHttpModule接口 namespace SimpleApp.Infr ...

  3. ASP.NET 生命周期及管道事件

    Client(发送报文:请求行+请求头+空行+请求体) <------ Http 协议 ------> Server,由 Http.sys 监听 Http 请求 -> WAS+Met ...

  4. Asp.Net 自定义 httpmodel 中间件 管道

    https://msdn.microsoft.com/en-us/library/aa719858(v=vs.71).aspx http://www.cnblogs.com/jimmyzhang/ar ...

  5. ASP.NET 管道事件与HttpModule, HttpHandler简单理解 -摘自网络

    第一部分:转载自Artech  IIS与ASP.NET管道 ASP.NET管道 以IIS 6.0为例,在工作进程w3wp.exe中,利用Aspnet_ispai.dll加载.NET运行时(如果.NET ...

  6. Asp.Net 管道事件注册/HttpApplication事件注册

    一.HttpApplication简介 在HttpRuntime创建了HttpContext对象之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplicati ...

  7. Asp.net mvc 自定义全局的错误事件HandleErrorAttribute无效

    Asp.net mvc 自定义全局的错误事件HandleErrorAttribute,结果无效, 原因: 1.没有在RegisterGlobalFilters 里面添加或者你要的位置添加. 2.你把这 ...

  8. [Log]ASP.NET之HttpModule 事件执行顺序

    ASP.Net下的HttpModule是基于事件的处理模型,这使得我们在选择事件监听和处理的时候有更多选择.下面是对HttpModule有关事件被触发的监测: 有关代码如下 using System; ...

  9. Asp.Net MVC 的19个管道事件

    httpApplication调用ProcessRequest方法,内部执行19个管道事件,如下 BeginRequest  开始处理请求 AuthenticateRequest 授权验证请求开始,获 ...

随机推荐

  1. 【set】【Splay】【pb_ds】bzoj1208 [HNOI2004]宠物收养所

    每次来的如果是人,且宠物数不为零,就从宠物中选出一个与其差距最小的,累加答案:若为零,就把他放入另一个集合里. 如果是宠物,则同上. 各种平衡树都可过,我蛋疼地用了pb_ds. Code: #incl ...

  2. 【KMP求最小周期】POJ2406-Power Strings

    [题意] 给出一个字符串,求出最小周期. [思路] 对KMP的next数组的理解与运用orz ①证明:如果最小周期不等于它本身,则前缀和后缀必定有交叉. 如果没有交叉,以当前的next[n]为最小周期 ...

  3. 【快速幂】POJ3641 - Pseudoprime numbers

    输入a和p.如果p不是素数,则若满足ap = a (mod p)输出yes,不满足或者p为素数输出no.最简单的快速幂,啥也不说了. #include<iostream> #include ...

  4. 源码安装python及paramikon的初步试用

    Auth: jin Date: 20140314 OS: CentOS release 5.5 (Final) 默认2.4版本 莫 1.download wget http://www.python. ...

  5. SAP MM 模块常用的数据表

    SAP MM模块常用数据表: Table Table Class Application Class Data Class Description EBAN TRANSP  ME Transactio ...

  6. Android内存优化12 内存泄漏常见情况3 注册泄漏

    android 中有很多注册和反注册,由于在注册后,上下文自身会被持久化的观察者列表所持有,如果不进行反注册,就会造成内存泄漏 内存泄漏1:Sensor Manager 代码如下: MainActiv ...

  7. OCP升级(3.6->3.7)

    有个好文档还是靠普很多,感谢同事的文档.升级步骤记录如下 1.检查现有环境 [root@master ~]# etcd --version etcd Version: Git SHA: 1674e68 ...

  8. HDU 4886 TIANKENG’s restaurant(Ⅱ) hash+dfs

    题意: 1.找一个字符串s使得 s不是给定母串的子串 2.且s要最短 3.s在最短情况下字典序最小 hash.,,结果t掉了...加了个姿势怪异的hash值剪枝才过.. #include <cs ...

  9. FPGA作为从机与STM32进行SPI协议通信---Verilog实现

    一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...

  10. 流畅的python第十四章可迭代的对象,迭代器和生成器学习记录

    在python中,所有集合都可以迭代,在python语言内部,迭代器用于支持 for循环 构建和扩展集合类型 逐行遍历文本文件 列表推导,字典推导和集合推导 元组拆包 调用函数时,使用*拆包实参 本章 ...