Мы используем превосходный 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, как описано в Запись в блоге Уилла Хьюза Обеспечение совместной работы WCF и ELMAH, чтобы исключить вызов ELMAH в отдельный ErrorHandler.
Первый вариант чрезвычайно прост, но не совсем DRY. Второй вариант требует, чтобы вы украсили каждую службу настраиваемым атрибутом только после реализации атрибута и ErrorHandler. Я сделал это на основе работы Уилла, но хочу убедиться, что это правильный подход перед размещением кода.
Есть ли способ получше, который я пропустил?
В документации MSDN для IErrorHandler говорится, что < strong> HandleError - это место для ведения журнала, но ELMAH обращается к HttpContext. Текущий. ApplicationInstance, который в этом методе имеет значение NULL, хотя HttpContext.Current доступен. Вызов Elmah в методе ProvideFault - это обходной путь, поскольку ApplicationInstance установлен, но это не соответствует намерению, описанному в документации API. Я что-то здесь упускаю? В документации указано, что вы не должны полагаться на метод HandleError, вызываемый в потоке операции, что может быть причиной того, что ApplicationInstance имеет значение null в этой области.