Пользовательские ошибки не работают с IISExpress - PullRequest
13 голосов
/ 10 июня 2011

У меня есть приложение 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>

Есть идеи?

Спасибо, Бен

Ответы [ 2 ]

13 голосов
/ 11 июня 2011

Это было вызвано отчасти из-за моего неправильного понимания того, как на самом деле вызываются пользовательские ошибки, а также из-за того, что (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 и отображает мое настраиваемое представление.

Некоторые вещи, на которые стоит обратить внимание.

  1. Вам нужно будет установить httpErrors errorMode="Detailed" для отображения пользовательских страниц ошибок в IIS / IISExpress.Остальные, однако, можно оставить в покое.
  2. Установка пути defaultRedirect в разделе customErrors не влияет на 500 ошибок.Это потому, что глобальный HandleErrorAttribute обрабатывает все 500 ошибок и просто ищет для отображения представление под названием «Ошибка».Это означает, что если ваша пользовательская страница ошибки фактически является действием контроллера, она не будет вызвана.Вышеприведенное верно даже в том случае, если вы явно указали страницу ошибки 500.
  3. Однако вы все равно должны сохранять путь defaultRedirect, так как он будет использоваться для других кодов состояния, если они не указаны явно.
0 голосов
/ 30 ноября 2016

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

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

путь - это URL-адрес вашей страницы, специфичной для вашего сайта

...