Я пытаюсь использовать ELMAH для регистрации ошибок в моем приложении ASP.NET MVC, однако, когда я использую атрибут [HandleError] на своих контроллерах, ELMAH не регистрирует ошибки при их возникновении.
Как я догадываюсь, потому что ELMAH регистрирует только необработанные ошибки, а атрибут [HandleError] обрабатывает ошибку, поэтому нет необходимости регистрировать ее.
Как изменить или как изменить атрибут, чтобы ELMAH мог знать, что произошла ошибка, и зарегистрировать ее ...
Изменить: Позвольте мне убедиться, что все понимают, я знаю, что я могу изменить атрибут, который не вопрос, который я задаю ... ELMAH игнорируется при использовании атрибута handleerror, что означает, что он не увидит, что произошла ошибка, потому что она была обработана уже по атрибуту ... То, что я спрашиваю, есть ли способ заставить ELMAH увидеть ошибку и записать ее в журнал, даже если атрибут обработал ее ... Я искал и не вижу никаких методов для вызова, чтобы заставить его регистрировать Ошибка....
источник
Ответы:
Вы можете создать подкласс
HandleErrorAttribute
и переопределить егоOnException
член (не нужно копировать), чтобы он регистрировал исключение с помощью ELMAH, и только если базовая реализация обрабатывает его. Минимальное количество кода, которое вам нужно, выглядит следующим образом:Сначала вызывается базовая реализация, что дает возможность пометить исключение как обрабатываемое. Только тогда сигнализируется исключение. Приведенный выше код прост и может вызвать проблемы при использовании в среде, где он
HttpContext
может быть недоступен, например при тестировании. В результате вам понадобится более защищенный код (за счет того, что он немного длиннее):Эта вторая версия будет пытаться сначала использовать сигнализацию об ошибках от ELMAH, которая включает в себя полностью сконфигурированный конвейер, такой как регистрация, рассылка, фильтрация и прочее. В противном случае он пытается увидеть, следует ли фильтровать ошибку. Если нет, ошибка просто регистрируется. Эта реализация не обрабатывает почтовые уведомления. Если об исключении может быть сообщено, то письмо будет отправлено, если настроено для этого.
Возможно, вам также придется позаботиться о том, чтобы, если
HandleErrorAttribute
действуют несколько экземпляров, дублирование записи не происходило, но приведенные выше два примера должны помочь вам начать работу.источник
Извините, но я думаю, что принятый ответ является излишним. Все, что вам нужно сделать, это:
и затем зарегистрируйте его (порядок важен) в Global.asax.cs:
источник
HandleErrorAttribute
, не нужно переопределятьOnException
дальшеBaseController
. Это предполагает принятый ответ.new UnhandledLoggedException(Exception thrown)
который добавляет что-то кMessage
предыдущему.ElmahHandledErrorLoggerFilter()
просто записывая необработанные ошибки, но не обработанные. Я зарегистрировал фильтры в правильном порядке, как вы упомянули, какие-нибудь мысли?Теперь в NuGet есть пакет ELMAH.MVC, который включает в себя улучшенное решение Atif, а также контроллер, который обрабатывает интерфейс elmah в маршрутизации MVC (больше не нужно использовать этот axd)
. Проблема с этим решением (и со всеми приведенными здесь). ) так или иначе обработчик ошибок elmah фактически обрабатывает ошибку, игнорируя то, что вы, возможно, захотите настроить как тег customError или через ErrorHandler или ваш собственный обработчик ошибок
Лучшее решение IMHO - создать фильтр, который будет действовать в конце всех остальных фильтров и регистрировать события, которые уже были обработаны. Модуль elmah должен позаботиться о регистрации других ошибок, которые не обрабатываются приложением. Это также позволит вам использовать монитор работоспособности и все другие модули, которые можно добавить на asp.net, для просмотра событий ошибок.
Я написал это, глядя с отражателем на ErrorHandler внутри elmah.mvc
Теперь в настройках фильтра вы хотите сделать что-то вроде этого:
Обратите внимание, что я оставил там комментарий, чтобы напомнить людям, что если они хотят добавить глобальный фильтр, который будет обрабатывать исключение, он должен идти ДО этого последнего фильтра, в противном случае вы столкнетесь со случаем, когда необработанное исключение будет игнорироваться ElmahMVCErrorFilter, потому что оно не было обработано и должно быть зарегистрировано модулем Elmah, но затем следующий фильтр помечает исключение как обработанное, а модуль игнорирует его, в результате чего исключение никогда не превращается в elmah.
Теперь убедитесь, что настройки app для elmah в вашем webconfig выглядят примерно так:
Важным здесь является «elmah.mvc.disableHandleErrorFilter», если это false, он будет использовать обработчик внутри elmah.mvc, который фактически обработает исключение с помощью HandleErrorHandler по умолчанию, который будет игнорировать ваши настройки customError
Эта настройка позволяет вам устанавливать собственные теги ErrorHandler в классах и представлениях, при этом регистрируя эти ошибки через ElmahMVCErrorFilter, добавляя конфигурацию customError в ваш web.config через модуль elmah, даже записывая свои собственные обработчики ошибок. Единственное, что вам нужно сделать, - это не добавлять фильтры, которые будут обрабатывать ошибку до того, как мы написали фильтр elmah. И я забыл упомянуть: в Эльме нет дубликатов.
источник
Вы можете взять приведенный выше код и сделать еще один шаг вперед, представив собственную фабрику контроллеров, которая добавляет атрибут HandleErrorWithElmah в каждый контроллер.
Для получения дополнительной информации посмотрите мою серию блогов о входе в систему MVC. Первая статья посвящена настройке Elmah и работе на MVC.
В конце статьи есть ссылка на загружаемый код. Надеюсь, это поможет.
http://dotnetdarren.wordpress.com/
источник
Я новичок в ASP.NET MVC. Я столкнулся с той же проблемой, вот мой рабочий в моем Erorr.vbhtml (он работает, если вам нужно только зарегистрировать ошибку, используя журнал Elmah)
Это просто!
источник
Полностью альтернативное решение состоит в том, чтобы не использовать MVC
HandleErrorAttribute
, а вместо этого полагаться на обработку ошибок ASP.Net, с которой Elmah предназначен для работы.Вам необходимо удалить глобальный по умолчанию
HandleErrorAttribute
из App_Start \ FilterConfig (или Global.asax), а затем настроить страницу ошибки в вашем Web.config:Обратите внимание, что это может быть URL-адрес с маршрутизацией MVC, поэтому приведенное выше будет перенаправлять на
ErrorController.Index
действие при возникновении ошибки.источник
Для меня было очень важно, чтобы регистрация электронной почты работала. Через некоторое время я обнаружил, что для этого нужно всего лишь 2 строки кода в примере Atif.
Надеюсь, это кому-нибудь поможет :)
источник
Это именно то, что мне нужно для конфигурации моего сайта MVC!
Я добавил небольшую модификацию в
OnException
метод для обработки несколькихHandleErrorAttribute
экземпляров, как это предлагает Atif Aziz:Я просто проверяю
context.ExceptionHandled
перед вызовом базового класса, просто чтобы узнать, обрабатывал ли кто-то еще исключение перед текущим обработчиком.Это работает для меня, и я выкладываю код на случай, если кому-то еще это понадобится, и спрашиваю, знает ли кто-нибудь, пропустил ли я что-нибудь.
Надеюсь, это полезно:
источник