9

Web サービスを、いくつかのデータ契約を持つ wcf サービスに変換しました。ベスト プラクティスとして、DataContracts は IExtensibleDataObject から継承することが推奨されます。データメンバーの追加または削除の場合、IExtensibleDataObject が役立つという点がわかりました。しかし、クライアントが削除されたデータメンバーにアクセスする方法を取得できません。これが私のコードです:

[ServiceContract(Namespace = "http://mycompany.com/2010/08/")]
public class MyWebService {
    [OperationContract]
    public Employee Add(Employee emp)
    {
        // Some Processing
    }
}

[DataContract(Name = "Employee", Namespace = "http://mycompany.com/2010/08/")]
public class Employee : IExtensibleDataObject {
    [DataMember] public string FirstName;
    [DataMember] public string LastName;

    public ExtensionDataObject ExtensionData  { get; set; }
}

次のバージョンの Web サービスでは、次のように DataContract にいくつかの変更を加えました。

[DataContract(Name = "Employee", Namespace = "http://mycompany.com/2010/09/")]
public class Employee : IExtensibleDataObject {
    [DataMember] public string FirstName;
    [DataMember] public string LastName;
    [DataMember(IsRequired = true)] public string MiddleName;

    public ExtensionDataObject ExtensionData  { get; set; }
}

ただし、古いバージョンの Web サービスにアクセスしているクライアントは、MiddleName フィールドを指定していないというエラーが発生しています。IExtensionDataObject の使用についてはまだ混乱しています。

4

3 に答える 3

15

これは IExtensibleDataObject の間違った使い方です。サーバー側でデータ コントラクトを変更し、新しいフィールドを必須としてマークしたため、バージョン管理が壊れていることを意味し、何も役に立ちません。

IExtensibleDataObject は他の目的のためのものです。クライアントのデータ コントラクトに MiddleName が含まれるようにクライアントを変更したとします。ここで、MiddleName を設定し、Add service 操作を使用します。返された Employee オブジェクトに含まれる MiddleName の値は? IExtensibleDataObject を使用しない場合、値は null になります。IExtensibleDataObject を使用する場合、値は入力パラメーターに設定した値と同じになります。

DataContractSerializer を使用すると、WCF は理解されていないパラメーターをすべて破棄します。IExtensibleDataObject は、これらすべてのパラメーターを特別なコレクションに格納し、それらをクライアントに送り返すことで、これを回避します。

コントラクト バージョニングを使用する場合は、必須フィールドを忘れてください。それはそれを壊す最初のものです。

于 2010-08-08T20:42:43.167 に答える
12

IExtensibleDataObject の正しい使用法ではないことを残念に思います。IExtensibleDataObject インターフェイスは、バージョンのラウンドトリップをサポートするように設計されています。前方互換性に関するこの MSDN の記事を読んでください。

http://msdn.microsoft.com/en-us/library/ms731083.aspx

また、一般的なデータ コントラクトのバージョン管理に関するベスト プラクティスに関する別の記事: http://msdn.microsoft.com/en-us/library/ms733832.aspx

于 2010-08-08T22:28:53.743 に答える
0

次に示すように、ExtensionData プロパティを「仮想」にします。

public virtual ExtensionDataObject ExtensionData
{
    get { return theData; }
    set { theData = value; }
}
于 2014-01-13T14:17:29.100 に答える