【问题标题】:ASP.NET HttpApplication lifecycleASP.NET HttpApplication 生命周期
【发布时间】:2009-09-08 21:40:45
【问题描述】:

由 Global.asax.cs 扩展的 HttpApplication 类在应用程序的生命周期中是否存在?

什么时候可以创建/销毁实例?

我遇到 application_start 触发两次,这似乎与应用程序池回收和在此过程中发出请求的一部分有关。我还没有完全调试它,我现在没有时间深入调试它。那么,关于上述问题,以下是安全的解决方案吗?

public class MvcApplication : System.Web.HttpApplication
{
    public static object syncLock = new object();
    public static bool applicationBooted;

    protected void Application_Start()
    {
        if(!applicationBooted)
        lock (syncLock)
        if(!applicationBooted)
        {
            // bootstrap here
            applicationBooted = true;
        }
    }
}

【问题讨论】:

  • 您找出问题所在了吗?我有非常相似的问题。
  • @Piotr 我认为这是一个红鲱鱼,我认为我在启动代码的其他地方遇到了线程问题,发送两个初始请求很有趣。不记得了,抱歉

标签: asp.net


【解决方案1】:

如果您在日志中看到该事件两次,请检查应用程序池是否设置为生成单个工作进程。每个工作进程都会创建自己的 HttpAppication 实例。

【讨论】:

  • 不应该 app_start 仍然只被触发一次吗?我不想要 >1 个工作进程吗?
  • 当您将应用程序池配置为使用 > 1 个工作进程运行时,您将在网络花园模式下运行。每个进程都相互隔离,并运行自己的管道实例。
  • 这是否意味着您会为同一个 IIS 站点获得许多 w3wp.exe?
  • 它已关闭,所以这不是原因,而是 +1 知识:)
【解决方案2】:

来自 MSDN 在线页面,

毕竟核心应用对象 已初始化,应用程序 通过创建一个实例开始 HttpApplication 类。如果 应用程序有一个 Global.asax 文件, ASP.NET 而是创建一个实例 派生的 Global.asax 类 从 HttpApplication 类和 使用派生类来表示 应用程序。

ASP.NET Application Life Cycle Overview

【讨论】:

  • 它没有解释为什么它被创建或者只是事件被调用了两次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多