这是我如何让它工作的:
创建一个实现 IServiceBehavior 的类。服务行为将添加实现 IErrorHandler 的类:
public class GlobalExceptionHandlerBehavior : IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcherBase dispatcherBase in
serviceHostBase.ChannelDispatchers)
{
var channelDispatcher = dispatcherBase as ChannelDispatcher;
if (channelDispatcher != null)
channelDispatcher.ErrorHandlers.Add(new ServiceErrorHandler());
}
}
public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
}
}
在调用 .Open() 之前插入设置主机时的行为:
logServiceHost.Description.Behaviors.Insert(0, new GlobalExceptionHandlerBehavior());
然后,您应该能够在 ServiceErrorHandler 类中的 ErrorHandler() 方法中放置一个断点,它应该会为您中断。这不需要 xml 配置,完全由代码驱动。