WCF捕获自定义FaultException

时间:2012-08-29 08:36:50

标签: wcf faultexception

我想使用像这样的客户FaultException

 [DataContract]
public class Fault
{
    [DataMember]
    public string Message { get; set; }
}

public class MyFault<T>:FaultException<T> where T : Fault
{
     public MyFault(T faultClass)
        : base(faultClass, new FaultReason(faultClass.Message))
    {

    }
}

...

throw new MyFault<Fault>(new Fault {Message = "hello"});

...

界面

[OperationContract]
[FaultContract(typeof(Fault))]
string GetData2(int value);

但是当它到达客户端时,它会转换为FaultException

      try
        {
            var res = serv.GetData2(1);
        }
        catch (MyFault<WcfService1Sample.Fault> ex)
        {
            label1.Text = ex.Reason.ToString(); //-> i want here
        }
        catch (FaultException<ServiceReference1.Fault> ex)
        {
            label1.Text = ex.Reason.ToString(); //-> catch here
        }
        catch (Exception)
        {

            throw;
        }

我能抓住克林特的自定义错误吗? 或者WCF自动将其转换为FaultException 我如何使这个问题发挥作用

谢谢kfir

1 个答案:

答案 0 :(得分:1)

我认为有两个问题。第一:

  • shambulator说的是什么:您的自定义Fault课程必须是
    • a DataContract,并使用
    • DataMember标记所有要序列化的属性。

如果这样做,那么WCF将

  • 将服务端throw new FaultException<MyFault>(new MyFault { ... });转换为包含您的错误的消息,包括数据;和
  • 将客户端的此错误转换为FaultException<MyFault>

第二

此客户端FaultException<>由WCF生成。也许一个人可以注册一个自定义的Exception-Translator,但我从来没有使用它,从来没有需要它,并且在一分钟Google搜索之后没有找到这样的东西。我建议您使用FaultException以及自定义故障类型。