2012-03-19 11 views
2

私は、非.NETクライアントによって消費されるように設計されたWCFサービスを開発しています。使用例に応じて、基本クラス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

+0

これは私の最初のWCFサービスなので、私は学ぶべきことがたくさんあると思います:)あなたのメソッドを使うならば、値がある場合は直列化されますか? –

+0

ありがとうf0x、これはトリックでした:) –

答えて

1

:これはあなたのサービス定義でFaultContract属性を使用して行うには

。操作が成功した場合はTransactionIDに値があり、そうでなかった場合はTransactionIDはnullになります。クラスをさらに拡張して、成功を示すフラグや列挙、エラーの内容を示すために必要なプロパティを含めることができます。

これは要求/応答パターンとして知られており、かなり一般的です。これを記述したいくつかの(おそらく非常にありきたりと必然的に非常に新しいものではない)リンク:

1

これはSOAPベースのサービスですか?そうであれば、消費者に対処することが義務付けられている障害または不成功状態を消費者に警告する正しい方法は、障害定義をサービス定義に公開することです。次に、例外をスローして、サービス操作がインプロセス・メソッドの場合と同様に、例外をキャッチすることができます。あなたは、単にTransactionIDが含まれているChargeResponseを返却する必要がある - あなたが過度に複雑され

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

はい、それは可能です。以下の回答を考えてみてください 鍵はデータ契約の上に属性 'KnownType()を使用することです。

詳細:ベースクラスの上に[KnownType(typeof(SuccessfulChargeResponse))]属性を使用します。 属性は、直列化エンジンがChargeResponse基底クラスの派生型としてSuccessfulChargeResponseをマークするのを助けます。

今のDataContractは、その派生型でマークされていること、応答はこのことができます基本型または派生型

希望のいずれかのものとすることができます。グッドラック:)

は、このメソッドへの参照として http://msdn.microsoft.com/en-us/library/ms730167.aspx

+0

[ServiceKnownTypeSttribute](http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceknowntypeattribute.aspx)も参照してください。 –

関連する問題