Ответ 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, поскольку он будет использоваться для других кодов состояния, если они явно не указаны.