Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

Также, обратитесь к этому сообщению от меня о том, как обрабатывать сообщения об ошибках с помощью IIS7, если вы хотите иметь полный контроль над выводом ошибок.

Краткие сведения:

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

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

Другие советы

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

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

  • /myfakeextensionslessurl --> httpErrors 404
  • /myfakeaspsx.aspx --> Ошибки пользователя 404
  • /myfakeimage.jpg --> httpErrors 404 Ошибки
  • /throw500.apx --> Ошибки пользователя 500
  • /throw500 --> Ошибки пользователя 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;
 %>

Примечание:Использование 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 или ResponseRewriteResponseRedirect режим перенаправит страницу ошибки на пользовательскую страницу ошибки.Для средства поиска ссылок (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

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


ExecuteURL обслуживает динамический контент, такой как страница .aspx (the 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 ссылку выше

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

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

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

ниже приведены примеры, предназначенные для проверки ссылки на обработку ошибок 404 :

httperrors против customerrors в webconfig , iis, asp.net

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top