2011-01-13 19 views
8

Estoy comenzando a escribir algunos contratos de datos WCF que necesitan ser compatibles con versiones anteriores & versionable. He estado leyendo el artículo de MSDN here, y me preguntaba si alguien tiene una aclaración sobre el punto # 14 con respecto a las enumeraciones. Se lee de la siguiente manera:WCF Versioning Enums

14. No debe agregar o eliminar miembros de enumeración entre versiones. Tampoco debe cambiar el nombre de los miembros de la enumeración, a menos que use la propiedad Name en el atributo EnumMemberAttribute para mantener sus nombres en el modelo de contrato de datos.

La lectura de este, lo tomo en el sentido de que una vez que se publica una enumeración (y utilizado por los clientes), que no se puede modificar de todos modos (añadir/eliminar principalmente) sin romper la compatibilidad? (es decir, esto sería un cambio de rotura)

¿Alguien puede confirmar esto?

+0

Al agregar un miembro enum no se interrumpirá la funcionalidad, pero se eliminará si el miembro enum está en uso. Agregar será útil si y solo si la implementación del servicio cambia o se agrega un nuevo contrato de servicio. – hungryMind

Respuesta

8

Puedo confirmar que puede AGREGAR a una enumeración publicada sin romper la compatibilidad, siempre y cuando no utilice el nuevo valor al hablar con el servicio. Sin embargo, tenga en cuenta que si realmente intenta enviar una clase al servicio que está utilizando el nuevo valor enum, obtendrá 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

¿Es esto cierto si el servicio devuelve, por ejemplo, una lista del tipo de enumeración que contiene el valor agregado a un cliente anterior? –

6

Me gustaría recomendar no enumeraciones el envío de más interfaces de WCF. Suponga que tiene la siguiente enumeración:

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

Si devuelve la enumeración sobre WCF, todo va a funcionar bien:

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

Añadir a la enumeración sin actualizar la referencia de servicio en el cliente y que está aún válido:

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

sin embargo, si devuelve el valor añadido del servicio sin actualizar las referencias de servicio del cliente, los clientes legado romper:

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

He tenido problemas con esto en proyectos en los que el apoyo a los clientes heredados es importante. La solución ha sido simplemente enviar DTO sobre el WCF en lugar de enums. P.ej. la WeekdayEnum podría ser sustituido por el envío de los valores a través de una sencilla DTO:

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

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

esta manera, sus clientes heredados feliz estancia.