背景: 一个请求在到达处理器时 可能需要做很多重复的工作 比如使用固定的算法推算出用户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下
运行效果
- BeginRequest #发出信号表示创建任何给定的新请求。 此事件始终被引发,并且始终是请求处理期间发生的第一个事件
- AuthenticateRequest #发出信号表示配置的身份验证机制已对当前请求进行了身份验证。 订阅 AuthenticateRequest 事件可确保在处理附加模块或事件处理程序之前对请求进行身份验证
- PostAuthenticateRequest #预订 PostAuthenticateRequest 事件的功能可以访问由 PostAuthenticateRequest 处理的任何数据
- AuthorizeRequest #发出信号表示 ASP.NET 已对当前请求进行了授权。 订阅 AuthorizeRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证和授权
- PostAuthorizeRequest #发出信号表示 ASP.NET 已对当前请求进行了授权。 订阅 PostAuthorizeRequest 事件可确保在处理附加的模块或处理程序之前对请求进行身份验证和授权
- ResolveRequestCache #引发这个事件来决定是否可以使用从输出缓冲返回的内容来结束请求。这依赖于Web应用程序的输出缓冲时怎样设置的
- PostResolveRequestCache #在 ASP.NET 跳过当前事件处理程序的执行并允许缓存模块满足来自缓存的请求时发生
- MapRequestHandler #ASP.NET 基础结构使用 MapRequestHandler 事件来确定用于当前请求的请求处理程序
- PostMapRequestHandler #在 ASP.NET 已将当前请求映射到相应的事件处理程序时发生
- AcquireRequestState #当 ASP.NET 获取与当前请求关联的当前状态(如会话状态)时发生
- PostAcquireRequestState #预订 AcquireRequestState 事件的功能可以访问由 PostAcquireRequestState 处理的任何数据
- PreRequestHandlerExecute #在ASP.NET开始执行HTTP请求的处理程序之前引发这个事件。在这个事件之后,ASP.NET 把该请求转发给适当的HTTP处理程序
- PostRequestHandlerExecute #在 ASP.NET 事件处理程序(例如,某页或某个 XML Web service)执行完毕时发生
- ReleaseRequestState #在 ASP.NET 执行完所有请求事件处理程序后发生。 该事件将使状态模块保存当前状态数据
- PostReleaseRequestState #在 ASP.NET 已完成所有请求事件处理程序的执行并且请求状态数据已存储时发生
- UpdateRequestCache #当 ASP.NET 执行完事件处理程序以使缓存模块存储将用于从缓存为后续请求提供服务的响应时发生
- PostUpdateRequestCache #在 ASP.NET 完成缓存模块的更新并存储了用于从缓存中为后续请求提供服务的响应后,发生此事件
- OnLogRequest #恰好在 ASP.NET 为当前请求执行任何记录之前发生,即使发生错误,也会引发 LogRequest 事件
- PostLogRequest #在 ASP.NET 处理完 LogRequest 事件的所有事件处理程序后发生
- EndRequest #在 ASP.NET 响应请求时作为 HTTP 执行管线链中的最后一个事件发生
- PreSendRequestContent #恰好在 ASP.NET 向客户端发送内容之前发生,可能发生多次
- PreSendRequestHeaders #恰好在 ASP.NET 向客户端发送 HTTP 标头之前发生
- RequestCompleted #在任何托管模块和处理程序执行后,它使模块清理资源
以上是可以注册的事件列表 执行顺序与列表顺序相同
访问一个页面的过程中,依次触发23个事件,HttpModule可订阅的事件个数为25个, Error事件在发生错误的情况下执行 Disposed在会话结束后触发。