Мы используем отличный ELMAH для обработки необработанных исключений в веб-приложении ASP.NET 3.5. Это очень хорошо работает для всего сайта, кроме служб WCF, которые используются с использованием функций REST. Когда в методах операций, которые не обрабатываются кодом приложения, возникает исключение, WCF обрабатывает его различными способами в зависимости от контрактов на обслуживание и параметров конфигурации. Это означает, что исключение не приводит к запуску события ASP.NET HttpApplication.Error, которое используется ELMAH. Два решения, о которых я знаю, касаются этого:
- Оберните все вызовы методов в try {} catch (Exception ex) {Elmah.ErrorSignal.FromCurrentContext(). Raise (ex); бросить; }, чтобы явно вызвать Elmah в блоке catch.
- Используйте IErrorHandler, как описано в Will Hughes ' сообщение в блоге Сделать WCF и ELMAH приятными вместе, чтобы отменить вызов ELMAH отдельному ErrorHandler.
Первый вариант чрезвычайно прост, но не совсем DRY. Второй вариант требует, чтобы вы каждый день украшали пользовательский атрибут после реализации атрибута и ErrorHandler. Я сделал это на основе Will, но я хочу проверить, что это правильный подход, прежде чем отправлять код.
Есть ли лучший способ, который я пропустил?
Документация MSDN для IErrorHandler говорит о том, что метод HandleError - это место для ведения журнала, но ELMAH обращается к HttpContext.Current. ApplicationInstance, который является нулевым в этом методе, хотя доступен HttpContext.Current. Выполнение вызова Elmah в методе ProvideFault является обходным путем, поскольку ApplicationInstance установлен, но это не соответствует намерению, описанному в документации API. Я что-то пропустил здесь? В документации указано, что вы не должны полагаться на метод HandleError, вызываемый в потоке операции, и поэтому ApplicationInstance имеет нулевое значение в этой области.