2012-03-19 65 views
2

我正在开发一个WCF服务,该服务设计为由执行收费操作的非.NET客户端使用。我希望能够根据用例返回基类DataContract或继承类DataContract。WCF DataContract:根据场景返回基类或继承类

所以我必须:

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

    [DataMember] 
    public string Description 
} 

对于成功的操作,我想回有一个额外的数据成员,如继承类型:

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

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

+0

任何具体的推理这个链接,以这种方法吗?你可能认为'TransactionID'只是'[DataMember(IsRequired = false)]' – f0x 2012-03-19 09:23:51

+0

这是我的第一个WCF服务,所以我想我有很多东西要学习:)如果我使用你的方法,参数只会序列化,如果它有一个值? – 2012-03-19 09:35:10

+0

谢谢f0x,这个诀窍:) – 2012-03-19 10:05:26

回答

1

您现在的位置过于复杂 - 你只需要返回ChargeResponse包含TransactionID。如果操作成功TransactionID将具有值,则如果不是那么TransactionID将为空。您可以进一步扩展您的类,以包含指示成功的标志或枚举,以及您需要指出错误的属性。

这就是所谓的请求/响应模式,很常见。一些(可能很沉闷的,不一定很新)链接描述此:

1

我认为这是一个基于SOAP的服务?如果是这样,提醒消费者他们有义务处理的错误或不成功条件的正确方法是在服务定义上公开错误合同。然后,您可以简单地引发异常,让消费者捕获异常,就像服务操作是进程内方法时那样。

为此使用FaultContract属性,在服务定义:

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

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

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

既然DataContract标有它的派生类型,该响应可以是碱型或派生类型

希望这有助于的。好运:)

参考参考 http://msdn.microsoft.com/en-us/library/ms730167.aspx

+0

另请参阅[ServiceKnownTypeSttribute](http://msdn.microsoft.com/zh-cn/library/system.servicemodel.serviceknowntypeattribute.aspx)。 – 2012-05-02 12:54:30