svcutil.exe - сгенерированный прокси не допускает пустые поля - PullRequest
6 голосов
/ 18 июня 2009

Я пытаюсь использовать веб-службу, указанную с помощью WSDL, путем создания прокси-сервера WCF с использованием svcutil.exe, но WSDL указывает, что некоторые операции имеют необязательные параметры (minOccurs = "0"), например:

<xs:element minOccurs="0" maxOccurs="1" name="meetingId" type="xs:int" /> 

К сожалению, сгенерированный прокси-сервер не позволяет мне не указывать значения (параметры не могут иметь значение NULL), и в качестве части вызова отсутствуют «указанные» поля для указания прокси-серверу, что никакое значение не должно отправляться.

Есть ли способ использовать svcutil для генерации прокси, который позволил бы мне это сделать?

(Кстати, в своем исследовании я заметил, что другие смогли правильно сгенерировать эти дополнительные «указанные» поля, используя функцию «Добавить ссылку на службу»), но по какой-то причине Visual Studio не хочет создавать прокси-сервер после добавления ссылки (после этого ничего не происходит)

Файл WSDL Сгенерированный прокси

Используемая команда: svcutil http://sas -int.elluminate.com / site / external / adapter / default / v1 / webservice.wsdl / internal /n:*,Elluminate.WebService.WebServiceProxy / o : WebServiceProxy.cs /config:App.config / nologo

Ответы [ 3 ]

6 голосов
/ 19 июня 2009

Я бы предположил, что прокси-класс клиента, сгенерированный svcutil, имеет поле / свойство с именем meetingId типа int - верно? Да, это ненулевое значение - но я уверен, что у вас также есть логическое поле / свойство с именем meetingIdSpecified - только если оно установлено на true, служба действительно будет на него смотреть; если вы не установите его, то служба не будет смотреть на значение, так что почти как если бы оно было NULL.

Кроме того - вы также не указали поле, которое должно быть обнуляемым в вашем XSD, - вы указали, что оно необязательно. Чтобы сделать его обнуляемым, используйте этот синтаксис здесь:

<xs:element minOccurs="0" maxOccurs="1" name="meetingId" type="xs:int" 
            nillable="true" />

Видите атрибут "nullable"? Это то, что используется для того, чтобы сделать поле действительно обнуляемым - теперь вы можете иметь такую ​​запись в своем XML:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <meetingId xsi:nil="true" />
</root>

Марк

1 голос
/ 05 февраля 2016

Это проблема, потому что minOccurs = "0" должно позволять вам не генерировать значение meetingId, а сгенерированный прокси-сервер не разрешает его.

Вы используете только службу, поэтому у вас нет контроля над wsdl, и вы не можете добавить nillable = "true" в wsdl для того, чтобы параметр meetingId был необязательным в вашем прокси.

Если вы сгенерируете свой прокси с помощью wsdl.exe, а не svcutil.exe, у вас будет дополнительное поле 'meetingIdSpecified', которое позволяет вам выбрать, следует ли отправлять поле meetingId.

wsdl.exe http:///myservice?wsdl

Но с wsdl.exe вы будете использовать ваш сервис через веб-сервис asp.net, а не WCF.

Я думаю, что пропущенное поле является ошибкой в ​​svcutil.exe (для меня 4.0.30319.17929), потому что если вы генерируете с параметром / wrapped:

svcutil.exe /wrapped http:///myservice?wsdl

.. тогда у вас также будет создано поле 'meetingIdSpecified'!

1 голос
/ 18 июня 2009

Не используйте SVCUtil, если он не работает для вас. Если служба не очень сложная, вы можете попробовать написать интерфейс службы вручную и использовать ChannelFactory <> для создания прокси.

...