WCF DataContract:根据场景返回基类或继承类

时间:2012-03-19 09:14:42

标签: .net wcf inheritance

我正在开发一个旨在由非.NET客户端使用的WCF服务,该客户端执行充电操作。我希望能够返回基类DataContract或继承的类DataContract,具体取决于用例。

所以我有:

[DataContract]  
public class ChargeResponse  
{  
    [DataMember]  
    public string ID  

    [DataMember]  
    public string Description  
}  

对于成功的操作,我想返回一个具有额外DataMember的继承类型,例如:

[DataContract]  
public class SuccessfulChargeResponse : ChargeResponse  
{  
    [DataMember]  
    public string TransactionID  
}

对于所有其他情况,我会返回低音课程。这可能吗?或者我应该让DataMember是基类并返回一个空值。

3 个答案:

答案 0 :(得分:3)

是的,这是可能的。请尝试考虑以下回复 关键是在数据合同上使用属性'KnownType()。

详细说明:在基类之上使用[KnownType(typeof(SuccessfulChargeResponse))]属性。 该属性帮助序列化引擎将SuccessfulChargeResponse标记为ChargeResponse基类的派生类型。

现在DataContract标有其派生类型,响应可以是基类型或派生类型

希望这会有所帮助。祝你好运:)

参考此链接以供参考 http://msdn.microsoft.com/en-us/library/ms730167.aspx

答案 1 :(得分:1)

我认为这是一个基于SOAP的服务?如果是这样,提醒消费者他们有义务处理的故障或非成功情况的正确方法是在服务定义上公开故障合同。然后,您可以简单地抛出异常并让使用者捕获异常,就像服务操作是进程内方法一样。

为此,请使用服务定义中的FaultContract属性:

[OperationContract]
[FaultContract(typeof(MyChargeServiceExceptionType))]
ChargeResponse Charge(ChargeRequest request);

答案 2 :(得分:1)

您过于复杂 - 只需返回包含ChargeResponse的{​​{1}}即可。如果操作成功,TransactionID将有一个值,如果不成功,则TransactionID将为空。您可以进一步扩展您的类,以包含指示成功的标志或枚举,以及指示错误是什么所需的任何属性。

这称为请求/响应模式,非常常见。一些(可能非常令人兴奋,不一定非常新)的链接描述了这一点: