Добавление DataMember к существующему DataContract в WCF - PullRequest
12 голосов
/ 11 апреля 2011

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

Напоминаю, что есть способ сделать DataMember необязательным, но мне интересно, будет ли это работать во всех сценариях:

  • обновленный клиент => старый сервер
  • старый клиент => обновленный сервер
  • обновленный клиент <= старыйСервер </li>
  • старый клиент <= обновленный сервер </li>

1 Ответ

15 голосов
/ 11 апреля 2011

WCF будет корректно обрабатывать новых членов, которых он не распознает. Потребитель контракта (на стороне клиента или на сервере) просто не «увидит» этого участника, поэтому следствием этого является то, что новый член никогда не должен быть IsRequired=true свойством.

Кроме того, WCF будет прозрачно соединять новое свойство между компонентами, пока DataContract реализует IExtensibleDataObject. Например, если путь сообщения идет:

обновленный клиент => старый сервер => обновленный сервер

тогда обновленный сервер в конце цепочки все равно увидит новый DataMember. Однако «старый сервер» не увидит этот новый DataMember.

Если старый сервер отправляет сообщение обновленному клиенту, тогда новый DataMember будет установлен на default(type) после десериализации в новом клиенте.

Подробнее о Рекомендации по управлению версиями DataContract можно узнать здесь .

И в этой статье обсуждается разница между ломающимися и неразрывными изменениями .

...