14

我们为 ASP.NET 引发的异常配置了如下自定义错误页面:

<customErrors mode="On" redirectMode="ResponseRewrite">
  <error statusCode="400" redirect="~/400.aspx"/>
  <error statusCode="404" redirect="~/404.aspx"/>
  <error statusCode="500" redirect="~/500.aspx"/>
</customErrors>

设置redirectMode="ResponseRewrite"很重要,因为它确保 URL 不会改变(我相信 ASP.NET 执行 aServer.Transfer而不是Response.Redirect)。

不幸的是,这不适用于请求验证错误。例如,如果我导航到/some/page/<script>ASP.NET 的请求验证启动并HttpException抛出 a ,则启用自定义错误。但是,我没有显示我的自定义错误页面,而是收到以下消息:

“/”应用程序中的服务器错误。

运行时错误

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

为什么 ASP.NET 在这种情况下无法显示我的自定义错误页面?错误页面中没有代码,只有 HTML,所以我知道错误页面本身没有抛出任何异常。

此外,如果我自己发现错误Application_Error并发出Server.Transfer它可以正常工作,所以我很好奇 ASP.NET 在幕后做了什么。

如果我们要自己处理,还有比这更好的解决方案吗?

protected void Application_Error(object sender, EventArgs e)
{
    var ex = Server.GetLastError() as HttpException;
    if (ex != null 
        && ex.Message.StartsWith("A potentially dangerous Request.Path value was detected from the client")
        && HttpContext.Current.IsCustomErrorEnabled)
    {
        Server.Transfer("400.aspx");
    }
}
4

4 回答 4

2

为确保您不会忽略 webapp 中可能出现的任何错误代码,您可以添加默认错误页面:

<customErrors mode="On" defaultRedirect="Error.aspx" />

如果您只想捕获 RequestValidationErrors 而不是您可以在 global.asax 文件中处理它:

 void Application_Error(object sender, EventArgs e)
 {
    Exception ex = Server.GetLastError();
    if (ex is HttpRequestValidationException)
    {
        Server.ClearError();
        Response.Redirect("RequestValidationError.aspx", false);
    }
 }
于 2014-05-01T20:42:47.200 回答
1

existingResponse="Replace"和放在web.configsubStatusCode="-1"的部分中。httpErrors

该页面现在出现 400 错误,并将显示您的错误页面。

在您的应用程序中
在此处输入图像描述

在你的 web.config 在此处输入图像描述

无需使用customErrors部分

在此处输入图像描述
* #8 是我故意生成 500 错误的页面。

于 2016-08-18T18:14:13.133 回答
0
 void Application_Error(object sender, EventArgs e) {
    Exception Ex = Server.GetLastError;
    Logger.AddNewLog(Logger.LogType.ErrorLog, sender.ToString, "Error", (Ex.Message 
                    + (Environment.NewLine + Ex.StackTrace)));
    Server.ClearError();
    Response.Redirect("/Error");
}
于 2016-04-05T04:42:25.253 回答
0

在配置文件中使用 customErrors 设置的一个问题是,当您真正想要发送服务器错误 HTTP 状态代码(500 系列)时,生成的重定向可能会导致重定向 HTTP 状态代码(300 系列)返回到客户端/浏览器) 或客户端错误 HTTP 状态代码(400 系列)。

要检查您的网站返回的 HTTP 状态代码,您可以使用 Chrome 的“更多工具 > 开发人员工具”显示并选择“网络”选项卡。然后,您将能够看到 Web 服务器返回给客户端/浏览器的 HTTP 状态代码。如果输入了无效的电子邮件地址登录,则应返回客户端错误状态(HTTP 状态 400 系列)而不是重定向状态代码(300 系列)。

与您的问题一起列出的“运行时”错误可能是由未处理的验证条件引起的,该条件生成了服务器错误。此类错误需要进一步注意,但应在 HTTP 响应中返回服务器错误代码(500 系列)。

Web 服务器错误在两个级别进行处理。一层在页面内容显示中,另一层在返回的HTTP状态码中。理想情况下,这些将彼此一致。

于 2016-02-02T21:18:45.917 回答