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

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

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

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

2) Оставьте ответственность перед механизмом WCF.

3) Пользуйтесь сторонней библиотекой, такой как Инжекция/Вход политики Библиотеки Предприятия.

14
задан Kye 20 October 2016 в 09:50
поделиться

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

24
ответ дан 1 December 2019 в 07:06
поделиться

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

2
ответ дан 1 December 2019 в 07:06
поделиться

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 Tool ] для чтения файлов .svclog.

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

10
ответ дан 1 December 2019 в 07:06
поделиться

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

2
ответ дан 1 December 2019 в 07:06
поделиться

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

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

1
ответ дан 1 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: