2012-04-12 7 views
5

私は、ダイナミック型を返すと、次のようになります。ServiceContractを持っています。しかし、私はDataContractをサービスに使っていないので、クライアントはそれについて何も知らず、アクセスすることもできません。はのDataContractとダイナミックな戻り値の型WCF

DataContractは、以下のようなものです:

[DataContract] 
public enum OpenIdStatus 
{ 
     [EnumMember] 
     Authenticated, 
     [EnumMember] 
     Authenticating, 
     [EnumMember] 
     Cancelled, 
     [EnumMember] 
     Failed, 
     [EnumMember] 
     RedirectToLogon 
} 

私は、階層型を持っていた場合、私はこれを征服するKnownTypeを使用しますが、このシナリオのためのアイデアのうち、午前た可能性が知っています。

答えて

16

ダイナミックのDataContractは矛盾です。 DataContractはあらかじめ決められ相互に合意されたデータ構造であり、dynamicは構造があらかじめ決定されておらず、したがって何でもよいので合意できないオブジェクトです。

実際には動的データ型を返す必要はなく、さまざまなデータ型が返されるようです。違いは、可変データ型は固定データ型のセットの1つであり、動的データ型は所定の構造を持たないものであることである。戻り値はいくつかの既知の図形の1つで、WCFではサポートされていない「シェイプレス」(または「フリーフォーム」)動的型を使用する必要はありません。

代わりに、あなたは[OperationContract]方法はタイプobjectの単一のデータメンバを持つラッパーオブジェクトとして働き、そして得る可能性のあるタイプを指定するには、ラッパーオブジェクトに[KnownType]を使用します[DataContract]で型を返すかもしれませんラッパーの内部に戻されます。すべてがobjectから継承されているため、すでに階層があります。

[DataContract] 
[KnownType(typeof(OpenIdStatus))] 
[KnownType(typeof(string))] 
public class ReturnValue 
{ 
    [DataMember] 
    public object Value { get; set; } 
} 
+0

エレガントな考えに感謝します:-) – CjCoax

3

私はWCFがあなたの動的なタイプをシリアライズ/デシリアライズする問題を持っていると思います。私は定義されたインターフェイスに基づいてメソッドの返品の契約を設定することをお勧めします。あるいは、あなた自身が直列化の責任を持ち、サービスが文字列を返すようにすることもできます。クライアントは、文字列を逆シリアル化する型を知っている必要があります。これに類似した質問がここにあります: -

How to return dynamic List from WCF HTTP Service