Asp.Net 管道事件注册/HttpApplication事件注册
一、HttpApplication简介
在HttpRuntime创建了HttpContext对象之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplication。
HttpRuntime管理一个定义在System.Web命名空间下的HttpApplicationFactory类的时候,HttpApplicationFactory通过工厂模式管理HttpApplication对象。在HttpApplicationFactory内部维护了一个HttpApplication对象池,使得被创建的HttpApplication对象可以被重复使用。但是,每一个HttpApplication对象每一次仅仅用于处理一个请求,这样就不需要考虑HttpApplication中多个请求并发的处理问题了。
在HttpApplication中,利用.Net中的事件机制,通过在处理过程中依次发出的多个事件,将这个处理过程分解为多个步骤,这个处理机制通常我们称为处理管道。
HttpApplication对象是Asp.net中处理请求的重要对象,但是,这种类型的对象实例不是由程序员来创建,而是由Asp.net帮助我们创建。为了便于扩展处理,Asp.net暴露了大量的事件给程序员,这些事件按照固定的处理顺序依次触发,程序员通过编写事件处理方法就可以自定义每一个请求的扩展处理过程。也就是HttpApplication的19个标准事件。
HttpApplication的管道事件,提供了2中注册方式:
1.使用全局文件global.axax,使用简单
2.使用IHttpModule扩展接口方式注册
二、使用Global.axax 全局文件注册管道事件
这种方式易用,优先推荐。
示例:
protected void Application_BeginRequest(object sender, EventArgs e) { Context.Response.Write("开始处理请求。。。。。。"); } protected void Application_AuthenticateRequest(object sender, EventArgs e) { Context.Response.Write("验证请求。。。。。。"); } protected void Application_PostAuthenticateRequest(object sender, EventArgs e) { Context.Response.Write("获取成功"); } protected void Application_EndRequest(object sender, EventArgs e) { Context.Response.Write("结束请求"); }
注:Global.asax 的Application_Start事件中不能注册模块和管道处理,构造函数中也不推荐使用,因为调试时构造函数执行了2次
//注意:Application_Start事件中不能注册模块,会抛出异常 // 也不能注册模块的事件,因为不会触发 //HttpApplication.RegisterModule(typeof(TestTwo));
//调试的时候构造执行了两次 //构造函数中注册的BeginRequest 会触发 public MvcApplication() { // this.BeginRequest += Begin; number++; }
三、扩展IHttpModule接口定义HttpModule类注册处理
1.IHttpModule定义如下:
// // 摘要: // 向实现类提供模块初始化和处置事件。 public interface IHttpModule { // // 摘要: // 处置由实现 System.Web.IHttpModule 的模块使用的资源(内存除外)。 void Dispose(); // // 摘要: // 初始化模块,并使其为处理请求做好准备。 // // 参数: // context: // 一个 System.Web.HttpApplication,它提供对 ASP.NET 应用程序内所有应用程序对象的公用的方法、属性和事件的访问 void Init(HttpApplication context); }
2.实现示例:
public class TestTwo : IHttpModule { public void Dispose() { throw new NotImplementedException(); } public void Init(HttpApplication context) { //监听请求处理 context.BeginRequest += (sender, e) => { LogHelper.LogHelper _log = new LogHelper.LogHelper(); _log.WriteLine("当前请求" + context.Request.Url.AbsoluteUri); }; } }
3.关于HttpModule 注册
在IIS早版本中使用WebConfig配置模块
<system.webServer> <modules> <add name="ModuleExample" type="Samples.ModeleExample"> </modules> </system.webServer>
在IIS和.Net 新版本中添加了PreApplicationStartMethodAttribute 注册方式
对应示例:
启动方法定义
public class TestOne { /// <summary> /// 程序启动时,PreApplicationStartMethod中指定的方法必须是公共静态的 /// </summary> public static void Start() { LogHelper.LogHelper _log = new LogHelper.LogHelper(); _log.WriteLine("程序启动成功1"); //注册模块 HttpApplication.RegisterModule(typeof(TestTwo)); } }
程序集加载注册:
//定义程序启动时处理方法 [assembly: PreApplicationStartMethod(typeof(TestOne), "Start")]
更多:
PreApplicationStartMethodAttribute程序启动扩展