Добавление поля к данным WCF контракт разрывает клиентов? - PullRequest
14 голосов
/ 25 ноября 2010

У меня есть служба WCF, которая возвращает класс, который реализует IExtensibleDataObject. Мне нужно добавить новое поле в этот класс. Я обновил интерфейс DataContract и внес изменения в класс. Теперь, когда я пытаюсь запустить свое клиентское приложение, я получаю следующую ошибку:

Не удалось загрузить файл или сборку 'xxx.yyyy.zzzz, версия = 1.3.9.26111, Culture = нейтрально, PublicKeyToken = b09e2f3e9b5894f0 'или одна из его зависимостей. Расположенный определение манифеста сборки делает не совпадает со ссылкой на сборку. (Исключение из HRESULT: 0x80131040)

Была изменена версия AssemblyVersion класса WFC - это нарушает работу клиента?

EDIT:

В производстве есть клиенты, которые используют эту услугу. Я не хочу, чтобы они обновляли свои сервисные ссылки и, если возможно, повторно развертывали своих клиентов для этого простого изменения.

Ответы [ 2 ]

26 голосов
/ 25 ноября 2010

Зависит от того, как вы настроили свой контракт данных.

В WCF, используя все значения по умолчанию, ваш сервис будет использовать DataContractSerializer (DCS) для сериализации вашего объекта в XML. DCS будет сериализовать ваши поля по порядку - сначала общедоступные, а затем частные. Внутри каждой группы видимости поля / свойства будут упорядочены в алфавитном порядке по имени.

Таким образом, если вы введете новое открытое свойство MiddleName, и у вас уже есть FirstName и LastName, все будет в порядке: старый XML был бы

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

и ваш новый просто добавит новое свойство в конце:

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

Такое обновление "добавить что-то в конце" должно работать просто отлично, DCS будет просто игнорировать дополнительные теги в XML.

Однако: если бы вы ввели свойство под названием Gender, оно застряло бы между <FirstName> и <LastName> и, таким образом, нарушило бы порядок данных в вашем XML и, таким образом, нарушило бы Договор передачи данных - ни один «старый» клиент не сможет позвонить на ваш новый сервис.

Для того, чтобы взять это под контроль, вы можете добавить конкретные атрибуты 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 и создавать простые расширения существующих контрактов на данные, не нарушая их обновления.

Для получения дополнительной информации и подробных ноу-хау вам следует прочитать Сериализация в Windows Communication Foundation на веб-сайте журнала MSDN - настоятельно рекомендуется.

1 голос
/ 25 ноября 2010

В контекстном меню справочной службы выберите ... " Обновите справочную службу "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...