我们为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); } }