Перечисления версий WCF - PullRequest
       7

Перечисления версий WCF

9 голосов
/ 13 января 2011

Я начинаю писать некоторые контракты с данными WCF, которые должны быть совместимы и иметь возможность управления версиями.Я читал статью MSDN здесь , и мне было интересно, есть ли у кого-нибудь разъяснения по пункту № 14 относительно перечислений.Он гласит:

14. Не следует добавлять или удалять элементы перечисления между версиями.Вы также не должны переименовывать членов перечисления, если только вы не используете свойство Name в атрибуте EnumMemberAttribute, чтобы сохранить их имена в модели контракта данных одинаковыми.

Читая это, я понимаю, что когдаenum публикуется (и используется клиентами), вы не можете изменить его в любом случае (главным образом, добавляя / удаляя), не нарушая совместимость?(то есть это будет серьезное изменение)

Кто-нибудь может это подтвердить?

Ответы [ 2 ]

8 голосов
/ 19 февраля 2011

Я могу подтвердить, что вы можете ДОБАВИТЬ в опубликованное перечисление, не нарушая совместимость, если вы не используете новое значение при общении со службой. Однако имейте в виду, что если вы на самом деле попытаетесь отправить класс в службу, использующую новое значение перечисления, вы получите исключение 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.
7 голосов
/ 12 ноября 2012

Я бы рекомендовал , а не , отправляя перечисления через интерфейсы 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 };
    }
}

У меня были проблемы с этим в проектах, где важна поддержка старых клиентов.Решением было просто отправить DTO через WCF вместо перечислений.Например, WeekdayEnum можно заменить, отправив значения через простой DTO:

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

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

Таким образом, ваши старые клиенты останутся довольны.

...