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