Я пытаюсь создать WSDL для уже существующего веб-сервиса. У меня есть существующий клиент и существующий сервер, и я зафиксировал формат, который использует Wireshark. Я пытаюсь написать новый клиент, который использует тот же формат. Поэтому я стараюсь максимально приблизиться к формату, будь он правильным или нет. Я готовлю WSDL-файл с использованием XmlSPY, который я надеюсь затем перевести на C # и сгенерировать код интерфейса.
Вот мой WSDL:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.ecerami.com/wsdl/HelloService.wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ecerami.com/wsdl/HelloService.wsdl" name="HelloService">
<message name="api:create"/>
<message name="oanda:create">
<part name="parameter"/>
<part name="parameter"/>
</message>
<portType name="Oanda_PortType">
<operation name="create">
<input message="tns:oanda:create"/>
<output message="tns:api:create"/>
</operation>
</portType>
<binding name="Oanda_binding" type="tns:Oanda_PortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="create">
<soap:operation soapAction="sayHello"/>
<input>
<soap:body use="encoded" namespace="oanda.fxtrade.api"/>
</input>
<output>
<soap:body use="encoded" namespace="oanda.fxtrade.api"/>
</output>
</operation>
</binding>
<service name="Oanda_service">
<documentation>WSDL File for Oanda FX Trade API (local SOAP server)</documentation>
<port name="Oanda_port" binding="tns:Oanda_binding">
<soap:address location="http://10.0.0.3:18081"/>
</port>
</service>
</definitions>
Вот пример сообщения, которое я пытаюсь скопировать. Вот что излучает оригинальный клиент:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<oanda:create xmlns:oanda="oanda.fxtrade.api">
<parameter>FXGAME</parameter>
<parameter></parameter>
</oanda:create>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Вот что XmlSPY говорит, что мой WSDL будет выдавать то же сообщение:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<m:create xmlns:m="oanda.fxtrade.api">
<parameter/>
<parameter/>
</m:create>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Мой вопрос на данный момент - как мне сопоставить префикс "oanda:", сгенерированный исходным клиентом? Это то, что называется префикс пространства имен? Откуда взялась буква "m:" в моем сгенерированном коде? Я могу найти упоминания об этом в других примерах на этом сайте, но ни один из них не использует WSDL, по крайней мере, насколько я могу судить.
Спасибо за любую помощь, которую вы можете оказать.
Когда я пытаюсь запустить вышеуказанный WSDL через svcutil.exe, у меня возникают две проблемы.
1) XML не правильно сформирован, поскольку вы не можете иметь более одного параметра с одним и тем же именем. XMLSpy также жаловался на это, поэтому я пока что исправил это, переименовав их в Parameter1 и Parameter2.
Конкретная ошибка: «Указано более одной части сообщения с именем« параметр ». Каждая часть сообщения должна иметь уникальное имя».
2) После этого я получаю эту ошибку:
"Префикс пространства имен 'tns: oanda' не определен."
Итак, еще раз: Как мне изменить / добавить определение пространства имен в файле WSDL?