Подтвердить что ты не робот

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 в моем файле конфигурации.

Любые идеи?

Спасибо.

4b9b3361

Ответ 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").