Когда я импортирую данную службу с помощью «Добавить ссылку на службу» в 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, потому что вложение типов идет очень глубоко, и мне потребуется время, чтобы тщательно его изучить. В то же время я надеюсь, что это может позвонить в звонок - любая помощь высоко ценится.