【问题标题】:WCF catch custom FaultExceptionWCF 捕获自定义 FaultException
【发布时间】:2012-08-30 15:14:24
【问题描述】:

我想像这样使用custome 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;
        }

我可以在 clint 上捕获自定义错误吗? 或 WCF 自动将其转换为 FaultException 我该如何解决这个问题

感谢冷杉

【问题讨论】:

  • 你的Fault 类应该有一个DataContract 属性,而Message 属性应该是一个DataMember
  • 你对我忘了把数据合同。但即使我添加它,它也不会像我想要的那样工作。

标签: wcf faultexception


【解决方案1】:

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

  • shambulator 所说的:您的自定义 Fault 类必须是
    • DataContract,然后使用
    • DataMember 标记所有应序列化的属性。

如果这样做了,那么 WCF 将

  • 将服务端throw new FaultException&lt;MyFault&gt;(new MyFault { ... }); 转换为包含您的故障的消息,包括数据;和
  • 在客户端将此故障转换为FaultException&lt;MyFault&gt;

第二:

此客户端 FaultException&lt;&gt; 由 WCF 生成。也许可以注册一个自定义的异常翻译器,但我从来没有使用过,从来不需要它,并且在谷歌搜索一分钟后没有找到这样的东西。我建议只使用 FaultException 加上自定义故障类型。

【讨论】:

  • 谢谢。你是对的,我搜索了更多然后一分钟我谷歌并可以找到它,这就是我发布它的原因。你也许是对的,我可以使用常规的 FaultException
猜你喜欢
  • 2017-01-15
  • 2013-04-09
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
相关资源
最近更新 更多