2014-01-11 96 views
12

我们通过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"); 
    } 
} 
+0

您确定验证错误会引发400,404或500错误吗?也许一些其他的错误代码不是由你的配置处理 – David

+0

你能找出这个问题吗? – Animesh

回答

2

要确保你不会忽略在你的web应用,你可以添加默认的错误页面,可能出现的任何错误代码:

<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); 
    } 
} 
0

与在配置文件中使用的customErrors设置的一个问题是,所产生的重定向可能会导致重定向HTTP状态代码(300个斯里es)返回给客户端/浏览器,当你真的想发送服务器错误HTTP状态码(500系列)或客户端错误HTTP状态码(400系列)。

要检查由您的网站返回的HTTP状态代码,您可以使用Chrome的“更多工具>开发人员工具”显示,并选中“网络”选项卡。然后,您将能够看到Web服务器返回给客户端/浏览器的HTTP状态代码。如果输入了无效的电子邮件地址登录名,则应返回客户端错误状态(HTTP状态400系列),而不是重定向状态码(300系列)。

您的问题中列出的“运行时间”错误可能是由未处理的验证条件导致的,该条件会导致服务器错误。此类错误需要进一步关注,但应在HTTP响应中返回服务器错误代码(500系列)。

Web服务器错误分两级处理。一个级别在页面内容显示中,另一个级别在返回的HTTP状态代码中。理想情况下,这些将是相互一致的。

0
void Application_Error(object sender, EventArgs e) { 
    Exception Ex = Server.GetLastError; 
    Logger.AddNewLog(Logger.LogType.ErrorLog, sender.ToString, "Error", (Ex.Message 
        + (Environment.NewLine + Ex.StackTrace))); 
    Server.ClearError(); 
    Response.Redirect("/Error"); 
} 
0

广场existingResponse="Replace"subStatusCode="-1"在你的web.config的httpErrors部分。

页面现在出现400错误,并会显示您的错误页面。

在您的应用程序
enter image description here

在你的web.config enter image description here

无需使用customErrors部分

enter image description here
*#8是我产生一个500页错误的目的。

相关问题