如何使应用程序池崩溃?
Posted
技术标签:
【中文标题】如何使应用程序池崩溃?【英文标题】:How do I crash the App Pool? 【发布时间】:2011-03-03 22:50:43 【问题描述】:我们的 ASP.NET 2 Web 应用程序非常优雅地处理异常。我们在 Application_Error 中捕获 Global ASAX 中的异常。从那里我们记录异常并向用户显示一条友好的消息。
但是,今天早上我们部署了最新版本的网站。它运行了半个小时,但随后 App Pool 崩溃了。在我们恢复之前的版本之前,该网站没有恢复。
如何使应用程序池崩溃并跳过正常的异常处理程序?我正在尝试复制这个问题,但到目前为止没有运气。
更新:我们找到了解决方案。我们的一个页面正在截屏另一个页面。但是 URL 配置不正确,页面最终被无限地截屏自身,从而导致堆栈溢出异常。
【问题讨论】:
服务器上的事件日志应该告诉你发生了什么,并且会让你更好地了解如何复制它。 我认为 *** 应该这样做。 (尝试一些没有终止条件的递归) 这帮助我在我们的系统上调试了同样的问题:***.com/questions/5053708/… 【参考方案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以上是关于如何使应用程序池崩溃?的主要内容,如果未能解决你的问题,请参考以下文章