首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >客户端WCF ExceptionHandler

客户端WCF ExceptionHandler
EN

Stack Overflow用户
提问于 2014-10-08 09:26:31
回答 1查看 184关注 0票数 3

是否可以使用TimeoutException在客户端上处理诸如BehaviorExtension、EndpointNotFoundException、OperationTimeoutException等错误?

我不想每次使用WCF代理时都尝试捕获日志重新启动连接。

此代码不起作用:

行为:

代码语言:javascript
复制
public class EndpointBehavior:IEndpointBehavior
{
    public void Validate(ServiceEndpoint endpoint)
    {

    }

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {

    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {


    }

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        var handler = new WcfErrorHandler();
        clientRuntime.CallbackDispatchRuntime.ChannelDispatcher.ErrorHandlers.Add(handler);
    }
}

处理程序:

代码语言:javascript
复制
public class WcfErrorHandler:IErrorHandler
{
    public bool HandleError(Exception error)
    {
        Log.Instance.Trace(@"WCF Service Error:", error);
        return true;
    }

    public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
    {
        var newEx = new FaultException(
           string.Format(@"Exception caught at WcfErrorHandler{0} Method: {1}{2}Message:{3}",
                        Environment.NewLine, error.TargetSite.Name, Environment.NewLine, error.Message));

        var msgFault = newEx.CreateMessageFault();
        fault = Message.CreateMessage(version, msgFault, newEx.Action);
    }

}

app.config的扩展

代码语言:javascript
复制
public class ExceptionLogBehaviorExtensionElement : BehaviorExtensionElement
{
    public override Type BehaviorType
    {
        get 
        {
            return typeof(EndpointBehavior);
        }
    }

    protected override object CreateBehavior()
    {
        return new EndpointBehavior();
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-06-30 22:59:37

您的代码无法工作,因为IErrorHandler是一个服务器端的功能。

在您的代码中,您似乎要将错误处理程序添加到客户端请求中,但实际上并非如此。这是因为clientRuntime.CallbackDispatchRuntime是一个类似服务器的实体,它驻留在客户机中,用于从双工操作中的真正服务器接收消息。

关于客户端异常处理的主要问题,我推荐的最好是IClientMessageInspector。以下是一些帮助您入门的代码:

代码语言:javascript
复制
public sealed class LoggingEndpointBehavior : IEndpointBehavior
{
    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { }

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        clientRuntime.ClientMessageInspectors.Add(new LoggingInspector());
    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { }

    public void Validate(ServiceEndpoint endpoint) { }
}

public sealed class LoggingInspector : IClientMessageInspector
{
    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        Console.WriteLine("BeforeSendRequest");
        return null;
    }

    public void AfterReceiveReply(ref Message reply, object correlationState)
    {
        Console.WriteLine("AfterReceiveReply");
    }
}

但是,请注意,IClientMessageInspector有一个缺点。它的AfterReceiveReply方法是对服务器的成功和错误的答复调用的,但是当根本没有任何应答时,就不会被称为,例如TimeoutExceptionEndpointNotFoundException等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26253479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档