Ошибка приложения ASP.NET при замене 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, в то время как последней ошибкой сервера была «Страница 'foo.aspx' не найдена».

Что мне нужно сделать, чтобы это работало правильно?


person Pete Michaud    schedule 14.07.2009    source источник


Ответы (2)


В функции Application_Error вы должны только Server.Transfer, если ошибка не страница не найдена / ошибка 404. В этих случаях оставьте ASP.NET перенаправление с использованием настроек в web.config.

Вы можете выяснить, является ли это 404-й, используя следующее:

Exception ex = Server.GetLastError();
if (ex.GetType() == typeof(HttpException))
{
  HttpException httpEx = (HttpException)ex;
  if(httpEx.GetHttpCode() == 404) {
    return;
  }
}
Server.Transfer("~/error.aspx");
person Steve Temple    schedule 14.07.2009
comment
Я думал об этом, но, как я уже сказал, даже когда страница не найдена, StatusCode равен 200, а не 404. - person Pete Michaud; 14.07.2009
comment
Это работает, как и следовало ожидать, но кажется неуклюжим, не так ли? Почему я должен это обнаруживать? Почему web.config не работает так, как я ожидал? - person Pete Michaud; 15.07.2009
comment
Я думаю, что, имея дело с ним в функции Application_Error, он не передает его перенаправлению, указанному в web.config. Когда я прочитал официальную документацию, функция Application_Error ведет журнал, а затем web.config выполняет перенаправление на страницу удобного сообщения об ошибке. Конечно, тогда у вас нет доступа к объекту ошибки, поэтому нелегко отобразить что-то значимое. - person Steve Temple; 15.07.2009

Для начала вам нужно решить, почему они получают GlobalError.aspx. Вы показали нам две возможности; может быть, есть еще.

Измените имя одной из этих записей на GlobalErrorX.aspx и посмотрите, что произойдет.

person John Saunders    schedule 14.07.2009
comment
Когда я удаляю defaulRedirect, он толкает пользователя в то же место. Очевидно, что две ссылки на файл избыточны. - person Pete Michaud; 14.07.2009
comment
Я только что понял, что ошибка 404 может означать, что он не может найти страницу с ошибкой. Проверьте журнал IIS. - person John Saunders; 14.07.2009
comment
Нет, страница 404 появляется при прямой загрузке, а в журнале написано, что foo.aspx не найден. Проблема на самом деле в некоторых умных пользователях. Я использую страницу под названием bar.aspx. На клиентском сайте панель называется foo. Когда они загружают bar.aspx, они видят большой заголовок с надписью Foo - это просто разница в терминах между различными клиентами, которые мы обрабатываем так же, как языковой словарь. Проблема в том, что они пытаются загрузить foo.aspx напрямую и получают экран с ошибкой, который заставляет их думать, что foo.aspx не работает, тогда как на самом деле ошибка означает, что foo.aspx не существует, как они думают. - person Pete Michaud; 15.07.2009