Добавить ссылку на службу генерирует контракты сообщения - PullRequest
16 голосов
/ 04 марта 2010

Когда я импортирую данную службу с помощью «Добавить ссылку на службу» в Visual Studio 2008 (SP1), все сообщения «Запрос / ответ» излишне включаются в контракты сообщений (именуемые как -> «имя_операции» + «Запрос» / « Ответ "+" 1 "в конце).

Генератор кода говорит:

// CODEGEN: Generating message contract since the operation XXX is neither RPC nor 
// document wrapped.

Парни, которые генерируют wsdl из службы Java, говорят, что они задают DOCUMENT-LITERAL / WRAPPED .

Любая помощь / указатель / подсказка будут высоко оценены.

Обновление : это образец моего wsdl для одной из операций, которые выглядят подозрительно. Обратите внимание на несоответствие атрибута элемента сообщения для запроса по сравнению с ответом.

<!- imports namespaces and defines elements -->
<wsdl:types>
  <xsd:schema targetNamespace="http://WHATEVER/" xmlns:xsd_1="http://WHATEVER_1/" xmlns:xsd_2="http://WHATEVER_2/">
      <xsd:import namespace="http://WHATEVER_1/" schemaLocation="WHATEVER_1.xsd"/>
      <xsd:import namespace="http://WHATEVER_2/" schemaLocation="WHATEVER_2.xsd"/>
      <xsd:element name="myOperationResponse" type="xsd_1:MyOperationResponse"/>
      <xsd:element name="myOperation" type="xsd_1:MyOperationRequest"/>
   </xsd:schema>
</wsdl:types>

<!- declares messages - NOTE the mismatch on the request element attribute compared to response -->
<wsdl:message name="myOperationRequest">
   <wsdl:part element="tns:myOperation" name="request"/>
</wsdl:message>
<wsdl:message name="myOperationResponse">
   <wsdl:part element="tns:myOperationResponse" name="response"/>
</wsdl:message>

<!- operations -->
<wsdl:portType name="MyService">
   <wsdl:operation name="myOperation">
      <wsdl:input message="tns:myOperationRequest"/>
      <wsdl:output message="tns:myOperationResponse"/>
      <wsdl:fault message="tns:myOperationFault" name="myOperationFault"/>
      <wsdl:fault message="tns:myOperationFault1" name="myOperationFault1"/>
   </wsdl:operation>
</wsdl:portType>

Обновление 2 : я вытянул все типы, которые у меня были в импортированном пространстве имен (они были в отдельном xsd), в wsdl, так как я подозревал, что импорт мог инициировать генерацию контракта сообщений. К моему удивлению, это был не тот случай, и наличие всех типов, определенных в wsdl, ничего не изменило.

Затем я (из отчаяния) начал создавать wsdls с нуля и играть с maxOccurs атрибутами атрибутов элемента, содержащихся в атрибуте sequence. Мне удалось воспроизвести нежелательное поведение генерации контракта сообщения.

Вот пример элемента:

<xsd:element name="myElement">
   <xsd:complexType>
      <xsd:sequence>
         <xsd:element minOccurs="0" maxOccurs="1" name="arg1" type="xsd:string"/>
      </xsd:sequence>
   </xsd:complexType>
</xsd:element>

Игра с maxOccurs на элементах, которые используются в качестве сообщений (в основном все запросы и ответы), происходит следующее:

  • maxOccurs = "1" не вызывает перенос
  • macOcccurs> 1 запускает перенос
  • maxOccurs = "unbounded" запускает перенос

Я еще не смог воспроизвести это на моем производственном wsdl, потому что вложение типов идет очень глубоко, и мне потребуется время, чтобы тщательно его изучить. В то же время я надеюсь, что это может позвонить в звонок - любая помощь высоко ценится.

Ответы [ 5 ]

5 голосов
/ 15 августа 2013

У меня была такая же проблема, и это решило ее.

Я использовал это:

    <wsdl:message name="Method">
      <wsdl:part name="parameters" element="s0:Method"/>
    </wsdl:message>

    <wsdl:message name="MethodResponse">
      <wsdl:part name="parameters" element="s0:MethodResponse"/>
    </wsdl:message>

Вместо:

    <wsdl:message name="Method">
      <wsdl:part name="request" element="s0:Method"/>
    </wsdl:message>

    <wsdl:message name="MethodResponse">
      <wsdl:part name="response" element="s0:MethodResponse"/>
    </wsdl:message>

Я полагаю, что кто-то упоминал об этом раньше, но я пока не могу проголосовать.

4 голосов
/ 01 ноября 2012

Вы пытались изменить WSDL так, чтобы для каждого экземпляра элемента part = "tns: myOperation" name = "request" менялось значение атрибута name на 'parameters'.

4 голосов
/ 12 марта 2010

Вот еще один пункт для проверки:

  1. Щелкните правой кнопкой мыши ссылку на службу в обозревателе решений и выберите «Настроить ссылку на службу»

  2. Проверьте, установлен ли флажок «Всегда генерировать контракты сообщений».

2 голосов
/ 08 апреля 2011

Хотя я знаю, что эта запись давно устарела, для тех, кто сталкивается с этой же проблемой:

Дважды проверьте, что созданный прокси не содержит неровных массивов, например,

(C #)

private string[][] mystring;

(VB.NET)

Private myString()() As String
1 голос
/ 04 марта 2010

Вы пробовали использовать scvutil Перейти к -> Стартовое меню / Visual Studio 2008 / Инструменты / Командная строка VS

Введите svcutil, затем проверьте параметры, особенно параметр / wrapped. В конце концов используйте это для генерации вашего прокси, это даст вам намного больше контроля над тем, что происходит

...