Я весь день изо всех сил пытался реализовать обработку ошибок в моем приложении ASP.NET MVC 2. Я посмотрел на различные методы, но ни одна из них не работает должным образом. Я использую MVC2 и .NET 4.0 (запустил проект до выпуска MVC3; мы обновим его после того, как выпустим наш первоначальный выпуск).
К этому моменту я буду рад правильно обработать ошибки 404 и 500 - 403 (требуется авторизация) тоже подойдет, а за ним последуют различные другие конкретные ответы. Прямо сейчас я получаю все 404, все 500, все 302 до 404 или все 302 до 500.
Вот мои требования (которые должны быть довольно близки к основным требованиям HTTP):
Если ресурс не найден, бросьте 404 и отобразите страницу, специфичную для 404, с запрошенным URL-адресом. НЕ возвращайте промежуточный код ответа, например, 302. В идеале, сохраняйте запрошенный URL-адрес, а не показывайте новый URL-адрес, такой как /Error/NotFound
, но если он отображается, убедитесь, что мы не возвращали ответ с перенаправлением, чтобы получить его.
Если произошла внутренняя ошибка сервера, бросьте 500 и отобразите ошибку, характерную для 500, с некоторым указанием того, что пошло не так. Опять же, не возвращайте промежуточный код ответа и в идеале не меняйте URL.
Вот что я бы назвал 404:
- Статический файл не найден:
/Content/non-existent-dir/non-existent-file.txt
- Контроллер не найден:
/non-existent-controller/Foo/666
- Контроллер найден, но действие не найдено:
/Home/non-existent-action/666
- Контроллер и действие найдено, но действие не может найти запрошенный объект:
/Home/Login/non-existent-id
Вот что я бы назвал 500:
- Опубликовать неверное значение:
POST /User/New/new-user-name-too-long-for-db-column-constraint
- Не связанная с данными проблема, например, конечная точка веб-службы не отвечает
Некоторые из этих проблем должны быть идентифицированы определенными контроллерами или моделями, и затем контроллеры должны выдавать соответствующее HttpException. Остальные должны быть обработаны более обобщенно.
Для случая 404 # 2 я попытался использовать собственную ControllerFactory, чтобы бросить 404, если контроллер не может быть найден.
Для случая 404 № 3 я попытался использовать собственный базовый контроллер для переопределения HandleUnknownAction
и выброса 404.
В обоих случаях я получаю 302 до 404. И я никогда не получаю 500 ошибок; если я изменю Web.config, чтобы поместить опечатку в мою конечную точку веб-службы, я все равно получу 302, а затем 404, говоря, что URL (контроллер / действие), который использует , веб-служба не может быть найдена.
Я также получаю запрошенный URL в виде (n нежелательных) параметров строки запроса: /Error/NotFound?aspxerrorpath=/Home/non-existent-action
Оба эти метода взяты из http://www.niksmit.com/wp/?p=17 (Как получить обычные страницы ошибок 404 (страница не найдена) с использованием ASP.Net MVC), на которые указывает http://richarddingwall.name/2008/08/17/strategies-for-resource-based-404-errors-in-aspnet-mvc/
Если в Web.config у меня есть <customErrors mode="On" defaultRedirect="~/Error/Unknown" redirectMode="ResponseRedirect" />
, я получаю соответствующий код ответа, но мой контроллер ошибок никогда не вызывается. Извлечение атрибута redirectMode
дает мне представление об ошибках MVC, но с промежуточным 302 и измененным URL - и всегда одним и тем же контроллером (Unknown
= 500; если я изменяю его на NotFound
, все выглядит как 404 ).
Вот некоторые другие вещи, которые я прочитал и попытался реализовать:
.. вместе с кучей сообщений StackOverflow.
Мне кажется, что такого рода обработка ошибок довольно проста для веб-приложений, и инфраструктура MVC должна иметь настройки по умолчанию, которые делают это «из коробки», и позволить людям расширять ее для работы в противном случае. Возможно, они сделают это в будущем выпуске. А пока кто-нибудь может дать мне подробную информацию о том, как реализовать правильные HTTP-ответы?