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