MVC [HandleError] HandleErrorAttribute вызывается дважды при использовании глобального ведения журнала

В веб-приложении MVC3 я использовал

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

применить глобальную обработку ошибок, когда пользователю показывалось представление «Ошибка», если возникало необработанное исключение.

Для одного конкретного представления я также хотел, чтобы отображалось другое представление ошибок, если возникло необработанное исключение, украсив метод [HandleError(View = "SpecialError")]. Это сработало нормально.

Затем я хотел добавить глобальную регистрацию необработанных исключений. Я создал собственный атрибут HandleError с кодом регистрации :

public class MyHandleErrorAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext context)
        {
            // Write to log code
            base.OnException(context);
        }
    }

. И обновлены RegisterGlobalFilters и оформление метода, чтобы использовать вместо этого имя атрибута. Обычно это работает, но когда в методе, украшенном MyHandleError(View = "SpecialError")], возникает исключение, метод OnException вызывается дважды . Первоначально я предположил, что украшение метода этим атрибутом заменяет глобальный обработчик, но кажется, что он просто добавлен к (, что имеет больше смысла, но это не то, что мне нужно ). При двойном вызове OnException одно и то же исключение регистрируется дважды, что не должно происходить.Я не думаю, что OnException вызывается дважды , потому что это настраиваемый атрибут -Я полагаю, что это происходит и со стандартным атрибутом HandleError, просто теперь он виден, когда я создаю запись о нем.

В конечном счете, я хочу регистрировать все необработанные исключения (один раз ), сохраняя при этом функции, предлагаемые [HandleError], в частности, устанавливая различные представления для конкретных исключений метода. Есть ли чистый способ сделать это?

10
задан Paul George 12 July 2012 в 16:02
поделиться