Лучший способ регистрировать ошибки в WCF - PullRequest
14 голосов
/ 18 декабря 2009

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

Я могу думать о трех направлениях,

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

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

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

Ответы [ 5 ]

23 голосов
/ 18 декабря 2009

Я бы реализовал пользовательский 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 достаточно гибок, поэтому вы можете регистрировать, что вам нужно и когда вам нужно.

10 голосов
/ 18 декабря 2009

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: настройка трассировки .

Microsoft предоставляет Service Trace Viewer для чтения файлов .svclog.

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

2 голосов
/ 18 декабря 2009

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

2 голосов
/ 18 декабря 2009

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

1 голос
/ 18 декабря 2009

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

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

...