В чем разница между customErrors и httpErrors?

168

В чем разница между customErrorsи httpErrorsсекциями файла web.config в приложениях ASP.NET MVC?

Каковы рекомендации по использованию каждого раздела?

Алан Т
источник
1
IMHO - HttpError - это обработка на уровне IIS сообщений об ошибках, а CustomError - обработка ASP.Net для ошибок в веб-приложении. Но хотел бы знать больше ...
Солнечный

Ответы:

85

Отказ от ответственности: это из моего опыта, а не доказанный факт.

Оба используются для определения обработки ошибок для веб-сайта, но разные программы ссылаются на разные элементы конфигурации.

customErrors являются устаревшим (обратно совместимым) элементом, используемым Visual Studio Development Server (он же VSDS или Cassini).

httpErrors являются новым элементом, который используется только IIS7.

Это подчеркивает возможную проблему при разработке веб-сайтов ASP.NET при использовании VSDS вместо локального IIS.

Кроме того, обратитесь к этому посту, чтобы узнать, как обрабатывать сообщения об ошибках в IIS7, если вы хотите полностью контролировать вывод ошибок.

Резюме:

  • Разработка в VSDSиспользованииcustomErrors
  • Публикация сайта для IIS6использованияcustomErrors
  • Публикация сайта для IIS7использования httpErrors.

и если вы разрабатываете, VSDSно публикуете IIS7, то, я думаю, вам понадобятся оба.

Pure.Krome
источник
30
customErrors для asp.net. Ошибки HTTPE предназначены для IIS7, поэтому они обрабатывают контент, который не проходит через обработчик .net (например, .png, .js и т. д.). Если вам нужны страницы ошибок для типов контента, отличных от .NET, используйте страницы ошибок IIS (httpErrors для IIS7 , пользовательский интерфейс для IIS6.)
zcrar70
4
Я рекомендую установить и использовать IIS 7 Express с Visual Studio для целей отладки. Он будет использовать те же параметры конфигурации, что и обычный IIS 7, в отличие от Cassini.
Шон
больше нет необходимости использовать customErrors от @johnB. И тоже надо? 1.) включить «Отправить ошибки в браузер» в разделе «ASP». Свойства отладки 2.) в разделе «Страницы ошибок / Редактировать настройки функций» выберите «Подробные ошибки». 3.) отключить «Показывать дружественные сообщения об ошибках HTTP» в IE stackoverflow.com/questions/2640526/…
Kiquenet
136

* Обновлено в апреле 2016

Атрибут customErrors используется, когда код .net вызывает исключение (404, 403, 500 и т. Д.), А атрибут httpErrors используется, когда сам IIS создает исключение.

  • / myfakeextensionslessurl -> httpErrors 404
  • /myfakeaspsx.aspx -> customErrors 404
  • /myfakeimage.jpg -> httpErrors 404
  • /throw500.apx -> customErrors 500
  • / throw500 -> customErrors 500

Есть много ловушек, пытающихся настроить это правильно. Так что, если вы ищете быстрый пример, лучшие 2 варианта у вас есть:

Пример 1. Использование HTML-страниц

<system.web>
  <customErrors mode="RemoteOnly" defaultRedirect="/Error500.html" redirectMode="ResponseRewrite">
    <error statusCode="403" redirect="/Error403.html" />
    <error statusCode="404" redirect="/Error404.html" />
    <error statusCode="500" redirect="/Error500.html" />
  </customErrors>
</system.web>
<system.webServer>
  <httpErrors errorMode="DetailedLocalOnly" existingResponse="Auto">
    <remove statusCode="403" />
    <remove statusCode="404" />
    <remove statusCode="500" />
    <error statusCode="403" responseMode="File" path="Error403.html" />
    <error statusCode="404" responseMode="File" path="Error404.html" />
    <error statusCode="500" responseMode="File" path="Error500.html" />
  </httpErrors>
</system.webServer>

Пример 2: использование страниц aspx

<system.web>
  <customErrors mode="RemoteOnly" defaultRedirect="/Error500.html" redirectMode="ResponseRewrite">
    <error statusCode="403" redirect="/Error403.aspx" />
    <error statusCode="404" redirect="/Error404.aspx" />
    <error statusCode="500" redirect="/Error500.aspx" />
  </customErrors>
</system.web>
<system.webServer>
  <httpErrors errorMode="DetailedLocalOnly" existingResponse="Auto">
    <remove statusCode="403" />
    <remove statusCode="404" />
    <remove statusCode="500" />
    <error statusCode="403" responseMode="ExecuteURL" path="Error403.aspx" />
    <error statusCode="404" responseMode="ExecuteURL" path="Error404.aspx" />
    <error statusCode="500" responseMode="ExecuteURL" path="Error500.aspx" />
  </httpErrors>
</system.webServer>

И на страницах ошибок aspx вам нужно сделать что-то вроде этого (пример страницы 404):

<% 
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true;
 %>

Примечание. Использование расширений less url в разделе customErrors невозможно! , (без хаков)

Обходной путь - отключить пользовательские ошибки и позволить ошибкам http обрабатывать пользовательскую страницу. Друг создал такую ​​настройку, когда найду время, поделюсь кодом.

Задний план

Хорошая пользовательская страница ошибки будет:

  1. Показать реальное исключение, когда вы посещаете проблемную страницу локально
  2. Показывать пользовательскую страницу при удаленном посещении страницы с проблемами
  3. Не будет перенаправлять, а просто показывать содержимое страницы с ошибкой (по причинам SEO)
  4. Покажет правильный код статуса

Итак, чтобы уточнить некоторые параметры в нашем конфиге:

  1. <customErrors mode="RemoteOnly", Вы можете задать здесь: On, Off, RemoteOnly.

    • On = Всегда показывать пользовательские страницы ошибок
    • Off = Всегда показывать реальную ошибку
    • RemoteOnly= Показать ошибку локально, но показать страницу с ошибкой удаленно. Итак, мы хотим RemoteOnlyдля утверждения 1
  2. <customErrors redirectMode="ResponseRewrite", Вы можете указать здесь: ResponseRedirectили ResponseRewrite. ResponseRedirectРежим перенаправления на страницу ошибки на страницу ошибки. Для сканера ссылок (SEO) это приведет к 302 -> 500, но вы хотите, чтобы сканер ссылок получил ошибку 500.

  3. <httpErrors errorMode="DetailedLocalOnly", Это эквивалент customErrorsрежима. Параметры , которые у вас есть: Custom, Detailed, DetailedLocalOnly.

Хорошая запись в блоге, которая мне очень помогла: http://benfoster.io/blog/aspnet-mvc-custom-error-pages

Мартен Кифт
источник
Какого рода отношения customErrors - httpErrors и IIS config вроде «Отправить ошибки браузеру» в ASP - Свойства отладки и «Страницы ошибок / Редактировать настройки функций», «Подробные ошибки». ? stackoverflow.com/questions/2640526/…
Kiquenet
36

<customErrors> против <httpErrors>


<customErrors>

  • все еще доступен в IIS7 +
  • указать пользовательские страницы ошибок для запросов, обрабатываемых ASP.NET
  • обрабатывает только запросы в приложении ASP.NET
  • статические файлы, такие как файлы HTML или каталоги («дружественные»), URL не обрабатываются

<httpErrors>

  • введены в IIS7
  • указать пользовательские страницы ошибок для запросов, обрабатываемых IIS
  • обрабатывает запросы в приложении ASP.NET И / ИЛИ обрабатывает запросы вне приложения - ASP.NET *
  • все файлы и URL обрабатываются *

Примечание: больше нет необходимости использовать customErrors

Цитируемый источник: Custom 404 и страницы ошибок в ASP.NET (отличная статья)


ExecuteURLобслуживает динамическое содержимое, например страницу ASPX ( pathзначение должно быть относительным URL-адресом сервера ):

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL" >
    <remove statusCode="404"/>
    <error statusCode="404" responseMode="ExecuteURL" path="/error.aspx" />
  </httpErrors>
</system.webServer>

File обслуживает пользовательский файл ошибок, например страницу HTML.

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="File" >
    <remove statusCode="404"/>
    <error statusCode="404" path="404.html" />
  </httpErrors>
</system.webServer>

Ссылка: Ошибки HTTP (www.iis.net)

для более подробной информации, прочитайте ссылку www.iis.net выше

Johnb
источник
Может быть полезно ** stackoverflow.com/questions/2640526/… **, если объединить httpErrors с «Отправить ошибки в браузер» и страницы ошибок
Kiquenet
3
+1 за примечание it's no loger necesary to use customErrorsи цитату, это - действительно информация, за которой я был :-)
Myster
4

Раздел ошибок в веб-конфигурации предназначен для обеспечения настраиваемого подхода к обработке ошибок http. Есть два раздела: один customErrors внутри раздела system.web и другой httpErrors внутри раздела system.webServer (как показано ниже)

customErrors: этот раздел использовался до введения IIS 7, IIS 6 5 и до полного использования этого раздела для обработки пользовательских ошибок http в соответствии с кодом состояния http.

Ошибки http: IIS 7 и более поздние версии используют этот раздел, а также раздел customErrors для обработки пользовательских ошибок http на основе их расширений файлов, если запрашиваемое расширение страницы регистрируется в ISAPI dll (.aspx, ashx, .asmx, .svc и т. д.), например index.aspx затем IIS забирает настройку из раздела customeErrors, иначе он выбирает настройку из httpErrors (режим размещения IIS 7 должен быть настроен как интегрированное, а не классическое настроение)

ниже приведены примеры для 404 ссылки проверки ошибок:

httperrors против клиентских ошибок в webconfig, iis, asp.net

Рохит
источник