Здесь странная проблема. Всем известно, что если вы используете customErrors
раздел web.config для создания настраиваемой страницы ошибок, вы должны установить Response.StatusCode
все , что вам подходит. Например, если я создам настраиваемую страницу 404 и назову ее 404.aspx, я могу вставить <% Response.StatusCode = 404 %>
содержимое, чтобы у нее был настоящий заголовок статуса 404.
Следуй за мной так далеко? Хорошо. Теперь попробуйте сделать это на IIS7. Я не могу заставить его работать, и точка. Если Response.StatusCode
он установлен на настраиваемой странице ошибок, IIS7, похоже, полностью переопределяет настраиваемую страницу ошибок и показывает собственную страницу состояния (если она у вас настроена).
Кто-нибудь еще видел такое поведение и, возможно, знает, как его обойти? Он работал под IIS6, поэтому я не знаю, почему все изменилось.
Примечание: это не то же самое, что проблема в ASP.NET Custom 404 Returning 200 OK вместо 404 Not Found
Ответы:
Установите для existingResponse значение PassThrough в разделе system.webServer / httpErrors:
Значение по умолчанию для свойства existingResponse - Auto:
Дополнительные сведения: чего ожидать от настраиваемого модуля ошибок IIS7
источник
<httpErrors existingResponse="PassThrough" />
эквивалентResponse.TrySkipIisCustomErrors
или же они ведут себя по- другому?Response.TrySkipIisCustomErrors
вами лучше контролировать, когда отображать пользовательские ошибки IIS.Самый простой способ сделать поведение согласованным - сбросить ошибку и использовать Response.TrySkipIisCustomErrors и установить для него значение true. Это переопределит обработку страницы глобальной ошибки IIS на вашей странице или глобальный обработчик ошибок в Application_Error.
Обычно это следует делать в обработчике Application_Error, который обрабатывает все ошибки, которые обработчики ошибок приложения не улавливают.
Более подробную информацию можно найти в этом сообщении блога: http://www.west-wind.com/weblog/posts/745738.aspx
источник
customError
сработало настроенное в Web.config. СResponse.TrySkipIisCustomErrors = true
я получаю такое же поведение: отображаются Уродливые сервер сгенерированных страниц ошибок. При его установкеfalse
ничего не происходит - пустое окно браузера.Server:Microsoft-IIS/8.5 X-AspNet-Version:4.0.30319 X-AspNetMvc-Version:5.2 X-Powered-By:ASP.NET
customErrors mode="Off"
чтобы это работало. Если я это сделаю, то httpErrors existingResponse = "Auto" (по умолчанию) будет работать у меня правильно, когда я использую код из этого ответа.Решено: оказывается, что «Подробные ошибки» должны быть включены, чтобы IIS7 мог «пропустить» любую страницу с ошибкой, которая у вас может быть. См. Http://forums.iis.net/t/1146653.aspx
источник
Я не уверен, похоже это по природе или нет, но я решил проблему, которая на первый взгляд кажется похожей, и вот как я с этим справился.
Прежде всего, значение по умолчанию для existingResponse (Auto) было правильным ответом в моем случае, поскольку у меня есть собственные 404, 400 и 500 (я мог бы создать другие, но этих трех будет достаточно для того, что я делаю). Вот соответствующие разделы, которые мне помогли.
Из web.config:
И
Оттуда я добавил это в Application_Error на global.asax:
На каждой из моих настраиваемых страниц ошибок я должен был указать правильный код статуса ответа. В моем случае я использую настраиваемый 404 для отправки пользователей в разные разделы моего сайта, поэтому я не хочу, чтобы возвращался код состояния 404, если это действительно не мертвая страница.
Во всяком случае, вот как я это сделал. Надеюсь, это кому-то поможет.
источник
Эта проблема была большой головной болью. Ни одно из ранее упомянутых предложений само по себе не решило эту проблему, поэтому я включаю свое решение. Для справки, наша среда / платформа использует:
В частности, я пытался получить ответ HTTP 404, который перенаправлял бы пользователя на нашу настраиваемую страницу 404 (через настройки Web.config).
Во-первых, мой код должен был создать файл
HttpException
. Возврат aNotFoundResult
с контроллера не дал тех результатов, которые мне нужны.Тогда я должен был Configure как
customErrors
иhttpError
узлов в Web.config....
Обратите внимание, что я оставил
existingResponse
asAuto
, который отличается от предоставленного решения @sefl.Эти
customErrors
параметры оказались необходимы для обработки моего явно брошеноHttpException
, аhttpErrors
узел обрабатывается URL - адреса , которые выпадали из шаблонов маршрутов , указанных в Globals.asax.cs.PS С этими настройками ставить не нужно
Response.TrySkipIisCustomErrors
источник
TrySkipIisCustomErrors
это только часть головоломки. Если вы используете настраиваемые страницы ошибок, но также хотите доставить некоторый контент RESTful на основе статусов 4xx, у вас есть проблема. Установка httpErrors.existingResponse web.config на «Авто» не работает, потому что .net, кажется, всегда доставляет некоторое содержимое страницы в IIS, поэтому использование «Авто» приводит к тому, что все (или, по крайней мере, некоторые) пользовательские страницы ошибок не используются. Использование «Заменить» тоже не сработает, потому что ответ будет содержать ваш код статуса http, но его содержимое будет пустым или заполнено страницей пользовательской ошибки. А «PassThrough» фактически отключает CEP, поэтому его нельзя использовать.Поэтому, если вы хотите обойти CEP в некоторых случаях (под обходом я имею в виду возврат статуса 4xx с некоторым содержимым), вам понадобится дополнительный шаг: очистите ошибку:
Поэтому, если вы хотите использовать ответ REST (например, 400 - Bad Request) и отправлять с ним некоторый контент, вам просто нужно будет
TrySkipIisCustomErrors
где-то установить действие и установитьexistingResponse
значение «Auto» в разделе httpErrors в web.config. Сейчас:Если вы хотите вернуть статус с пустым содержимым из вашего действия, он будет рассматриваться как пустой ответ и будет отображаться CEP, поэтому есть место для улучшения этого кода.
источник
По умолчанию IIS 7 использует подробные настраиваемые сообщения об ошибках, поэтому я предполагаю, что Response.StatusCode будет равно 404.XX, а не просто 404.
Вы можете настроить IIS7 для использования более простых кодов сообщений об ошибках или изменить свой код, обрабатывающий более подробные сообщения об ошибках, которые предлагает IIS7.
Дополнительная информация доступна здесь: http://blogs.iis.net/rakkimk/archive/2008/10/03/iis7-enables-custom-error-pages.aspx
Дальнейшее расследование показало, что у меня все было не так - подробных сообщений нет по умолчанию, но, возможно, они были включены в вашем ящике, если вы видите разные сообщения об ошибках, которые вы упомянули.
источник