Я сам смотрел на это и то, как я его отсортировал, реализуя System.ServiceModel.Dispatcher.IErrorHandler:
public class EventLogErrorHandler : BehaviorExtensionElement, IErrorHandler, IServiceBehavior
{
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
var log = new EventLog("APPLICATION",Environment.MachineName, "SomeSourceName");
log.WriteEntry("PROVIDING FAULT", EventLogEntryType.Information);
}
public bool HandleError(Exception error)
{
var log = new EventLog("APPLICATION", Environment.MachineName, "SomeSourceName");
log.WriteEntry(error.ToString(), EventLogEntryType.Error);
return true;
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (var dispatcher in serviceHostBase.ChannelDispatchers)
(dispatcher as ChannelDispatcher).ErrorHandlers.Add(this);
}
protected override object CreateBehavior()
{
return new EventLogErrorHandler();
}
public override Type BehaviorType
{
get { return GetType(); }
}
}
Затем я могу добавить это в тег system.serviceModel внутри тега расширений, как показано ниже:
<extensions>
<behaviorExtensions>
<add name="errorhandler" type="SomeAssembly.SomeNamespace.EventLogErrorHandler, SomeAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
Наконец, добавьте это поведение к поведению ваших сервисов, и когда возникнет какая-либо ошибка, вы можете добавить правильную логику для обработки по своему усмотрению:
...
<errorhandler />
</behavior>
</serviceBehaviors>
</behaviors>
Надеюсь, это поможет,
Andrew