C# 在WCF服务通道调度程序上安装IErrorHandler

C# 在WCF服务通道调度程序上安装IErrorHandler,c#,.net,wcf,C#,.net,Wcf,我想在WCF服务上安装IErrorHandler的实现 我目前使用的代码似乎没有任何作用: logServiceHost = new ServiceHost(typeof(Logger)); logServiceHost.AddServiceEndpoint(typeof(ILogger), binding, address); // Implementation of IErrorHandler. var errorHandler = new ServiceErrorHandler();

我想在WCF服务上安装IErrorHandler的实现

我目前使用的代码似乎没有任何作用:

logServiceHost = new ServiceHost(typeof(Logger));
logServiceHost.AddServiceEndpoint(typeof(ILogger), binding, address);

// Implementation of IErrorHandler.
var errorHandler = new ServiceErrorHandler();

logServiceHost.Open();

// Add error handler to all channel dispatchers.
foreach (ChannelDispatcher dispatcher in logServiceHost.ChannelDispatchers)
{
    dispatcher.ErrorHandlers.Add(errorHandler);
}

我看到的所有代码示例(包括我在为WCF使用的书中)都显示了如何使用自定义创建的IServiceBehavior安装错误扩展。这是强制性的,还是我的方法也应该有效?

根据IErrorHandler,实例是通过行为添加的。没有提到任何其他机制,如您的示例。

以下是我如何使其工作的:

创建一个实现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)
    {
    }
}

然后,您应该能够在ServiceErrorHandler类中的ErrorHandler()方法中放置一个断点,它应该为您提供断点。这不需要xml配置,完全是代码驱动的。

Phil,我相信Jay的回答遵循了您提供的MSDN链接上的说明,他只是对本次讨论的要点进行了注释。然后,他通过最后一行代码添加/注册ServiceBehavior(以及IErrorHandler)


如果你问我的话,他的回答是对张贴的问题的解答。我刚刚在一个最小的自托管项目中对此进行了验证。

在打开logServiceHost之前,您是否尝试添加该行为?我一直使用自定义服务行为来实现这一点,因此我对答案非常好奇!在打开服务之前,ChannelDispatchers集合包含0项,这就是我在打开主机后执行此操作的原因。在与我的自托管服务战斗数小时后,使其运行正确的IErrorHandler。谢谢
logServiceHost.Description.Behaviors.Insert(0, new GlobalExceptionHandlerBehavior());