2011-04-29 91 views
6

由于各种原因,我的项目没有“global.asax”,我无法更改它(它是一个组件)。另外,我没有访问web.config,所以httpModule也不是一个选项。在没有Global.asax的情况下处理应用程序范围的事件

有没有办法处理应用程序范围内的事件,比如在这种情况下的“BeginRequest”?

我试过了,它没有工作,有人可以解释为什么吗?看起来像一个bug:

HttpContext.Current.ApplicationInstance.BeginRequest += MyStaticMethod; 

回答

9

不,这不是一个错误。事件处理程序只能在IHttpModule初始化期间绑定到HttpApplication事件,并且您正试图将其添加到Page_Init(我的假设)中的某处。

因此,您需要动态注册一个带有所需事件处理程序的http模块。如果你是在.NET 4有你一个好消息 - 有PreApplicationStartMethodAttribute属性(参考:Three Hidden Extensibility Gems in ASP.NET 4):

这个新的属性可以让你有 代码运行在ASP.NET方式早 管道作为应用程序启动。 我的意思是路途早,甚至在 Application_Start之前。

因此,剩下的事情很简单:你需要创建一个你想要的事件处理程序,模块初始化和属性你自己的HTTP模块,您AssemblyInfo.cs文件。这里是一个模块,例如:

public class MyModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += new EventHandler(context_BeginRequest); 
    } 

    public void Dispose() 
    { 

    } 

    void context_BeginRequest(object sender, EventArgs e) 
    { 

    } 
} 

要注册模块动态,你可以使用DynamicModuleUtility.RegisterModule方法从Microsoft.Web.Infrastructure.dll组件:

public class Initializer 
{ 
    public static void Initialize() 
    { 
     DynamicModuleUtility.RegisterModule(typeof(MyModule)); 
    } 
} 

唯一剩下的东西是必要的属性添加到您的AssemblyInfo.cs

[assembly: PreApplicationStartMethod(typeof(Initializer), "Initialize")] 
相关问题