如何在ASP.NET应用程序中数据库不可用时优雅地处理服务器错误?

时间:2016-10-21 15:17:40

标签: c# asp.net .net iis error-handling

我有一个ASP.NET Web应用程序。我已经设置IIS 8.5来处理使用静态HTML错误页面的各种HTTP错误响应,例如

  <system.webServer>
    <httpErrors errorMode="Custom">
      <remove statusCode="500" subStatusCode="-1" />
      ...
      <error statusCode="500" prefixLanguageFilePath="httpErrors\custom" path="500.htm" responseMode="File" />
    ...
    </httpErrors>
  </system.webServer>

我还设置了我的应用程序将异常处理委托给IIS,因为我想确保导致应用程序失败的任何异常仍然优雅地处理。因此我将web.config设置为:

<system.web>
    ...
    <customErrors defaultRedirect="~/CustomError.aspx" mode="On" />
    ...
</system.web>

CustomError.aspx看起来像这样:

<%@ Page Language="C#" %>
<script runat="server">
protected void Page_Init(object sender, EventArgs e)
{
    Response.TrySkipIisCustomErrors = false;
    Response.StatusCode = 500;
}
</script>

我正在尝试告诉我的应用程序推迟到IIS进行错误处理。

如果我现在通过抛出异常来模拟服务器错误,我看到我的请求被重定向到/CustomError.aspx?aspxerrorpath=/path/to/fracture.aspx。在这种情况下,应用程序的customErrors设置可能因为在ASP.NET中引发了异常而引发了。但是,我看到的是我在httpErrors中配置的500.htm页面(见上文)。

如果我通过简单地设置Response.StatusCode = 500;以不同的方式模拟服务器错误,那么这次我没有被重定向,但我仍然看到了我的500.htm错误页面的内容。大概这次IIS在没有应用程序参与的情况下处理服务器错误。

这些都是:)

然而,现在我想看看如果我的数据库发生故障会发生什么。为了模拟这一点,我将连接字符串更改为指向不存在的数据库。您认为我观察到上述哪种情况?都不是!我实际看到的是一个非常丑陋的东西:

  

'/ template'应用程序中的服务器错误。

     

运行时错误

     

描述:处理您的请求时发生异常。此外,执行第一个异常的自定义错误页面时发生另一个异常。请求已被终止。

我可以在浏览器地址栏中看到我已被重定向到CustomError.aspx,因此应用程序已按预期处理错误。您可以从上面的CustomError.aspx代码中看到它不进行数据库调用。事实上它几乎没有做任何事情。那么为什么我没有看到我友好的友好错误页面?我甚至可以通过监视请求看到它仍然是500状态代码。

我知道很多细节,但我真的非常希望找到一种标准且可靠的错误处理方法,从而不会暴露任何丑陋的ASP.NET消息。

0 个答案:

没有答案