1

首先,我是一名学生,一般来说是 WCF 和 C# 的新手。我试图演示在发生键入的 WCF FaultException 时返回给客户端的响应。我有一个像这样定义的类型化异常:

[DataContract]
public class CustomFault {
    [DataMember]
    public string cause;

    [DataMember]
    public string additionalInfo1;

    [DataMember]
    public string additionalInfo2;

    public CustomFault(string cause, string additionalInfo1, string additionalInfo2) {
        this.cause = cause;
        this.additionalInfo1 = additionalInfo1;
        this.additionalInfo2 = additionalInfo2;
    }

    public override string ToString() {
        return string.Format("\ncause: {0}\nadditionalInfo1: {1}\nadditionalInfo2: {2}\n", this.cause, this.additionalInfo1, this.additionalInfo2);
    }
}

而且我有一个服务,它FaultException<CustomFault>在使用此行调用时简单地抛出一个:

throw new FaultException<CustomFault>(new CustomFault("Specified cause", "additional info 1", "additional info 2"));

我有一个测试客户端,它调用服务方法,捕获异常并在消息框中打印异常:

 try {
      exampleServiceClient.causeTypedFaultException();
     } 
 catch (FaultException<CustomFault> faultException) {
            MessageBox.Show(faultException.ToString());
     }

我的问题是结果不包括CustomFault细节(即causeadditionalInfo1additionalInfo2字段),尽管客户端成功接收到它们(调试时可见)。我不知道为什么,因为我已经覆盖ToString打印这些字段。我知道我可以单独访问这些字段,但我想知道为什么这种方法不起作用。

我真的很感谢任何人可以提供的任何帮助。

编辑:结果只包含这个:

The creator of this fault did not specify a reason. (FaultDetail is equal to CustomFault).

编辑2:服务方法定义:

  [OperationContract]
  [FaultContract(typeof(CustomFault))]
  void causeTypedFaultException();
4

1 回答 1

0

相关问题

我不知道它FaultException<T>使用了ToString详细类型的方法,但.NET 参考源似乎建议它应该这样做。知道有用!

您的客户是使用 的原始类型定义CustomFault,还是使用从服务元数据生成的版本(例如,使用“添加服务引用”,而不选择在引用的程序集中重用类型的选项)?后者是更常见的情况,因为它是一般的“与用其他语言编写的客户端互操作”的情况。它将生成一个客户端CustomFault类型(“添加服务引用”将其隐藏在一个特殊的Reference.cs源文件中),其中包含所有标记为 DataMembers 的字段和属性(即足以生成和解析有线表示),但服务元数据不'没有提供足够的信息来重新生成任何其他类型的成员 - 没有办法表示特定语言的ToString例如,使用 WSDL 的方法实现,因为它对于跨语言和平台的互操作性来说太具体了。所以客户端CustomFault不会被覆盖ToString

于 2015-11-23T00:07:31.583 回答