首先,我是一名学生,一般都是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
详细信息(即cause
,additionalInfo1
或additionalInfo2
字段)尽管客户端已成功接收它们(在调试时可见) )。我无法弄清楚为什么我覆盖ToString
来打印这些字段。我知道我可以单独访问这些字段,但我想知道为什么这种方法不起作用。
我真的很感激任何人都可以给予帮助。
修改:结果只包含以下内容:
The creator of this fault did not specify a reason. (FaultDetail is equal to CustomFault).
编辑2:服务方法定义:
[OperationContract]
[FaultContract(typeof(CustomFault))]
void causeTypedFaultException();
答案 0 :(得分:0)
我不知道FaultException<T>
使用了其详细信息类型的ToString
方法,但.NET reference source似乎表明应该这样做。知道有用!
您的客户端是使用CustomFault
的原始类型定义,还是使用从服务元数据生成的版本(例如using "Add Service Reference", without choosing the option to reuse types in referenced assemblies)?后者是更常见的情况,因为它是一般的“与用其他语言编写的客户端互操作”的情况。它将生成一个客户端CustomFault
类型(“添加服务引用”隐藏在一个特殊的Reference.cs
源文件中),其中包含标记为DataMembers的所有字段和属性(即足以生成和解析) (线表示),但是服务元数据没有提供足够的信息来重新生成任何其他类型的成员 - 例如,没有办法用WSDL表示特定语言的ToString
方法实现,因为它太具体了,无法跨越互操作性语言和平台。因此,客户端CustomFault
未被覆盖ToString
。