Исключение не передается на мою страницу ошибок в MVC4

У меня включен режим customErrors, и я перенаправляюсь на:

введите здесь описание изображения

Вот мой взгляд на мое решение:

введите здесь описание изображения

Всякий раз, когда у меня возникает необработанное исключение, мое приложение, как и ожидалось, перенаправляет меня на страницу ошибки. Но я теряю информацию об исключении, потому что, как я предполагаю, приложение перенаправляется. Я даже пробовал redirectMode="ResponseRewrite" в элементе customErrors, но это не сработало.

Итак, вот мое представление «Индекс» в моем контроллере ошибок, которое приложение перенаправляет, чтобы заметить модель:

введите здесь описание изображения

И еще ниже у меня есть:

введите здесь описание изображения

Но @Model имеет значение null. Как я могу получить информацию об исключении из перенаправления customErrors?


person Mike Marks    schedule 10.12.2013    source источник
comment
Если вы хотите зарегистрировать исходное исключение, вам нужно сделать это до перенаправления.   -  person Maess    schedule 10.12.2013
comment
@Maess Значит, если мне нужны подробности об исключении, я не смогу использовать перенаправление customErrors?   -  person Mike Marks    schedule 10.12.2013
comment
Нет, вам просто нужно подключить свой журнал перед перенаправлением, см. ответ ниже.   -  person Maess    schedule 10.12.2013


Ответы (1)


Чтобы получить эту модель, вам нужно использовать фильтр HandleErrorAttribute, чтобы поймать ошибку. Инструкции можно посмотреть здесь: http://www.c-sharpcorner.com/UploadFile/abhikumarvatsa/handleerrorattribute-or-error-handling-in-mvc-4/

TL;DR:

Отключите перенаправление, но убедитесь, что пользовательские ошибки все еще включены:

<customErrors mode="On"/>

Убедитесь, что фильтр HandleErrorAttribute зарегистрирован глобально (по умолчанию):

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
}

Переместите/переименуйте представление ошибок в ~\Views\Shared\Error.cshtml

person Laurent le Beau-Martin    schedule 10.12.2013
comment
Я сделал это, но он не отправляет меня на общую страницу Error.cshtml — он возвращает типичную ошибку сервера в /***** Желтый экран смерти приложения. - person Mike Marks; 11.12.2013
comment
И я также скажу, что я установил точку останова в FilterConfig.cs (RegisterGlobalFilters), и она никогда не срабатывает. Я очистил свое решение, начал с нуля, оно не попало. - person Mike Marks; 11.12.2013
comment
Вы уверены, что фильтр зарегистрирован глобально? В ASP.NET MVC 4+ метод RegisterGlobalFilters должен быть определен в App_Start\FilterConfig.cs, а в Global.asax.cs должен быть вызов к нему в Application_Start, например так: FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); - person Laurent le Beau-Martin; 11.12.2013
comment
Да, я проверил, все проверяется, как вы говорите. :( - person Mike Marks; 11.12.2013
comment
Application_Start вообще вызывается? Если нет, возможно, приложение не перезапускается должным образом... - person Laurent le Beau-Martin; 11.12.2013
comment
Нет это не так. Я буду исследовать. Спасибо за вашу помощь - person Mike Marks; 11.12.2013
comment
Иногда пул приложений IIS остается активным. Вы можете попробовать убить его вручную, чтобы убедиться, что он перезапущен и вызывается Application_Start. - person Laurent le Beau-Martin; 11.12.2013
comment
Будут ли ошибки HTTP (404 и т. д.) перенаправляться на мою страницу ошибок или это просто исключения? - person Mike Marks; 11.12.2013
comment
К сожалению нет. Чтобы обработать 404, вы можете использовать пользовательскую ошибку (<error statusCode="404" redirect="/error/notfound" />), но тогда это будет перенаправление, поэтому вы потеряете информацию. В качестве альтернативы ознакомьтесь с ответами на этот другой вопрос (остерегайтесь, некоторые из них являются старыми ответами для ASP.NET MVC 1 или 2): stackoverflow.com/questions/619895/ - person Laurent le Beau-Martin; 13.12.2013