如何使应用程序池崩溃?

16

我们的ASP.NET 2网络应用程序非常优雅地处理异常。我们在Global ASAX中的Application_Error捕获异常。然后我们记录异常并向用户显示友好的消息。

然而,今天早上我们部署了最新版本的网站。它运行了半个小时,但是然后App池崩溃了。直到我们恢复了上一个版本,网站才重新上线。

我该如何让应用程序池崩溃并跳过正常的异常处理程序?我正在尝试复制这个问题,但目前还没有成功。


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


服务器上的事件日志应该告诉您发生了什么,并且会让您更好地了解如何复制它。 - Nick Craver
StackOverflow应该可以解决这个问题,我认为。(尝试一些没有终止条件的递归) - Martin Smith
这个链接对我帮助很大,可以用来调试我们系统上的相同问题:https://dev59.com/i2445IYBdhLWcg3wE2Ne - Krisztián Balla
4个回答

14

我见过最常见的错误并导致“池崩溃”的原因是循环调用。

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

只需调用sMyText即可。...


13
为了做到这一点,你只需要从“不在请求上下文范围内”的位置抛出任何异常(当然不处理它)即可。
例如,在另一个线程中引发的某些异常应该就可以了:
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);
}

可以在MS知识库中找到更多信息


4

Aristos的回答很好。我也看到过在页面生命周期中使用愚蠢的重写来实现这一点,当某人将被重写的方法从OnInit更改为OnLoad时,没有更改基本调用,因此它通过生命周期循环递归:即。

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

1
啊,是的,这也是我见过的东西... +1 - Aristos

1
你可以尝试抛出一个 ThreadAbortException

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接