我们通过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
。然而,不是显示我的自定义错误页面,我收到以下消息:
'/'应用程序中的服务器错误。
运行时错误
描述:处理请求时发生异常。 此外,执行第一个异常的自定义 错误页面时发生另一个异常。该请求已被终止。
为什么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错误吗?也许一些其他的错误代码不是由你的配置处理 – David
你能找出这个问题吗? – Animesh