Как я могу изменить префикс пространства имен в этом WSDL? - PullRequest
1 голос
/ 22 декабря 2009

Я пытаюсь создать 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?

Ответы [ 2 ]

4 голосов
/ 22 декабря 2009

Префикс пространства имен не имеет значения. Два примера идентичны по правилам XML.

1 голос
/ 03 июня 2011

Префиксы пространства имен точно такие же, как имена переменных. Вы можете псевдоним пространства имен с любым, что вы хотите.

Это аналогично следующему коду Java:

В первом XML: api.fxtrade.onada onada;
Во втором XML: api.fxtrade.onada m;

Другими словами, 1-й XML можно читать как:
ссылаясь на пространство имен "oanda.fxtrade.api" с переменной onada, тег create в пространстве имен onada будет иметь значение параметра FXGAME .
Второй XML можно прочитать как:
ссылаясь на пространство имен "oanda.fxtrade.api" с переменной m, тег create в пространстве имен m будет иметь параметр ...

...