2011-01-13 10 views
8

버전 호환이 가능한 호환 가능한 &이어야하는 일부 WCF 데이터 계약을 작성하기 시작했습니다. MSDN 기사 here을 읽었으며 enum과 관련하여 14 번 항목에 대해 명확한 설명이 있는지 궁금합니다. 다음과 같이 읽습니다.WCF 버전 관리 Enums

14. 버전간에 열거 형 멤버를 추가하거나 제거하면 안됩니다. EnumMemberAttribute 특성의 Name 속성을 사용하여 데이터 계약 모델의 이름을 동일하게 유지하지 않으면 열거 형 멤버의 이름을 바꾸지 않아야합니다.

이 글을 읽은 후에는 열거 형이 게시되고 클라이언트에서 사용되면 호환성을 손상시키지 않으면 서 (주로 추가/제거) 어쨌든 수정할 수 없다는 것을 의미합니다. (즉, 이것은 변경 될 수 있습니다)

누군가이를 확인할 수 있습니까?

+0

열거 형 멤버를 추가해도 기능이 중단되지 않지만 열거 형 멤버가 사용중인 경우에는 제거됩니다. 추가는 서비스 구현이 변경되거나 새로운 서비스 계약이 추가되는 경우에만 유용합니다. – 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

서비스가 이전 클라이언트에 추가 된 값을 포함하는 enum 유형 목록을 반환하는 경우 true입니까? –

6

나는 WCF 인터페이스를 통해 하지 전송 열거 형을 권하고 싶습니다. 다음 열거 있다고 가정합시다 : 클라이언트에 서비스 참조를 업데이트하지 않고

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

이 열거에 추가하면 위치 : 당신은 WCF를 통해 열거 형을 반환하는 경우

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

을, 모든 것이 잘 작동합니다 여전히 잘 : 클라이언트 서비스 참조를 업데이트하지 않고 서비스에서 추가 된 값을 반환하는 경우

[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 }; 
    } 
} 

. 해결책은 enum 대신 WCF를 통해 단순히 DTO를 전송하는 것이 었습니다. 예 : WeekdayEnum 간단한 DTO를 통해 값을 전송하여 대체 할 수 :

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

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

이 방법은, 기존 고객 행복 유지.