2010-11-24 8 views
14

IExtensibleDataObjectを実装するクラスを返すWCFサービスがあります。このクラスに新しいフィールドを追加する必要があります。 DataContractインターフェイスを更新し、クラスを変更しました。今、私は私のクライアントアプリケーションを実行しようとすると、私は次のエラーを取得する:WCFデータコントラクトにフィールドを追加すると、クライアントが破損しますか?

Could not load file or assembly 'xxx.yyyy.zzzz, Version=1.3.9.26111, Culture=neutral, PublicKeyToken=b09e2f3e9b5894f0' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

WFCクラスののAssemblyVersionが変更されました - そのブレーククライアントしていますか?

EDIT:

このサービスを使用する生産のクライアントがあります。可能であれば、この単純な変更のためにクライアントにサービス参照を更新させ、クライアントを再デプロイする必要はありません。選択したサービス・リファレンスコンテキストメニューから

答えて

25

それはあなたのデータコントラクトを設定した方法によって異なります。

すべての既定値を使用するWCFでは、サービスがDataContractSerializer(DCS)を使用してオブジェクトをXMLにシリアル化します。 DCSはフィールドを順番にシリアル化します。最初はパブリックフィールド、プライベートフィールドです。各可視性グループ内で、フィールド/プロパティを名前順にアルファベット順に並べ替えます。古いXMLが

<YourObject> 
    .... 
    <FirstName>.....</FirstName> 
    <LastName>.....</LastName> 
</YourObject> 

されているだろうし、あなたの新しいものは、単に新しいを追加します。あなたは新しいパブリックプロパティMiddleNameを導入し、すでにFirstNameLastNameを持っていた場合

したがって、あなたは大丈夫だろう最後のプロパティ:

<YourObject> 
    .... 
    <FirstName>.....</FirstName> 
    <LastName>.....</LastName> 
    <MiddleName>....</MiddleName> 
</YourObject> 

このような更新は、「最後に何かを追加」がうまく動作するはずです、DCSは、単にXMLで追加のタグを無視します。

しかし:あなたは、データコントラクトを破るため<FirstName><LastName>を立ち往生されますので、あなたのXML内のデータの順序を壊すとGenderと呼ばれるプロパティを、導入していた - がない「古い」クライアント意志あなたの新しいサービスを呼び出すことができます。

これの制御を取るためには、あなたのデータの契約で、あなたのデータメンバーに特定のOrder=属性を置くことができますが:

[DataContract] 
public class SomeAddress 
{ 
    [DataMember(Order=0)] 
    public string FirstName; 

    [DataMember(Order=1)] 
    public string LastName; 
} 

その後、あなたは簡単に新しいプロパティを追加することができます - ちょうどの最後に追加しますリスト!

[DataContract] 
public class SomeAddress 
{ 
    [DataMember(Order=0)] 
    public string FirstName; 

    [DataMember(Order=1)] 
    public string LastName; 

    [DataMember(Order=2)] 
    public string Gender; 
} 

だからあなたのデータ契約にOrder=属性を使用することにより、あなたはあなたのXMLレイアウトの制御を取ることができ、かつ既存のデータコントラクト非破壊アップデートの簡単な拡張を行うことができます。

詳細と詳細なノウハウについては、MSDN MagazineのWebサイトのSerialization in Windows Communication Foundationをお読みください。強くお勧めします。

+0

私はこれを試しますが、私が得ている "アセンブリをロードできませんでした"という予想されるエラーですか? – HitLikeAHammer

+0

それはそうしました。私は既存のメンバーの順序を変更せず、新しいメンバーにOrder = 2を追加しました。次のバージョンでは、すべての新規メンバーに対してOrder = 3となります。 – HitLikeAHammer

1
+1

はい、それは動作しますが、私は他のクライアントを運用しています。誰もが再コンパイルと再デプロイを行わないようにしたいと思います。特に、新しい分野が必要ない場合は特にそうです。 – HitLikeAHammer

関連する問題