Лучший способ регистрировать ошибки в WCF

Какой лучший способ поймать и занести в журнал ошибки при разработке уровня сервиса WCF и почему?

Я могу думать о трех путях,

1) Ручная попытка/улавливает каждый метод.

2) Оставьте ответственность за двигатель WCF.

3) Используйте стороннюю библиотеку, такую ​​как вставка/регистрация политики в корпоративной библиотеке.

Ответы

Ответ 1

Я бы выполнил пользовательский IErrorHandler и использовал log4net

[AttributeUsage (AttributeTargets.Interface)]
public class ErrorPolicyBehaviorAttribute : Attribute, IContractBehavior, IErrorHandler
    {
    private ILog m_logger;

    #region IErrorHandler

    public void ProvideFault (Exception error, MessageVersion version, ref Message fault)
        {
        return;
        }

    public bool HandleError (Exception error)
        {
        m_logger.Error (error.Message, error);
        return true;
        }

    #endregion

    #region IContractBehavior

    public void ApplyDispatchBehavior (ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
        {
        ...init logger
        ......Add this class to a list of dispatchRuntime.ChannelDispatcher.ErrorHandlers...
        }

    #endregion
    }

Этот класс также реализует IContractBehavior, поэтому вы можете использовать его как атрибут в ваших контрактах на обслуживание.

[ErrorPolicyBehavior]
public interface IYourServiceContract
{ }

log4net довольно гибкий, поэтому вы можете регистрировать то, что вам нужно, и когда вам нужно.

Ответ 2

WCF может быть сконфигурирован для вывода трасс для этапов процесса для всех компонентов приложений, таких как вызовы операций, исключения кода, предупреждения и другие важные события обработки.

Ниже приведен пример app.config для включения трассировки.

<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Warning" propagateActivity="true" >
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>

      <source name="myUserTraceSource" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>
    </sources>

    <sharedListeners>
      <add name="xml" 
           type="System.Diagnostics.XmlWriterTraceListener" 
           initializeData="TraceLog.svclog" />
    </sharedListeners>

  </system.diagnostics>
</configuration>

Подробнее о трассировке WCF можно узнать из MSDN: настройка трассировки.

Корпорация Майкрософт предоставляет средство просмотра трассировки служб для чтения файлов .svclog.

Помимо отслеживания, вы также можете рассмотреть возможность использования log4net для ведения журнала в приложении.

Ответ 3

Возможно, вам стоит проверить log4net. Здесь есть хороший учебник по CodeProject.

Ответ 4

Если вы запрашиваете фреймворк регистрации ELMAH, это также хороший вариант. Если вы не хотите, чтобы ваш код с помощью try/catch использовался для каждого метода, вы можете попробовать использовать AOP frameworks, который даст вам возможность обрабатывать исключения путем маркировки метода с помощью атрибутов

Ответ 5

Я бы пошел с номером 1. В основном из-за сокращения накладных расходов над номером 3 и номером 2 должно быть просто нет-нет.

Предположим, что вы все еще хотите, чтобы что-то записывали как файл или менеджер событий. Но я лично использовал бы log4net для него, поскольку он немного легче, чем весь материал entlib.