【问题标题】:Handling application-wide events without Global.asax在没有 Global.asax 的情况下处理应用程序范围的事件
【发布时间】:2011-08-15 08:12:39
【问题描述】:

由于各种原因,我的项目没有“global.asax”,我无法更改它(它是一个组件)。另外,我无法访问 web.config,所以 httpModule 也不是一个选项。

有没有办法处理应用程序范围的事件,例如本例中的“BeginRequest”?

我试过了,但没有用,有人能解释一下原因吗?看起来像一个错误:

HttpContext.Current.ApplicationInstance.BeginRequest += MyStaticMethod;

【问题讨论】:

    标签: asp.net


    【解决方案1】:

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

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

    这个新属性允许你拥有 代码在 ASP.NET 的早期运行方式 应用程序启动时的管道。 我的意思是很早,甚至在之前 Application_Start.

    所以剩下的事情非常简单:您需要使用所需的事件处理程序、模块初始化程序和 AssemblyInfo.cs 文件的属性创建自己的 http 模块。这是一个模块示例:

    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)
        {
    
        }
    }
    

    要动态注册模块,您可以使用Microsoft.Web.Infrastructure.dll 程序集中的DynamicModuleUtility.RegisterModule 方法:

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

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

    [assembly: PreApplicationStartMethod(typeof(Initializer), "Initialize")]
    

    【讨论】:

    • 不错!我遇到了一个问题,即自定义 HTTP 错误处理程序(通过 web.config 加载)干扰了 IIS 预热过程。加载 DLL 似乎阻止了预热过程立即启动,因此在应用程序加载之前我没有看到 remapManagedRequestsTo 文件加载,否定了它的用处。使用这种方法加载模块似乎可以解决问题,并且热身过程会立即开始。
    • 这里出现在2021年微软已经将这种注册方式标记为过时了,新的方式是HttpApplication.RegisterModule()stackoverflow.com/a/54097973/176877
    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    相关资源
    最近更新 更多