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