Подтвердить что ты не робот

Пользовательские ошибки, не работающие с IISExpress

У меня есть приложение asp.net mvc, и я пытаюсь получить пользовательские ошибки, работающие с IISExpress.

Работает отлично в Casini:

<customErrors mode="On" defaultRedirect="/error">
  <error statusCode="404" redirect="/error/notfound"/>
</customErrors>

Когда я ранее размещал сайты mvc в IIS (7.5), все, что мне нужно было сделать, чтобы мои пользовательские ошибки работали, заключалось в установке:

<httpErrors errorMode="Detailed"/>

Я пробовал явно указывать коды состояния в разделе httpErrors, но ничего не работает. Вот пример:

<httpErrors errorMode="Detailed" defaultResponseMode="Redirect">
  <clear/>
  <error statusCode="404" path="/error/notfound"/>
</httpErrors>

Любые идеи?

Спасибо Бен

4b9b3361

Ответ 1

Это было вызвано частично из-за моего непонимания того, как на самом деле вызываются пользовательские ошибки, а также тот факт, что (IMHO) обработка ошибок в asp.net mvc немного перепутана.

Первая проблема заключалась в том, что в ряде моих методов действия я проверял наличие объекта, например. сообщение в блоге и возврат HttpNotFoundResult, если сообщение в блоге было нулевым. Я был в предположении, что это будет отображать страницу пользовательских ошибок, которую я установил для 404 ошибок.

Однако это не так. Возврат HttpNotFoundResult просто устанавливает код состояния ответа на 404. Остальное обрабатывается IIS, отображая страницу ошибки IIS 404 или ваш браузер, если у нее есть собственная страница с ошибкой.

Одно из решений - вернуть HttpException, в котором будет использовать ваши страницы пользовательских ошибок, так как запрос обрабатывается asp.net.

Вместо этого я решил создать новый ActionResult, который позволил мне указать представление вместе с кодом состояния http. Я предпочел это бросить исключения.

Следующая проблема заключалась в том, что по умолчанию новый проект MVC имеет жадный маршрут. Если вы сделаете запрос на /foo/bar, то по умолчанию MvcHandler будет искать контроллер с именем Foo. Когда он не сможет найти его, он вернет 404.

Я удалил маршрут по умолчанию и не имел жадных маршрутов. Это означало, что URL-адреса, не соответствующие ни одному из моих маршрутов, не будут обрабатываться asp.net и просто вернутся в IIS.

Решением здесь было создание шаблона подстановки в нижней части моей конфигурации маршрутизации для соответствия другим всем другим запросам и пересылка их на пользовательское действие PageNotFound, которое устанавливает код состояния 404 и отображает мой пользовательский вид.

Некоторые вещи стоит указать.

  • Вам необходимо установить httpErrors errorMode="Detailed" для отображения страниц пользовательских ошибок в IIS/IISExpress. Остальное можно оставить в покое.
  • Настройка пути defaultRedirect в разделе customErrors не влияет на 500 ошибок. Это связано с тем, что глобальный HandleErrorAttribute обрабатывает все 500 ошибок и просто ищет вид, называемый "Ошибка" для отображения. Это означает, что если ваша пользовательская страница ошибки фактически является действием контроллера, она не будет вызываться. Вышеупомянутое верно, даже если вы явно указали страницу с ошибкой 500.
  • Однако вы все равно должны сохранять путь по умолчаниюRedirect, поскольку он будет использоваться для других кодов состояния, если они явно не указаны.

Ответ 2

Если вы используете iisexpress, вы можете просто прокомментировать весь раздел httpErrors <! - → в applicationhost.config и замените его следующим:

<httpErrors errorMode="Custom">
    <error responseMode="Redirect" statusCode="404" path="../missing/index.php" />
</httpErrors>

путь - это путь URL-адреса к вашей специальной странице сайта