【问题标题】:FaultException and custom exception WCFFaultException 和自定义异常 WCF
【发布时间】:2011-08-08 16:51:26
【问题描述】:

我有一个关于如何将自定义异常作为 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 有效。有人可以启发我吗?

感谢您的帮助:)

【问题讨论】:

  • 奇数。我遇到了类似的问题,并且无需在我的自定义异常中添加 [DataContract] 属性即可使其正常工作。我只是错过了采用SerializationInfoSerializationContext 的构造函数。添加该构造函数对我有用。
  • @JeffBridgman 你的意思可能是Serialization.StreamingContext,而不是SerializationContext
  • @Teejay,正确。我引用了this constructor,但输入了错误的内容。

标签: wcf exception exception-handling custom-exceptions faultexception


【解决方案1】:

您当然需要将其标记为 DataContract。它是一种自定义类型,对方(您的客户)不知道。

【讨论】:

    【解决方案2】:

    您确实需要使用 [DataContract] 进行标记,如本页所述:http://msdn.microsoft.com/en-us/library/ms576199.aspx

    我假设(但不确定)ArgumentException 有效,因为它在线路的两侧都是已知的(假设您在每一侧都使用 .NET)。如果不将您的异常声明为 DataContract,则 DataContractSerializer 无法对其进行正确描述和序列化/反序列化。

    【讨论】:

    • 这篇MSDN 的帖子似乎暗示您可以将其标记为[Serializable] 和[DataContract]。在我的浏览器中导航到.svc 页面时,我个人遇到了一个错误,抱怨Type 'TestException' cannot be ISerializable and have DataContractAttribute attribute
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 2012-12-07
    • 2017-01-15
    相关资源
    最近更新 更多