2012-02-06 4 views
2

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

<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, я получаю следующее сообщение об ошибке:

  • Невозможно импортировать операцию 'uiicon.
  • Элемент «http://www.w3.org/2001/XMLSchema:string» отсутствует

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

ответ

2

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.

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

+0

Спасибо! Я отправил эту информацию обратно поставщику услуг, и было сделано обновление, которое, похоже, работает. –

+0

Приятно слышать, я рад помочь! – joergl

1

Я не верю, что это так же суровое, как и принятый ответ, быть.

Основываясь на моем чтении WSDL 1.1 spec, section 2.3.1 Message Parts, этот WSDL должен быть действительным.

Также я понимаю, что один из ключевых элементов, чтобы определить, следует ли использовать элемент или тип, основан на стиле привязки - rpc vs. document, literal vs. encoded. An answer to a similar question более подробно, как и article that the answer references.

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

Смежные вопросы