【问题标题】:Prevent ASP.NET(MVC) website to shutting down on exceptions防止 ASP.NET(MVC) 网站因异常而关闭
【发布时间】:2014-02-08 21:04:52
【问题描述】:

我知道后台线程上未处理的异常会导致网站关闭,因此防止网站关闭,我将下面的代码代码放入 Global.asax 以防止它。

protected void Application_Error(object sender, EventArgs e)
{
    System.Web.HttpContext context = HttpContext.Current;
    System.Exception ex = Context.Server.GetLastError();

    context.Server.ClearError();

    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}

但即使是这段代码也不能阻止网站关闭。我在这里缺少什么?

【问题讨论】:

  • 页面中的异常不会导致整个站点宕机。在这种情况下,“后台线程”是什么意思?
  • 手动创建线程如 new Thread(()=> new ArgumentException()).Start()
  • 在 ASP.NET 中没有办法防止未处理的后台异常终止进程。您最好的选择是在线程入口点处理异常(如果可能)。这些是什么类型的线程/抛出了什么样的异常?如果您更多地描述您的场景,我们可能会提供指导。或者,您可能希望使用 Task.Run 而不是手动生成线程。
  • 我想阻止我的网站关闭,因为重启会导致一些性能开销,因为我还在 global.asax 端做了一些昂贵的初始化工作。如果我更喜欢 Task 而不是使用线程,Task 将阻止关闭?
  • 关闭与您对池的设置有关。您可以在此处设置是否在 5 秒内发生 5 个错误以关闭池。在那里禁用它,或使用 try/catch 处理您的错误。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 exception-handling


【解决方案1】:

如果您确实需要手动生成托管线程,我认为AppDomain.UnhandledException 事件是非致命异常的唯一选择,因为在请求处理上下文之外引发的异常不会调用Application_Error

根据您在后台线程中执行的操作,您可能需要切换到 async/await 模型来处理 I/O 密集型操作或 TPL in general 来处理 CPU 密集型任务。

【讨论】:

    猜你喜欢
    • 2015-07-10
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2012-09-18
    • 2012-08-21
    • 1970-01-01
    相关资源
    最近更新 更多