5

Global,作为应用程序的替代方案AutoEventWireups,似乎为大多数底层应用程序事件(BeginRequest, AuthorizeRequest, Error等)以及一组异步方法(等)公开了事件AddOnBeginRequestAsync。但是,我找不到等效的事件ApplicationStart

所以我的问题是,是否有订阅该AutoEventWireup方法Application_(On)Start所挂钩的“相同”事件?

public class Global : HttpApplication
{
    public Global()
    {
        // I can do this ...
        base.BeginRequest += new EventHandler(Global_BeginRequest);
        // Or even AddOnBeginRequestAsync();

        // But how can I do this?
        base.ApplicationStart += new EventHandler(GlobalApplication_Start);
    }

    protected void Global_BeginRequest(object sender, EventArgs e)
    {
      // ...
    }

    protected void Global_ApplicationStart(object sender, EventArgs e)
    {
      // ...
    }
}

(出于兴趣......有没有办法关闭AutoEventWireupsGlobal.asax?。使用 AutoEventWireup = "false" 属性似乎只适用于 aspx 页面)

编辑- 似乎 ApplicationStart 和 ApplicationEnd “是不代表HttpApplication 事件的特殊方法”。所以我可能完全找错了树。

编辑 Re: 为什么我需要这个?不幸的是,一个公司客户有一个框架,新应用程序需要继承他们的自定义HttpApplication类,而 FWR,他们HttpApplication已经实现了 autowireup Application_(On)Start,这意味着我需要找到另一种方法来覆盖框架连接,以便我可以引导我的IoC 容器和 Automapper 映射。根据 Lloyd 的回答,我也可以在 ctor 中进行引导Init(),尽管这并不完全相同。最终,我能够更改公司框架以允许多个订阅。

4

2 回答 2

4

您可以覆盖初始化:

public class MyApplication : HttpApplication
{

    public override void Init()
    {
        base.Init();
    }

}

但是,您的构造函数也可以正常工作。

于 2012-07-09T16:46:28.727 回答
0

使用 Init 方法要非常小心。

对希望在应用程序生命周期中执行一次的代码使用 Init 方法是一个不好的选择,因为对于 HttpApplication 的每个实例调用一次 Init 方法...

正如您所说,ApplicationStart 和 ApplicationEnd 是不代表 HttpApplication 事件的特殊方法,但是当 AutoEventWireups 设置为 true 时,它​​们的工作方式与 Page 事件类似。

跳转到 .NET 源代码后,我发现 HttpApplicationFactory 类在 Global.asax 文件中查找名为“Application_OnStart”或“Application_Start”的方法,然后使用反射 => ReflectOnMethodInfoIfItLooksLikeEventHandler() 调用它。

查看我关于类似主题的问题:HttpApplication.Start 事件不存在

于 2019-02-13T09:28:14.710 回答