Мой вопрос тесно связан с этим вопросом .
Вот краткий обзор: мое приложение работает в классическом режиме.У меня есть следующий код в Global.asax
protected void Application_Error(Object sender, EventArgs e)
{
// ... boring stuff...
HttpContext.Current.Server.Transfer("~/MyErrorPage.aspx", true);
}
Все работает нормально (т.е. я вижу MyErrorPage.aspx), когда возникает ошибка, если
<httpErrors errorMode="Detailed" />
, но когда errorMode="Custom"
(илиerrorMode="DetailedLocalOnly"
и запрос от удаленного компьютера), я вижу страницу пользовательской ошибки IIS, за которой следует моя страница ошибки (MyErrorPage.aspx).
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- The contents of the default 500 page as configured in IIS
Which for me is the default %SystemDrive%\inetpub\custerr\<LANGUAGE-TAG>\500.htm
-->
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<!-- The contents of MyErrorPage.aspx -->
</html>
Если я удаляю страницу ошибки 500 по умолчанию изРаздел IIS страницы ошибок, затем я получаю следующий вывод (обратите внимание, что я получаю «Страница не может быть отображена ...» вместо пользовательской страницы 500)
The page cannot be displayed because an internal server error has occurred.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<!-- The contents of MyErrorPage.aspx -->
</html>
Если я шаг через код с помощью отладчиказатем я вижу, что страница IIS 500 сбрасывается на клиента, когда я перехожу через оператор Server.Transfer
.
Моя страница с ошибкой затем отправляется в браузер после нормального жизненного цикла страницы MyErrorPage.aspx (как вы бы это сделалиожидать).Я пытался (в отчаянии) очистить содержимое ответа (HttpContext.Current.Response.Clear()
) до Server.Transfer, но это не имеет никакого эффекта.Я также пытался позвонить Server.ClearError()
до передачи, но это также не имеет никакого эффекта.
Теперь, согласно связанному вопросу, "исправить" - установить errormode="Detailed"
, но я не хочу видетьподробные страницы ошибок для ошибок, которые не обрабатываются в ASP.Net - например, я бы предпочел видеть пользовательскую страницу 404 IIS вместо подробной страницы, если я введу URL myApp/DoesNotExist.html
.[Некоторые из наших клиентов настаивают на том, чтобы пользователи никогда не видели страницу с подробной ошибкой, поскольку она считается потенциальной уязвимостью в безопасности.]
Еще одно «исправление» - вместо этого перенаправить серверную передачу, но я бы предпочелпередача, если это возможно: передача означает, что URL-адрес браузера не изменился. Это означает, что, например, если ошибка произошла из-за того, что app. только запускается, они могут нажать F5, чтобы повторить запрос.Перенаправление явно меняет адрес браузера на страницу ошибки.
У кого-нибудь есть объяснение, почему я вижу это поведение?У кого-нибудь есть решение?
Заранее спасибо.
Редактировать
Я собрал небольшое приложение, которое демонстрирует поведение:
http://rapidshare.com/files/427244682/Err.zip
[Убедитесь, что приложение работает в классическом режиме.]
Если вы нажмете на ссылку, для которой установлены оба аргумента: Transfer и Setstatus, то вы увидите проблему, BANG