我有一个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消息。