Лучший способ регистрировать ошибки в WCF
Как лучше всего перехватывать и регистрировать ошибки при разработке уровня сервиса WCF и почему?
Я могу придумать три способа,
1) Ручной try / catches вокруг каждого метода.
2) возложите ответственность на механизм WCF.
3) Используйте стороннюю библиотеку, такую как Enterprise Library Policy Injection/Logging.
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, поэтому вы можете использовать его в качестве атрибута в своих сервисных контрактах.
Log4net достаточно гибок, поэтому вы можете регистрировать то, что вам нужно и когда вам нужно.[ErrorPolicyBehavior] public interface IYourServiceContract { }
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 .