ASP.NET应用程序错误覆盖404?

时间:2009-07-14 19:31:53

标签: asp.net error-handling web-config http-status-code-404

我使用Application_Error事件来捕获并记录我的应用程序中的错误。记录错误,然后显示友好的错误屏幕:

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Dim ex As New Exception( _
            String.Format("Error on page: '{0}'.", HttpContext.Current.Request.Url), _
            Server.GetLastError())

        Dim uid As Guid = Log.FatalError(ex)
        Server.Transfer(String.Concat("~\\GlobalError.aspx?error=", uid))
End Sub

在我的web.config中,我有:

<customErrors mode="On" defaultRedirect="GlobalError.aspx">
  <error statusCode="404" redirect="PageNotFound.aspx" />
</customErrors>

每当用户尝试加载不存在的页面时,它们都会获得GlobalError.aspx页面,而不是PageNotFound.aspx页面。我查看了Application_Error事件,发现Response StatusCode为200,而Server的最后一个错误是找不到“Page'foo.aspx”。

要使其正常工作,我需要做些什么?

2 个答案:

答案 0 :(得分:4)

在Application_Error函数中,如果错误不是找不到页面/ 404错误,则应该只有Server.Transfer。在这些情况下,请使用web.config中的设置将其留给ASP.NET进行重定向。

您可以使用以下内容确定它是否为404:

Exception ex = Server.GetLastError();
if (ex.GetType() == typeof(HttpException))
{
  HttpException httpEx = (HttpException)ex;
  if(httpEx.GetHttpCode() == 404) {
    return;
  }
}
Server.Transfer("~/error.aspx");

答案 1 :(得分:0)

首先,您必须决定他们为何获得GlobalError.aspx。你向我们展示了两种可能性;也许还有更多。

将其中一个条目的名称更改为GlobalErrorX.aspx,看看会发生什么。