Вопрос по .net, wcf – svcutil.exe - сгенерированный прокси не допускает пустые поля

6

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

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

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

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

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

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

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

Довольно странно, что указанные свойства не генерируются ... Это WCF-способы обработки необязательных типов значений. Нет ошибок, предоставленных svcutil? Если нет, можете ли вы предоставить нам файл WSDL и что сгенерировано? Philippe
Конечно, WSDL доступен по адресу:sas-int.elluminate.com/site/external/adapter/default/v1/…  Я использую следующую команду для генерации прокси: svcutilsas-int.elluminate.com/site/external/adapter/default/v1/… / internal /n:*,Elluminate.WebService.WebServiceProxy /o:WebServiceProxy.cs /config:..\App.config / nologo И вот что генерируется:pastebin.com/m20688d39  Спасибо! David
SvcUtil, как правило, является PITA, и я им не пользуюсь, но мои службы и WCF, так что у меня гораздо проще. Krzysztof Kozmic

Ваш Ответ

3   ответа
6

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

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

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

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

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

Марк

Эти указанные поля не отображаются, но вы правы насчет нуля ... если я добавлю это в WSDL, тогда svcutil правильно сгенерирует обнуляемые параметры для вызовов. Спасибо David
У меня есть случай, в котором элемент является необязательным (minOccurs = & quot; 0 & quot;) и намеренно не допускает ноль. Я также не получаю "указанное" поля ... если я не включу & quot; / serializer: XmlSerializer & quot; опция командной строки. Я полагаю, что DataContractSerializer по умолчанию не обрабатывает эту ситуацию правильно ...? Единственный способ заставить работать код DataContractSerializer - вручную изменить сгенерированный код, указав EmitDefaultValue = & quot; false & quot; в атрибуте DataMemberAttribute, но тогда вы никогда не сможете отправить ноль, потому что это будет интерпретироваться сервером как отсутствующее значение.
1

Если служба не очень сложная, вы можете попробовать написать интерфейс службы вручную и использовать ChannelFactory & lt; & gt; создать свои прокси.

какой метод? (вне контекста, несколько лет спустя)
(несколько лет спустя) у вас есть ссылка на этот метод?
Основная причина, по которой я надеялся использовать svcutil, заключалась в том, чтобы сэкономить время. Я не уверен, смогу ли я реализовать все достаточно быстро вручную. David
Я думаю, что Стив Б имел в виду метод решения с ChannelFactory
0

0 & quot; должен позволить вам не отправлять & quot; MeetingId & apos; значение, и сгенерированный прокси не позволяет этого.

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

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

wsdl.exe http:///myservice?wsdl

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

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

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

... тогда у вас также будет поле "meetingIdSpecified" генерируется!

Похожие вопросы