2011-01-13 9 views
8

私はいくつかのWCFデータコントラクトを作成し始めています。これは、前方互換性のある&をバージョン対応可能にする必要があります。私はMSDNの記事hereを読んできましたが、誰かがポイント#14のenumについて明確化しているのかどうか疑問に思っていました。次のようになります。WCFバージョニング列挙

14.バージョン間で列挙メンバを追加または削除しないでください。また、EnumMemberAttribute属性のNameプロパティを使用してデータコントラクトモデルの名前を同じにしない限り、列挙メンバの名前を変更しないでください。

これを読んで、いったんenumが公開されると(クライアントで使用されると)、とにかく互換性を損なうことなく(主に追加/削除することはできません。 (これは急変である)

誰かがこれを確認できますか?

+0

enumメンバーを追加しても、機能が中断されることはありませんが、enumメンバーが使用されている場合は削除されます。追加は、サービス実装が変更された場合、または新しいサービス契約が追加された場合にのみ有効です。 – hungryMind

答えて

8

サービスと通信するときに新しい値を使用しない限り、互換性を損なうことなく公開された列挙型に追加できることを確認できます。ただし、新しいenum値を使用しているクラスに実際にクラスを送信しようとすると、System.ServiceModel.CommunicationExceptionが発生することに注意してください。

There was an error while trying to serialize parameter myType. The InnerException message was 'Enum value 'x' is invalid for type 'myType' and cannot be serialized. Ensure that the necessary enum values are present and are marked with EnumMemberAttribute attribute if the type has DataContractAttribute attribute.'. Please see InnerException for more details. 
+0

サービスが、たとえば、追加された値を含む列挙型のリストを古いクライアントに返す場合はtrueですか? –

6

私は、WCFインタフェース上で列挙型を送信ないをお勧めします。あなたは、次の列挙型があるとします。

[DataContract] 
public enum WeekdayEnum 
{ 
    [EnumMember] 
    Monday = 0 
} 

あなたはWCFの上に列挙型を返す場合は、すべてがうまく動作します:

[ServiceContract] 
public class Service1 
{ 
    [OperationContract] 
    public List<WeekdayEnum> GetWeekdays() 
    { 
     return new List<WeekdayEnum> { WeekdayEnum.Monday }; 
    } 
} 

は、クライアントにサービス参照を更新せずに列挙型に追加すると、していますまだ細かい:しかし

[DataContract] 
public enum WeekdayEnum 
{ 
    [EnumMember] 
    Monday = 0, 
    [EnumMember] 
    Tuesday = 1 
} 

、あなたは、クライアントサービス参照を更新することなく、サービスからレガシークライアントを追加した値を返す場合します休憩

[ServiceContract] 
public class Service1 
{ 
    [OperationContract] 
    public List<WeekdayEnum> GetWeekdays() 
    { // NetDispatcherFaultException on legacy clients that only have Monday 
     return new List<WeekdayEnum> { WeekdayEnum.Monday, WeekdayEnum.Tuesday }; 
    } 
} 

レガシークライアントをサポートすることが重要なプロジェクトではこれが問題でした。解決策は、列挙型の代わりにWCFでDTOを送信することでした。例えば。 WeekdayEnumは、単純なDTOで値を送信することによって置き換えることができます。

[DataContract] 
public class WeekdayDto 
{ 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public string Name { get; set; } 
} 

この方法で、従来のクライアントは喜んで滞在します。