6

動的タイプを返すaServiceContractがあり、次のようになります。

public dynamic LoginViaOpenId(string openIdUrl)

動的リターンタイプはDataContract、私が定義したもの、または文字列である可能性があります。しかし、私はDataContractサービスで自分を使用したことがないので、クライアントはそれについて何も知らず、それにアクセスできません。

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

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

これを克服するために使用できる階層型があるかどうかはわかっていますがKnownType、このシナリオについては考えられません。何か案が?

4

2 に答える 2

18

動的なDataContractは撞着語です。DataContractは、事前に決定され、相互に合意されたデータ構造でありdynamic、構造が事前に決定されていないため、何でもかまいませんので合意できないオブジェクトです。

実際に動的データ型を返す必要はないようですが、変化するデータ型を返す必要があります。違いは、可変データ型は一連の固定データ型の1つであるのに対し、動的データ型は事前に定義された構造を持たないデータ型であるということです。戻り値は既知の形状の1つであるため、WCFでサポートされていない「シェイプレス」(または「フリーフォーム」)動的タイプを使用する必要はありません。

代わりに、型の単一のデータメンバーを持つラッパーオブジェクトとして機能する[OperationContract]型をメソッドに返すようにし、ラッパーオブジェクトで使用して、ラッパー内で返される可能性のある型を指定することができます。すべてがから継承されるため、すでに階層が設定されています。[DataContract]object[KnownType]object

[DataContract]
[KnownType(typeof(OpenIdStatus))]
[KnownType(typeof(string))]
public class ReturnValue
{
    [DataMember]
    public object Value { get; set; }
}
于 2012-04-12T09:02:31.037 に答える
3

WCFでは、動的型のシリアル化/逆シリアル化で問題が発生すると思います。定義されたインタフェースに基づいてメソッドreturnのコントラクトを設定することをお勧めします。または、自分でシリアル化の責任を負い、サービスに文字列を返すようにすることもできます。クライアントは、文字列を逆シリアル化するタイプについての知識を持っている必要があります。これについても同様の質問があります:-

WCFHTTPサービスから動的リストを返す方法

于 2012-04-12T08:43:16.893 に答える