В чем разница между customErrors и httpErrors? - PullRequest
155 голосов
/ 19 марта 2010

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

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

Ответы [ 4 ]

123 голосов
/ 23 августа 2013

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

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

  • / myfakeextensionslessurl -> httpErrors 404
  • / myfakeaspsx.aspx -> customErrors 404
  • / myfakeimage.jpg -> httpErrors404
  • / 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 равно notвозможно! . (без хаков)

Одно из возможных решений - отключить пользовательские ошибки и разрешить ошибкам 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

78 голосов
/ 20 марта 2010

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

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

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

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

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

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

Резюме:

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

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

33 голосов
/ 02 августа 2014

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


<customErrors>

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

<httpErrors>

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

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

Источник цитирования: Пользовательские 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 выше

4 голосов
/ 16 августа 2013

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

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

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

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

httperrors и userrors в webconfig, iis, asp.net

...