Договор на обслуживание и имена переменных - PullRequest
0 голосов
/ 15 октября 2010

У меня есть сервис WCF.Я изменил имя переменной в datacontract, перестроил службу, но не перестроил клиент

До этого это контракт операции для клиента

[OperationContract(Name = "SubscribeWcfProvider")]
bool Subscribe(Guid subscriptionid);

После этого это контракт операции для сервиса

[OperationContract(Name = "SubscribeWcfProvider")]
bool Subscribe(Guid subscriberId);

Теперь, когда клиент вызывает метод, Guid всегда нулевой.Кажется, я не могу изменить имена переменных?Это почему?

ОБНОВЛЕНИЕ

Скажите, пожалуйста, что происходит за кулисами?Как преобразовать вызов функции в сообщение?

Ответы [ 2 ]

4 голосов
/ 16 октября 2010

Сгенерированный вами прокси был (по всей вероятности) создан до изменения и не регенерирован после него. Таким образом, прокси «жестко закодировал» параметры на основе WSDL (я предполагаю, что вы используете SOAP). Вот пример сообщения SOAP (взято с этого сайта ).

<?xml version='1.0'?>
<SOAP:Envelope
  xmlns:SOAP='urn:schemas-xmlsoap-org:soap.v1'>
 <SOAP:Body>
  <i:getBalance
    xmlns:i='urn:develop-com:IBank'>
   <account>23619-22A</account>
  </i:getBalance>
 </SOAP:Body>
</SOAP:Envelope>

В этом случае метод getBalance ожидает параметр account. Если это изменится на стороне сервера, и клиент не получит новый контракт и не восстановит прокси, он не сможет отправить правильный параметр.

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

[OperationContract(Name = "SubscribeWcfProvider")]
bool Subscribe([MessageParameter(Name = "subscriptionid")]Guid subscriberId);

На MSDN есть хороший пример, который показывает код, который вам нужно отредактировать, а также сообщение, которое будет отправлено.

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

1 голос
/ 15 октября 2010

Это зависит от вашего выбора сериализации.В общем случае, если имя параметра появляется в сериализованном сообщении, оно не будет правильно переводиться, если вы измените его имя в службе, а не в клиенте - и это почти всегда так (SOAP, XML, JSON и т. Д.).

...