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


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

Я могу придумать три способа,

1) Ручной try / catches вокруг каждого метода.

2) возложите ответственность на механизм WCF.

3) Используйте стороннюю библиотеку, такую как Enterprise Library Policy Injection/Logging.

5 14

5 ответов:

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

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 предоставляет Средство просмотра трассировки службы читать .файлы svclog.

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

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

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

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

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