【发布时间】: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/<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 错误吗?也许您的配置未处理其他一些错误代码
-
你能弄清楚这个吗?
标签: asp.net custom-errors request-validation