我有一个关于如何将自定义异常作为FaultException发送的问题。当我使用像ArgumentException这样的系统异常时,它可以工作,但是如果我将它更改为我的自定义异常“TestException”,它就会失败。当我尝试添加它时,我无法获得服务引用的配置。
使用:
[OperationContract]
[FaultContract(typeof(ArgumentException))]
[TransportChannel TestMethod ();
public Void TestMethod()
{
throw new FaultException<ArgumentException>(new ArgumentException("test"), new FaultReason("test"));
}
不起作用:
[OperationContract]
[FaultContract(typeof(TestException))]
[TransportChannel TestMethod ();
public Void TestMethod()
{
throw new FaultException<TestException>(new TestException("test"), new FaultReason("test"));
}
我的“TestException”如下所示:
[Serializable()]
public class TestException: Exception
{
public TestException () : base() { }
public TestException (string message) : base(message) { }
public TestException (string message, Exception innerException) : base(message, innerException) { }
public TestException (System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { }
}
我想我必须在自定义对象上添加一个DataContract,但我不明白为什么它不会像它一样工作,因为ArgumentException有效。有人可以开导我吗?
感谢您的帮助:)
答案 0 :(得分:7)
您需要按照本页所述的[DataContract]进行标记:http://msdn.microsoft.com/en-us/library/ms576199.aspx。
我假设(但不确定)ArgumentException是有效的,因为它在线的两端都是已知的(假设你在每一侧都使用.NET)。如果不将您的异常声明为DataContract,则DataContractSerializer无法正确描述和序列化/反序列化。
答案 1 :(得分:0)
您当然需要将其标记为DataContract。这是一种自定义类型,另一方(您的客户)不知道。