Лучший способ регистрировать ошибки в 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.