【问题标题】:How to display a custom error page when Request Validation Exceptions are thrown?抛出请求验证异常时如何显示自定义错误页面?
【发布时间】:2014-01-30 20:26: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 执行Server.Transfer 而不是Response.Redirect)。

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

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

运行时错误

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

为什么在这种情况下 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");
    }
}

【问题讨论】:

  • 您确定验证错误会引发 400,404 或 500 错误吗?也许您的配置未处理其他一些错误代码
  • 你能弄清楚这个吗?

标签: asp.net custom-errors request-validation


【解决方案1】:

为确保您不会遗漏任何可能出现在 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);
    }
 }

【讨论】:

  • 它处理的是通用的HttpException,而不是HttpRequestValidationException,因此这行不通...
【解决方案2】:

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

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

在您的应用程序中

在您的 web.config 中

无需使用customErrors 部分


* #8 是我故意生成 500 错误的页面。

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:
       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");
      }
      

      【讨论】:

        猜你喜欢
        • 2013-08-02
        • 1970-01-01
        • 2020-03-15
        • 1970-01-01
        • 2018-05-28
        • 1970-01-01
        • 2015-03-20
        • 2017-01-06
        • 2011-09-18
        相关资源
        最近更新 更多