【问题标题】:How do I crash the App Pool?如何使应用程序池崩溃?
【发布时间】:2011-03-03 22:50:43
【问题描述】:

我们的 ASP.NET 2 Web 应用程序非常优雅地处理异常。我们在 Application_Error 中捕获 Global ASAX 中的异常。从那里我们记录异常并向用户显示一条友好的消息。

但是,今天早上我们部署了最新版本的网站。它运行了半个小时,但随后 App Pool 崩溃了。在我们恢复之前的版本之前,该网站没有恢复。

如何使应用程序池崩溃并跳过正常的异常处理程序?我正在尝试复制这个问题,但到目前为止没有运气。


更新:我们找到了解决方案。我们的一个页面正在截屏另一个页面。但是 URL 配置不正确,页面最终被无限地截屏自身,从而导致堆栈溢出异常。

【问题讨论】:

  • 服务器上的事件日志应该告诉你发生了什么,并且会让你更好地了解如何复制它。
  • 我认为 StackOverflow 应该这样做。 (尝试一些没有终止条件的递归)
  • 这帮助我在我们的系统上调试了同样的问题:stackoverflow.com/questions/5053708/…

标签: asp.net application-pool


【解决方案1】:

您可以尝试抛出ThreadAbortException

【讨论】:

    【解决方案2】:

    为了做到这一点,您需要做的就是从请求上下文之外抛出任何异常(当然不处理它)。

    例如,在另一个线程上引发的一些异常应该这样做:

    protected void Page_Load(object sender, EventArgs e)
    {
       // Create a thread to throw an exception
       var thread = new Thread(() => { throw new ArgumentException(); });
    
       // Start the thread to throw the exception
       thread.Start();
    
       // Wait a short while to give the thread time to start and throw
       Thread.Sleep(50);
    }
    

    更多信息可以找到here in the MS Knowledge Base

    【讨论】:

      【解决方案3】:

      我看到的最常见的错误和“池崩溃”是循环调用。

      public string sMyText
      {
         get {return sMyText;}
         set {sMyText = value;}
      } 
      

      只需调用 sMyText...

      【讨论】:

        【解决方案4】:

        Aristos 的回答很好。当有人在不更改基本调用的情况下将覆盖方法从 OnInit 更改为 OnLoad 时,我也看到它在页面生命周期中使用愚蠢的覆盖完成,因此它在整个生命周期中循环循环:即

        protected override void OnLoad(EventArgs e)
        {
          //some other most likely rubbish code
          base.OnInit(e);
        }
        

        【讨论】:

        • 啊,是的,这也是我看到的……+1
        猜你喜欢
        • 2012-03-30
        • 2011-01-16
        • 2011-11-18
        • 2010-10-03
        • 1970-01-01
        • 2018-04-25
        • 2017-03-14
        • 1970-01-01
        • 2012-08-30
        相关资源
        最近更新 更多