Подтвердить что ты не робот

Ответ метода изменения Webservice без уведомления клиентов

Предположим, что у меня есть веб-сервис, который возвращает класс для всех методов, информируя клиента о статусе процесса, например:

public class WsResult {

  string result; // either "error" or "ok"

}

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

Например:

public class WsResult {

  public string result; // either "error" or "ok"

  public Guid? someIdentifier;

}

Я ищу ответы как на WCF, так и на ASMX.

4b9b3361

Ответ 1

WCF

Это возможно. Вы можете просто добавить новое свойство, и оно будет работать при условии, что это новое свойство не требуется. Более подробную информацию см. В пункте 8 Рекомендации: Версии версий данных.

Если вам нужно обработать сценарий с круговым отключением, вы должны прочитать о интерфейсе IExtensibleDataObject. Круглое отключение происходит, когда данные отправляются с сервера клиенту, и ожидается, что он будет отправлен обратно. Подробнее см. Контракт с прямыми данными.

ASMX

В ASMX ситуация такая же. Вы можете добавить новое свойство, и все клиенты должны работать. В этом случае вы также можете использовать интерфейс IExtensibleDataObject.

Заключительные комментарии

Этот ответ основан на эмпирических тестах с VS 2015. Я настоятельно рекомендую вам сделать то же самое: пишите простые серверы и клиенты WCF/ASMX и проверяйте поведение, описанное мной. Мне потребовалось всего несколько минут. Или еще лучше вы можете использовать уже существующие сервисы.

Я рекомендую дополнительные тесты, потому что вы можете использовать некоторую нестандартную конфигурацию, которая изменяет поведение по умолчанию для служб WCF/ASMX, поэтому лучше проверить. Я не знаю такой конфигурации, но вы никогда не знаете.

Ответ 2

С WCF вы можете иметь разные классы на стороне клиента и сервера, что обычно происходит при использовании Добавить ссылку на службу. Трюк для этой работы заключается в том, чтобы установить пространство имен и имя в атрибуте DataContract (и, возможно, даже имя в атрибуте DataMember, если имена участников отличаются).

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