Ошибка создания прокси-класса из WSDL. Элемент отсутствует? - PullRequest
3 голосов
/ 06 февраля 2012

Я признаю, что не знаю, когда речь заходит о WSDL.Мне предоставили следующий WSDL для проекта, над которым я работаю, но он не работает.Вот пост WSDL, который я использую.Меня попросили удалить фактический URL-адрес службы из wsdl, чтобы он не был проиндексирован и не попал сканерами.Фактический URL был заменен на «www.testsite.org».Вот XML:

<wsdl:definitions xmlns:tns="https://www.testsite.org/uiws-test" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" name="uiicon" targetNamespace="https://www.testsite.org/uiws-test">
<!-- TYPES -->
<wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="https://www.testsite.org/uiws-test">
<xsd:complexType name="ResponseType">
<xsd:sequence>
<xsd:element name="request_id" type="xsd:string"/>
<xsd:element name="messages" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="responseType" type="tns:ResponseType"/>
<xsd:element name="ICON_MessageTrain" type="xsd:string"/>
<xsd:element name="fault" type="xsd:string"/>
</xsd:schema>
</wsdl:types>
<!-- MESSAGES -->
<wsdl:message name="RequestMessage">
<wsdl:part name="ICON_MessageTrain" element="tns:ICON_MessageTrain"/>
</wsdl:message>
<wsdl:message name="ResponseMessage">
<wsdl:part name="response" element="tns:responseType"/>
</wsdl:message>
<wsdl:message name="FaultMessage">
<wsdl:part name="fault" element="tns:fault"/>
</wsdl:message>
<wsdl:message name="SourceHeader">
<wsdl:part name="source" element="xsd:string"/>
</wsdl:message>
<wsdl:message name="ApplicationHeader">
<wsdl:part name="application" element="xsd:string"/>
</wsdl:message>
<!-- PORT TYPES -->
<wsdl:portType name="uiicon_portType">
<wsdl:operation name="uiicon">
<wsdl:input message="tns:RequestMessage"/>
<wsdl:output message="tns:ResponseMessage"/>
<wsdl:fault message="tns:FaultMessage" name="FaultMessage"/>
</wsdl:operation>
</wsdl:portType>
<!-- BINDINGS -->
<wsdl:binding name="uiicon_binding" type="tns:uiicon_portType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="uiicon">
<soap:operation soapAction="https://www.testsite.org/uiws-test/services/uiicon-test" style="document"/>
<wsdl:input>
<soap:header part="source" message="tns:SourceHeader" use="literal"/>
<soap:header part="application" message="tns:ApplicationHeader" use="literal"/>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="FaultMessage">
<soap:fault name="FaultMessage" use="literal"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<!-- SERVICES -->
<wsdl:service name="uiicon_service">
<wsdl:documentation>
This is the web service for UI-ICON data exchange modernization project
</wsdl:documentation>
<wsdl:port name="uiicon_port" binding="tns:uiicon_binding">
<soap:address location="https://www.testsite.org/uiws-test/services/uiicon-test"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

Когда я запускаю это в wsdl.exe, я получаю следующую ошибку:

Я вижу, где wsdl ссылается на схему w3.org 2001, и вижу ссылку на строковую схему.Просто не уверен, как это должно выглядеть и почему это неправильно.Спасибо!

Ответы [ 2 ]

3 голосов
/ 06 февраля 2012

WSDL действителен, если вы измените element на type в ваших SourceHeader и ApplicationHeader ссылках, то есть:

<wsdl:message name="ApplicationHeader">
    <wsdl:part name="application" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="SourceHeader">
    <wsdl:part name="source" type="xsd:string"/>
</wsdl:message>

С element вы ссылаетесь на предопределенный простой или сложныйтип.Здесь, однако, вы определяете новый элемент (называемый application / source), который имеет тип xsd:string.Поэтому вам нужно использовать type.

Насколько я вижу, вам просто нужна отдельная часть сообщения под названием application, которая содержит строку.Исправление должно заставить эту работу, и WSDL действителен.Я не могу гарантировать, что фактический веб-сервис будет принимать / отправлять, поскольку его описание недействительно, хотя ...

1 голос
/ 28 марта 2013

Я не верю, что это так просто, как это принято в принятом ответе.

На основании моего прочтения спецификации WSDL 1.1, раздел 2.3.1 Части сообщения , этот WSDL должен быть действительным.

Насколько я понимаю, один из ключевых элементов, определяющих, следует ли использовать элемент или тип, основан на стиле привязки - rpc против документа, буквальный или кодированный. Ответ на аналогичный вопрос более детально описан, как и статья , на которую ссылается ответ .

Поскольку этот WSDL использует привязку документа / литерала, мне кажется, что использование элемента над типом является правильным.

...