powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Пользовательские страницы ошибок, настройка блока httpErrors в web-config
23 сообщений из 23, страница 1 из 1
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39518608
Oleg5555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для пользовательских страниц ошибок использую настройку блока system.webServer -> httpErrors в web-config. Данная настройка работает для ISS 7 и выше. Настройка такая:

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
<httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="400" />
      <remove statusCode="403" />
      <remove statusCode="404" />
      <error statusCode="400" path="/Error/BadRequest" responseMode="ExecuteURL" />
      <error statusCode="403" path="/Error/Forbidden" responseMode="ExecuteURL" />
      <error statusCode="404" path="/Error/NotFound" responseMode="ExecuteURL" />
</httpErrors>



И есть Error контроллер:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public class ErrorController : Controller
{
     public ActionResult BadRequest()
     {
         Response.StatusCode = 400;
         return View();
     }

     public ActionResult Forbidden()
     {
         Response.StatusCode = 403;
         return View();
     }

     public ActionResult NotFound()
     {
         Response.StatusCode = 404;
         return View();
     }
}



Для перечисленных кодов все работает отлично.

Но получаю такую проблему, если сервером будет выброшена ошибка которая не перечислена у меня в конфиге (например в коде бросаю exception и полую HTTP 500), то получаю чистую страницу со строкой нечитаемых символов - "Невозможно отобразить эту страницу РІРІРёРґСѓ того, что произошла внутренняя ошибка сервера."

Если для обработки исключений в коде использовать фильтр ошибок и класс HandleErrorAttribute или фильтр ошибок и класс с собственной реализацией IExceptionFilter или переопределение метода OnException в контроллере с установкой filterContext.Result, то в случае exception получаю тоже самое, чистую страницу со строкой нечитаемых символов. Полагаю потому, что настройка httpErrors работает на уровне IIS и поверх asp.net. И в случае отсутствия соответствующего кода в конфиге выдает такой странный ответ. Если же выключить настройку httpErrors (errorMode="Detailed"), то обработка exception через фильтры или переопределение метода работает, выводиться представление из Shared/Error.

Получается, что при настройке пользовательских ошибок через httpErrors в конфиге мне нужно перечислить все возможные коды. Пробовал установить параметры по умолчанию на статический файл ошибки:
Код: html
1.
<httpErrors errorMode="Detailed" existingResponse="Replace" defaultResponseMode="File" defaultPath="/Shared/Error.html">


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

В итоге, подскажите пожалуйста, как мне настроить пользовательские страницы в конфиге в httpErrors (перечислить там только некоторые основные), чтобы при получение ошибки не перечисленной в конфиге получить нормальную страницу с ошибкой сервера (может стандартную)? Или как добиться того, чтобы обработка exception через фильтр работала и не "перезатиралась" настройкой httpErrors в конфиге?
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519276
Oleg5555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может кто-нибудь тогда подскажет, как кто делать пользовательские страницы ошибок?
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519338
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну какие хочешь отдельно обработать ты уже указал для других укажи всегда один урл какой то общий и все.
Код: c#
1.
2.
3.
4.
5.
6.
<httpErrors errorMode="Custom" defaultPath="/Error">
  <clear />
  <error statusCode="404" path="/Error404" responseMode="ExecuteURL" />
  <error statusCode="500" path="/Error500" responseMode="ExecuteURL" />
....
</httpErrors>
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519383
Oleg5555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видимо, я как-то не так настраиваю конфиг. Когда устанавливаю параметр defaultPath всегда сервер выдает ошибку 500.19 - Запрашиваемая страница не доступна из-за неверной конфигурации данных для этой страницы. И ругается на строку конфига - <httpErrors errorMode="Custom" ... >. Пробовал разные варианты, сделал статический html, задавал такие варианты:

defaultPath="~/Shared/Error.html"
defaultPath="~/Shared/Error.htm"
defaultPath="/Shared/Error.html"
defaultPath="/Shared/Error.htm"

Сделал в Error контроллере метод:

Код: c#
1.
2.
3.
4.
5.
public ActionResult InternalServerError()
{
     Response.StatusCode = 500;
     return View();
}



И соответствующее представление, задал параметр defaultPath="/Error/InternalServerError", тоже самое. Как в итоге то правильно настроить?
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519502
Oleg5555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как исправить ошибку 500.19 нашел - https://serverfault.com/questions/53712/in-iis-7-how-do-i-set-up-a-default-error-document-for-any-error. Оказывается в applicationhost.config есть блок для httpError в котором могут быть заблокированы атрибуты. Необходимо вместо

Код: xml
1.
<httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath">


использовать

Код: xml
1.
<httpErrors lockAttributes="allowAbsolutePathsWhenDelegated">


Но полностью проблема не решена все равно. Например, при таком конфиге:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<httpErrors errorMode="Custom" existingResponse="Replace" defaultPath="/Error/InternalServerError" defaultResponseMode="ExecuteURL">
      <remove statusCode="400" />
      <remove statusCode="403" />
      <remove statusCode="404" />
      <error statusCode="400" path="/Error/BadRequest" responseMode="ExecuteURL" />
      <error statusCode="403" path="/Error/Forbidden" responseMode="ExecuteURL" />
      <error statusCode="404" path="/Error/NotFound" responseMode="ExecuteURL" />
    </httpErrors>


в случае выброса exeption в методе действия (HTTP 500) параметр defaultPath="/Error/InternalServerError" не отрабатывает, метод InternalServerError контроллера не запускается. На выходе снова получаю пустую страницу с нечитаемыми символами. Если же явно обработать ошибку 500 в конфиге:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="400" />
      <remove statusCode="403" />
      <remove statusCode="404" />
      <remove statusCode="500" />
      <error statusCode="400" path="/Error/BadRequest" responseMode="ExecuteURL" />
      <error statusCode="403" path="/Error/Forbidden" responseMode="ExecuteURL" />
      <error statusCode="404" path="/Error/NotFound" responseMode="ExecuteURL" />
      <error statusCode="500" path="/Error/InternalServerError" responseMode="ExecuteURL" />
    </httpErrors>


то метод InternalServerError запускается, корректная страница выводится. Получается default параметр не отрабатывает и нужно перечислять все коды ошибок HTTP. Может кто-нибудь знает, почему выводится такая странная страница с нечитаемыми символами? И почему еще может не работать defaultPath?
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519513
Oleg5555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Текст вывода - "Невозможно отобразить эту страницу РІРІРёРґСѓ того, что произошла внутренняя ошибка сервера." при подборе правильной кодировки такой - "
Невозможно отобразить эту страницу ввиду того, что произошла внутренняя ошибка сервера.". Почему тогда не хочет запускаться Error/InternalServerError непонятно.
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519517
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg5555,

Код: xml
1.
2.
3.
      <remove statusCode="403" subStatusCode="-1" />
      <remove statusCode="404" subStatusCode="-1" />
      <remove statusCode="500" subStatusCode="-1" />
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519520
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg5555,

Код: c#
1.
2.
3.
    [SessionState(SessionStateBehavior.Disabled)]
    [OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
    public class ErrorController : Controller



тоже желательно
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519521
Oleg5555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе все понятно стало. При таком варианте web.config:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<httpErrors errorMode="Custom" existingResponse="Replace" defaultPath="/Error/InternalServerError" defaultResponseMode="ExecuteURL">
      <remove statusCode="400" />
      <remove statusCode="403" />
      <remove statusCode="404" />
      <error statusCode="400" path="/Error/BadRequest" responseMode="ExecuteURL" />
      <error statusCode="403" path="/Error/Forbidden" responseMode="ExecuteURL" />
      <error statusCode="404" path="/Error/NotFound" responseMode="ExecuteURL" />
</httpErrors>



я не очистил statusCode="500", а он был наследован из applicationhost.config:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<httpErrors lockAttributes="allowAbsolutePathsWhenDelegated">
            <error statusCode="401" prefixLanguageFilePath="%IIS_BIN%\custerr" path="401.htm" />
            <error statusCode="403" prefixLanguageFilePath="%IIS_BIN%\custerr" path="403.htm" />
            <error statusCode="404" prefixLanguageFilePath="%IIS_BIN%\custerr" path="404.htm" />
            <error statusCode="405" prefixLanguageFilePath="%IIS_BIN%\custerr" path="405.htm" />
            <error statusCode="406" prefixLanguageFilePath="%IIS_BIN%\custerr" path="406.htm" />
            <error statusCode="412" prefixLanguageFilePath="%IIS_BIN%\custerr" path="412.htm" />
            <error statusCode="500" prefixLanguageFilePath="%IIS_BIN%\custerr" path="500.htm" />
            <error statusCode="501" prefixLanguageFilePath="%IIS_BIN%\custerr" path="501.htm" />
            <error statusCode="502" prefixLanguageFilePath="%IIS_BIN%\custerr" path="502.htm" />
</httpErrors>



поэтому и default не отработывал, а срабатывал

Код: xml
1.
<error statusCode="500" prefixLanguageFilePath="%IIS_BIN%\custerr" path="500.htm" />



плюс что-то с кодировкой был в этом варианте, поэтому такой результат.
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519522
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg5555,

Также ошибка может быть в самой вьюхе, или в Layout. Поэтому не стоит заменять страницы ошибок 500, 403 на действия контроллера. 404 куда ни шло. Лучше статические HTML, так как если ошибка будет где-то в лейаутах или вьюхах, вся мулька со страницами ошибок накроется медным тазом.
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519526
Oleg5555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttOleg5555,

Код: c#
1.
2.
3.
    [SessionState(SessionStateBehavior.Disabled)]
    [OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
    public class ErrorController : Controller



тоже желательно

Ок, спасибо за комментарии
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519843
Oleg5555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С реализацией через ErrorController вроде разобрался. По поводу статических страниц ошибок согласен. Но при попытке такой реализации опять столкнулся с проблемой. Например, при таком конфиге с responseMode="File":

Код: xml
1.
2.
3.
4.
<httpErrors errorMode="Custom" existingResponse="Replace" defaultPath="/Errors/Default.aspx" defaultResponseMode="File">
      <clear/>
      <error statusCode="404" path="/Errors/404.html" responseMode="File"/>
</httpErrors>


при возникновении соответствующей ошибки (например, 404) опять выводится какая-то стандартная страница в непонятной кодировке. Если же использовать responseMode="ExecuteURL" все работает, заданные в конфиге страницы отображаются, но такой режим не сохраняет HTTP код и при всех ошибках на клиенте получаю код 200. Может кто знает, какую еще особенность я упустил для такого варианта настройки?
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519852
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg5555,

В случае любых нестатических методов: действие контроллера, хендлер, aspx странцица, код ошибки надо устанавливать вручную.
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519867
Oleg5555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttOleg5555,

В случае любых нестатических методов: действие контроллера, хендлер, aspx странцица, код ошибки надо устанавливать вручную.

Не, тут проблема в другом. Не работало даже для 404.html. А не работало потому, что в режиме responseMode="File", слешы должны быть как в файловой системе, обратные и на первом месте слеш не нужен. Должно быть так:

Код: xml
1.
2.
3.
4.
<httpErrors errorMode="Custom" existingResponse="Replace" defaultPath="Errors\Common.html" defaultResponseMode="File">
      <clear/>
      <error statusCode="404" path="Errors\404.html" responseMode="File"/>
</httpErrors>


В итоге 404.html работает. Но defaultPath не работает, опять какая-то стандартная страница в неверной кодировке для случая default. Надо дальше копать.
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519943
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg5555В итоге 404.html работает. Но defaultPath не работает, опять какая-то стандартная страница в неверной кодировке для случая default. Надо дальше копать.

Попробуй полный путь задать.
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519955
Oleg5555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttOleg5555В итоге 404.html работает. Но defaultPath не работает, опять какая-то стандартная страница в неверной кодировке для случая default. Надо дальше копать.

Попробуй полный путь задать.

А полный путь это какой? У меня папка Errors находится в корне проекта.
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39519991
Oleg5555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробовал указать полный абсолютный путь на моем локальном компьютере до файла Common.html в качестве значения параметра defaultPath (defaultPath="D:\_Проекты\Web\...\Errors\Common.html"), default отработал. А при таком варианте defaultPath="Errors\Common.html" не отрабатывает. Очень странно. Я же не могу в проекте использовать в конфиге такой абсолютный путь. Может кто-то знает от чего это зависит?
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39520051
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39520117
Oleg5555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообщем не нашел я почему в defaultPath не работает относительный путь на статический ресурс. Единственный вариант сделать страницу Default.html на уровне iss и настроить конфиг так:

Код: xml
1.
2.
3.
4.
5.
<httpErrors errorMode="Custom" existingResponse="Replace" defaultPath="%SystemDrive%\inetpub\custerr\Default.html" defaultResponseMode="File">
      <clear/>
      <error statusCode="404" path="Errors\404.html" responseMode="File"/>
      ...
</httpErrors>
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39520128
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg5555,

Зачем вообще так заморачиваться? :)
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39520129
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg5555,

Переходи на Core, там такой мудотни нет ;)
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39520256
Oleg5555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не думал, что для такой стандартной задачи будут всплывать такие заморочки. Core еще не пробовал, в нем такая задача решается просто? Вообще, платформа достаточна свежая, какие у вас отзывы о ней?
...
Рейтинг: 0 / 0
Пользовательские страницы ошибок, настройка блока httpErrors в web-config
    #39520263
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg5555Не думал, что для такой стандартной задачи будут всплывать такие заморочки. Core еще не пробовал, в нем такая задача решается просто? Вообще, платформа достаточна свежая, какие у вас отзывы о ней?

Мы с ней работаем, уже довольно взрослая платформа, хоть и не без косяков. Решается с помощью middleware.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Пользовательские страницы ошибок, настройка блока httpErrors в web-config
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]