MVC InvalidOperationException с настраиваемыми страницами ошибок
У меня есть настраиваемые страницы с ошибками, используя
<customErrors mode="On" defaultRedirect="~/Home/Error">
<error statusCode="404" redirect="~/Home/PageNotFound" />
</customErrors>
Я создал страницу, которая выбрасывает и исключает, и я перенаправляюсь на правильные страницы ошибок.
Однако я замечаю эти ошибки в elmah на веб-сервере производства:
System.InvalidOperationException Представление "Ошибка" или его мастер было не найден или нет, механизм просмотра поддерживает найденные местоположения. были найдены следующие местоположения: ~/Районы/Футбол/Views/Проект/Error.aspx ~/Районы/Футбол/Views/Проект/Error.ascx ~/Areas/Футбол/Просмотров/Shared/Error.aspx ~/Районы/Футбол/Виды/Общие/Ошибка .ascx ~/Просмотры/Черновик/Ошибка .aspx ~/Views/Draft/Error.ascx ~/Views/Shared/Error.aspx ~/Views/Shared/Error.ascx ~/Районы/Футбол/Представления/Черновик/Ошибка .cshtml ~/Районы/Футбол/Views/Проект/Error.vbhtml ~/Areas/Футбол/Просмотров/Shared/Error.cshtml ~/Районы/Футбол/Представления/Общие/Error.vbhtml ~/Views/Draft/Error.cshtml ~/Views/Draft/Error.vbhtml ~/Views/Shared/Error.cshtml ~/Views/Shared/Error.vbhtml
Почему он ищет страницу с ошибкой в другом месте? Я удалил ~/Views/Shared/Error.cshtml и добавил мою страницу пользовательских ошибок в ~/Главная/Ошибка, так как я указал новый default в моем файле конфигурации.
Любые идеи?
Спасибо.
Ответы
Ответ 1
Проекты MVC по умолчанию добавляет HandleErrorAttribute в файл Global.asax.cs
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
Этот фильтр выполняется, когда генерируется необработанное исключение. Он устанавливает вид как Error
. Следовательно, среда выполнения MVC пытается отобразить это представление. Но в вашем случае такого мнения нет. Таким образом, он снова выдает другое исключение, которое обрабатывается средой выполнения ASP.NET и показывает вашу страницу ошибок, настроенную в файле Web.Config
.
Вы можете создать свой собственный фильтр исключительных ситуаций и зарегистрировать его.
Ответ 2
Я закончил регистрацию HandleErrorAttribute
в Global.asax и просто использовал раздел <customErrors>
. ELMAH теперь корректно регистрирует ошибки, и я могу указать пользовательские страницы ошибок.
Я что-то пропустил?
Ответ 3
Вы также можете убедиться, что HandleErrorAttribute
не зарегистрирован, удалив его из глобальных фильтров, используя метод Remove
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Remove(new HandleErrorAttribute());
/* ... your other filters */
}
}
Ответ 4
Для будущих читателей этого сообщения обратите внимание, что Elmah добавляет свой собственный HandleErrorAttribute
, а также ожидает представление Error.cshtml. Обратите внимание, что я также установил пакет Elmah.MVC NuGet, но это просто используется для правильной настройки.
Да, только что заметил на nuget.org, что Elmah.MVC отвечает за добавление HandleErrorAttribute:
Безболезненная интеграция функций ELMAH в ASP.NET MVC Заявка. Просто снимите пакет внутри приложения ASP.NET MVC и URL доступа /elmah. Он также установит глобальный фильтр HandleError, который гарантирует, что все необработанные ошибки регистрируются (даже если customError повернут "On").