MVC InvalidOperationException с пользовательскими страницами ошибок - PullRequest
10 голосов
/ 01 сентября 2011

У меня есть пользовательские страницы ошибок, настроенные с помощью

<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 ~ / Области / Футбол / Представления / Общий / Error.ascx ~ / Представления / Черновик / Error.aspx ~ / Views / Draft / Error.ascx ~ / Views / Shared / Error.aspx ~ / Представления / Общий / Error.ascx ~ / Области / Футбол / Представления / Черновик / Error.cshtml ~ / Районы / Футбол / Views / Проект / Error.vbhtml ~ / Areas / Футбол / Просмотров / Shared / Error.cshtml ~ / Области / Футбол / Виды / Общий доступ / Error.vbhtml ~ / Виды / Черновик / Error.cshtml ~ / Views / Draft / Error.vbhtml ~ / Views / Shared / Error.cshtml ~ / Просмотров / Shared / Error.vbhtml

Почему он ищет страницу ошибки в другом месте? Я удалил ~ / Views / Shared / Error.cshtml и добавил свою пользовательскую страницу ошибок в ~ / Home / Error, так как я указал новое значение по умолчанию в моем конфигурационном файле.

Есть идеи?

Спасибо.

Ответы [ 5 ]

28 голосов
/ 01 сентября 2011

Проекты MVC по умолчанию добавляет HandleErrorAttribute в Global.asax.cs файл

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

Этот фильтр выполняется при возникновении необработанного исключения.Он устанавливает вид как Error.Следовательно, среда выполнения MVC пытается визуализировать это представление.Но в вашем случае такого мнения нет.Таким образом, он снова генерирует другое исключение, которое обрабатывается средой выполнения ASP.NET и показывает страницу ошибки, которую вы настроили в Web.Config файле.

Вы можете создать свой собственный фильтр исключений и зарегистрировать его.

5 голосов
/ 11 сентября 2011

Я закончил регистрацией HandleErrorAttribute в Global.asax и просто воспользовался разделом <customErrors>. ELMAH теперь правильно регистрирует ошибки, и я могу указать пользовательские страницы ошибок.

Я что-то упустил?

1 голос
/ 24 февраля 2017

Вы также можете убедиться, что HandleErrorAttribute не зарегистрирован, удалив его из глобальных фильтров, используя метод Удалить :

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Remove(new HandleErrorAttribute());
        /* ... your other filters */
    }
}
0 голосов
/ 06 апреля 2018

Чтобы отключить ELMAH HandleErrorAttribute, добавьте следующую строку в раздел appSettings вашего файла Web.Config:

<!-- language: lang-xml -->
<add key="elmah.mvc.disableHandleErrorFilter" value="true" />
0 голосов
/ 12 июля 2015

Для будущих читателей этого поста обратите внимание, что Elmah добавляет свой собственный HandleErrorAttribute, поэтому также ожидает представление Error.cshtml.Обратите внимание, что я также установил пакет Elmah.MVC NuGet, но он просто используется для его правильной настройки.

Да, только что заметил на nuget.org, что Elmah.MVC отвечает за добавление HandleErrorAttribute:

Безболезненная интеграция функциональности ELMAH в ASP.NET MVC Application.Просто поместите пакет в ваше приложение ASP.NET MVC и получите доступ к / elmah URL.Также будет установлен глобальный фильтр HandleError, который гарантирует, что в журнал записываются все необработанные ошибки (даже если customError включен «On»).

...