Вопрос

Мне было любопытно, может ли кто-нибудь описать, какие типы изменений контракта (интерфейса) WCF на стороне сервера приведут к сбою клиента, пытающегося отправить сообщение, и почему.Я верю, что WCF может справиться с определенными несоответствиями, но я не уверен точно, что вы можете изменить безопасно, а что нет.

  • Добавлять / удалять параметры из OperationContract?
  • Добавлять / удалять / изменять сериализованные свойства DataContract?
  • Добавлять / удалять OperationContracts из ServiceContract?

Мой друг задал здесь похожий вопрос:

Нарушает ли добавление метода в WCF ServiceContract работу существующих клиентов?

Редактировать:Как отметил Джон Сондерс, изменение контракта обычно не является хорошей идеей, но есть встроенные функции, которые допускают некоторый допуск версии (ExtensionDataObject и т.д.?).Я просто хотел бы знать, насколько гибок допуск версии.

Это было полезно?

Решение

Ознакомьтесь с этой статьей о dasBlonde: Управление версиями Сервисных контрактов WCF

В нем перечислены изменения, которые приведут к нарушению работы существующих клиентов:

  1. Удаление операций
  2. Изменить название операции
  3. Удалить параметры работы
  4. Добавление параметров работы
  5. Измените имя параметра операции или тип данных
  6. Измените тип возвращаемого значения операции
  7. Измените сериализованный формат XML для типа параметра (контракт с данными) или операции (контракт с сообщением), явно используя .СЕТЕВЫЕ атрибуты или пользовательский код сериализации
  8. Изменять форматы кодирования сервисных операций (RPC-кодирование по сравнениюЛитерал документа)

Эта статья Мишель более подробно объясняется, как вы можете разрабатывать контракты, чтобы они были более гибкими.

Другие советы

Рекомендации по разработке контрактов

  1. Первая версия

    1.1.Тщательно выбирайте имена для всех контрактов (интерфейсов, методов, классов и свойств).Их будет трудно изменить в будущих версиях.

    1.2.Помните, что следующее не может быть изменено в будущем:количество параметров метода; тип параметров / возвращаемых значений / свойств для типов, не находящихся под вашим контролем.

  2. Следующая версия

    2.1.Если уже существует, НЕ изменяйте пространство имен или параметр Name ни в одном из атрибутов xxxContractAttribute.

    2.2.Если уже существует, НЕ изменяйте свойство Order атрибута DataMemberAttribute.

    2.3.Допускаются только следующие изменения:

    • Добавить метод (OperationContract) в интерфейс (ServiceContract)

    • Переименовать метод в интерфейсе

    • Переименовать класс (DataContract)

    • Добавить свойство (элемент данных) в класс (DataContract)

    • Переименовать свойство в классе

    2.4.Любое удаление нарушает совместимость.

    2.5.Любое другое изменение нарушает совместимость.

Вот несколько полезных ссылок:

"Добавить / удалить параметры из OperationContract" в WCF - это не всегда то, что может сломать работу вашего клиента, но вы должны знать, что вы делаете.В частности, добавление новых параметров в операционный контракт приведет к тому, что устаревшие клиенты не будут передавать их, и на стороне сервиса для них будут установлены значения по умолчанию.Более того, удаление параметров из операционного контракта будет незаметным с точки зрения клиента, и они будут просто проигнорированы на стороне сервиса.Конечно, изменение имени / типа параметра приведет к сбою работы клиента.

Я думаю, что лучшая практика - думать о контрактах как о нерушимых, хммм, контракты.Не меняйте их после того, как они будут опубликованы.Достаточно просто создать новый контракт с необходимыми изменениями и предоставить доступ к новому контракту на новой конечной точке.

ОК.Вопрос.Из-за неправильного синтаксиса именования (параметр указан с заглавной буквы) я хотел бы скорректировать некоторый код:

[OperationContract]
public void Foo(string Bar){}

Для

[OperationContract]
public void Foo(string bar){}

Приведет ли корректировка размера капитала к разрыву контракта?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top