asp.net – 如何在抛出请求验证异常时显示自定义错误页面?

前端之家收集整理的这篇文章主要介绍了asp.net – 如何在抛出请求验证异常时显示自定义错误页面?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们为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 /< script>,则启用了自定义错误. ASP.NET的请求验证启动并引发HttpException.但是,除了显示我的自定义错误页面,我会收到以下消息:

Server Error in ‘/’ Application.

Runtime Error

Description: An exception occurred while processing your request.
Additionally,another exception occurred while executing the custom
error page for the first exception. The request has been terminated.

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

解决方法

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

猜你在找的asp.Net相关文章