Добавление DataMember к существующему DataContract в WCF
Я хотел бы добавить DataMember
одному из моих DataContract
s. Хотелось бы узнать, как будут вести себя существующие серверы и клиенты при наличии нового DataMember
если одна из сторон не обновлена.
Я помню, есть способ сделать DataMember
необязательно, но мне интересно, будет ли это работать во всех сценариях:
- обновленный клиент => старый сервер
- старый клиент => обновленный сервер
- обновленный клиент <= старый сервер
- старый клиент <= обновленный сервер
1 ответ
WCF будет корректно обрабатывать новых членов, которых он не распознает. Потребитель контракта (на стороне клиента или на сервере) просто не увидит этого участника, поэтому следствием является то, что новый участник никогда не должен быть IsRequired=true
имущество.
Кроме того, WCF будет прозрачно соединять новое свойство между компонентами, пока DataContract реализует IExtensibleDataObject
, Например, если путь сообщения идет:
обновленный клиент => старый сервер => обновленный сервер
тогда обновленный сервер в конце цепочки все еще увидит новый DataMember. Однако "старый сервер" не увидит этот новый DataMember.
Если старый сервер отправляет сообщение обновленному клиенту, то новый DataMember будет установлен в default(type)
при десериализации в новом клиенте.
Здесь больше о рекомендациях по управлению версиями DataContract.
И в этой статье обсуждается разница между критическими и неразрывными изменениями.