Добавление нового параметра в операцию WCF: выбор? - PullRequest
6 голосов
/ 18 ноября 2009

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

Должен ли я добавить новую операцию с новым параметром, как перегрузку? Или мне просто добавить параметр в существующую операцию?

Вот моя операция:

[OperationContract]
MyResponse GetData();

Должно ли это быть:

[OperationContract]
MyResponse GetData(); 

[OperationContract]
MyResponse GetData(string filter);

Или, проще, просто измените это на:

[OperationContract]
MyResponse GetData(string filter);

Последний вариант кажется наилучшим, и, согласно моему справочнику, " Влияние на клиента отсутствует. Новые параметры инициализируются в значениях по умолчанию в службе. " Является ли WCF инициализацией его так называется значением по умолчанию? Если да, то какое значение по умолчанию?

Ответы [ 3 ]

13 голосов
/ 18 ноября 2009

Следует принять во внимание, что у вас не может быть двух OperationContracts с одинаковым именем. То, как оно сериализовано, приведет к ошибке.

Наилучший подход - использовать вариант 3 (просто добавив новый параметр) и в логической учетной записи метода указывать, что он является нулевым значением для тех клиентов, которые еще не обновили. Если это критическое изменение, которое клиенты должны будут обновить, убедитесь, что не все приложение умерло из-за исключения.

3 голосов
/ 13 октября 2010

Вы можете попробовать это:

[OperationContract]
MyResponse GetData(); 

[OperationContract(Name = "GetDataByFilter")]
MyResponse GetData(string filter);
3 голосов
/ 18 ноября 2009

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

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

Это может быть:

  • новый договор на эксплуатацию по существующему договору на обслуживание
  • новое необязательное поле в DataContract

То, что вы пытаетесь сделать, не сработает, хотя

  1. вы не можете иметь два метода с одним и тем же именем в WCF - WCF это не .NET, и вы не можете иметь два метода с одним и тем же именем, отличающимися только их сигнатурой. Не работает Вам нужно будет использовать два разных имени. Помните: ваши вызовы методов WCF будут переведены в документ WSDL (язык описания веб-сервиса) для описания сервиса - а WSDL просто не поддерживает две операции с одним и тем же именем - просто разница в сигнатуре не поддерживается и не будет работать .

  2. вы не можете изменить существующий договор, например, Вы не можете ввести новый параметр в вызов метода после факта, не нарушая контракт.

Итак, что вам действительно нужно сделать, это:

[OperationContract]
MyResponse GetData(); 

[OperationContract]
MyResponse GetFilteredData(string filter);

Любые другие изменения, которые вы предложили, будут а) нарушать контракт или б) просто не работать в WCF:

...