Атрибут, кажется, не действует вообще
У меня проблемы с использованием атрибута [HandleError] в действиях моего контроллера - он, похоже, не работает вообще (то есть не имеет значения, есть фильтр или нет - я получаю те же результаты...). Когда выдается исключение, я получаю стандартную страницу "Ошибка сервера" красного цвета на странице "/" приложения вместо моего настраиваемого представления.
Я нашел несколько других тем на эту тему здесь, на SO, и в большинстве случаев кажется, что установка параметра customErrors в On в web.config решила проблему. Это не для меня, поэтому мне нужно найти другое решение.
Действие моего контроллера:
[HandleError]
public ActionResult Index()
{
throw new Exception("oops...");
return View();
}
В моем файле web.config
<customErrors mode="On"></customErrors>
Я позаботился о том, чтобы файл Error.aspx также находился в общем каталоге. Что мне не хватает?
Я использую ASP.NET MVC RC Refresh.
Ответы
Ответ 1
Две полезные вещи, которые нужно знать:
По умолчанию HandleError
ничего не делает при работе под сервером разработки. Цель состоит в том, чтобы показать разработчикам более полезную информацию:
public virtual void OnException(ExceptionContext filterContext) {
if (filterContext == null) {
throw new ArgumentNullException("filterContext");
}
// If custom errors are disabled, we need to let the normal ASP.NET
// exception handler execute so that the user can see useful
// debugging information.
if (filterContext.ExceptionHandled
|| ! filterContext.HttpContext.IsCustomErrorEnabled) {
return;
}
Обратите внимание, что именно этот случай должен контролировать customError
. Если настройка customError="On"
не меняет это поведение:
- Проверьте свой синтаксис.
- Убедитесь, что вы редактируете
Web.config
в корневом каталоге проекта, а не в представлениях.
- Убедитесь, что кодовые наборы отсутствуют
HttpContext.IsCustomErrorEnabled
.
- Если ничего не помогает, попробуйте отключить отладку в
Web.config
Во-вторых, существуют определенные типы ошибок, которые HandleError
никогда не будет обрабатывать, в частности ошибки компиляции ASP.NET. Вы не говорите, с какой ошибкой вы столкнулись.
Ответ 2
Вы также должны указать, на какую страницу перенаправлять.
<customErrors mode="On" defaultRedirect="Error.aspx" />
ОБНОВЛЕНИЕ: Извините, часть/Shared/не должна делать ставки там, но вы должны указать MVC, на какую страницу отправить пользователю сообщение об ошибке .aspx. Затем маршрут по умолчанию ищет что-то с именем Error.aspx в общем.
Было очень поздно! :) Наверное, поэтому кто-то дал мне минус за ответ! :) По крайней мере, здесь работает, приятель!
Ответ 3
У меня возникла та же проблема, и мне потребовалось два полных дня, чтобы окончательно ее решить. Оказалось, что я получил ошибку на странице Site.Master, и Error.aspx использовал эту же главную страницу, как и все другие страницы. Очевидно, Error.aspx не может справиться с такой ситуацией.
Мое решение состоит в том, чтобы создать определенную страницу Error.master, которая является легкой и не содержит никаких данных модели. Кроме того, я создал статический Error.htm в случае возникновения ошибки из Error.aspx. Параметр Web.config имеет следующий вид:
<customErrors mode="On">
<error statusCode="500" redirect="Error.htm" />
</customErrors>
Надеюсь, это поможет.
Ответ 4
Другой причиной этой проблемы может быть
В шаблонном приложении MVC (создан VS2008/VS2008 Express) Error.aspx (создан VS) использует мастер-страницу.
Если мастер-страница получит доступ к каким-либо данным ViewData, она выдаст исключение нулевой ссылки, тогда error.aspx не будет отображаться.
Используйте этот простой код в качестве Error.aspx, он решит проблему (вместе с CustomErrors = On)
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>
Ответ 5
Чтобы обойти проблему 404, когда предполагалось показать Error.aspx, мне пришлось исключить Error.aspx из раздела httpHandler, который препятствовал непосредственному доступу к любым представлениям (в среде mvc 2). Я сделал это, поместив Error.aspx в подпапку "Error" и поместив web.config в эту подпапку с <remove path="*" verb="*" />
в разделе httpHandlers. Моя версия этой проблемы (и ее решение) может быть специфичной для MVC 2.
Не забудьте обновить ссылку defaultRedirect при перемещении Error.aspx :)
Ответ 6
Я попробовал вышеупомянутые предложения, но у меня ничего не получалось. Что за хитрость удаляла эту строку из моих действий в контроллере ошибок.
Response.StatusCode = (int)HttpStatusCode.NotFound;
Я выдернул волосы, так как сообщения об ошибках IIS продолжали перехватывать мою обработку ошибок. И хотя это не идеально, так как я хочу предоставить этот код состояния в своем ответе, я обнаружил, что его удаление не позволило IIS 7+ вмешиваться в мою обработку ошибок.
DaTribe