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

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

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

4 ответа

Решение

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

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

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

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

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

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

Резюме:

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

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

* Обновлено в апреле 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>


<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 выше

Раздел "Ошибки" в веб-конфигурации предназначен для обеспечения настраиваемого подхода к обработке ошибок 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

Другие вопросы по тегам