2016-01-07 1 views
0

Мой вопрос похож на вопрос в следующем сообщении: Consume XML SOAP Webservice in Java. В основном моя проблема заключается в том, что генерация кода клиента с помощью wsimport действительно не сработает, но генерирует предупреждение «Порт [WARNING]« reqReplyEndpoint »не содержит каких-либо пригодных для использования операций». Это приводит к неполному генерации кода, например. Мне не хватает параметров в сгенерированных классах запросов/reqponse. Это служба WCF, размещенная в IIS, которая использует службу маршрутизации сообщений WCF. IIS направляет все запросы на обслуживание в конечную точку. У меня нет контроля над этой Службой, я просто должен ее использовать. Любая идея, как достичь этого без рабочего wsimport, например. подход, упомянутый аксапти? Доступны ли какие-либо рамки, образцы? Кроме того, для упомянутого подхода решения использования валидатора схемы для проверки WSDL во время выполнения, а затем на основе которого есть отдельные механизмы синтаксического анализа?Cosuming XML SOAP Webservice без «wsimport»

+0

ли WSDL использовать вообще? Вы пытались импортировать его в другой инструмент, например, soapUI для проверки его целостности? –

+0

Да WSDL можно использовать. Я могу использовать его с помощью основного консольного приложения C# и добавления ссылки на службу. Использование SoapUI: ошибка загрузки WSDL (org.apache.xmlbeans.XmlException: ошибка: ссылка на неопределенное сущность объекта raquo). WSDL импортирует схему из разных пространств имен, как простых, так и сложных типов. – tinu73

+0

Хмм, если soapUI жалуется на WSDL во время импорта, я не думаю, что WSDL верен. Если возможно, вы можете разместить здесь WSDL-контент (включая XSD с ссылкой), и мы можем исправить WSDL. Затем wsimport также должен работать. –

ответ

0

только что проверил ваш пакет.

В вашем WSDL есть две службы, одна из которых называется reqReplyEndpoint, а другая - BasicHttpBinding_TestTableService. Я совершенно уверен, вы хотите, чтобы продолжить BasicHttpBinding_TestTableService, потому что другой имеет пустое определение в нем (никаких операций и т.д. не определена, см xppservice-wsdl0.xml)

Поэтому: "[WARNING] Port "reqReplyEndpoint" does not contain any usable operations" не является причина для пустого TestTableServiceGetListRequest. Это две отдельные службы wsdl: без прямой связи между ними. Это предупреждение вызывается, потому что привязка с именем «reqReplyEndpoint» указывает на тип порта с именем «IRequestReplyRouter», в котором есть пустое определение (просто сравните содержимое xppservice-wsdl0.xml с xppservice-wsdl1.xml). Причина этого должна быть где-то в вашем коде, я не эксперт по C# WSDL (но я достаточно опытен в WSDL/Webservices в целом).

Следующая: Ваш WSDL содержит три операции с именами: createMember deleteMember GetList

WSDL,-результат (SOAP окр) для GetList соответствует SoapUI:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dat="http://schemas.microsoft.com/dynamics/2010/01/datacontracts" xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:ser="http://ax.bernina.com/01/services"> 
    <soapenv:Header> 
     <dat:CallContext> 
     <!--Optional:--> 
     <dat:Company>?</dat:Company> 
     <!--Optional:--> 
     <dat:Language>?</dat:Language> 
     <!--Optional:--> 
     <dat:LogonAsUser>?</dat:LogonAsUser> 
     <!--Optional:--> 
     <dat:MessageId>?</dat:MessageId> 
     <!--Optional:--> 
     <dat:PropertyBag> 
      <!--Zero or more repetitions:--> 
      <arr:KeyValueOfstringstring> 
       <arr:Key>?</arr:Key> 
       <arr:Value>?</arr:Value> 
      </arr:KeyValueOfstringstring> 
     </dat:PropertyBag> 
     </dat:CallContext> 
    </soapenv:Header> 
    <soapenv:Body> 
     <ser:TestTableServiceGetListRequest/> 
    </soapenv:Body> 
</soapenv:Envelope> 

Вы видите, ser: TestTableServiceGetListRequest пуст, поскольку базовая база xsd (xppservice-xsd3.xml) содержит там пустое определение:

<xs:element name="TestTableServiceGetListRequest"> 
     <xs:complexType> 
     <xs:sequence/> 
     </xs:complexType> 
    </xs:element> 

Если вы ожидаете еще нескольких параметров в TestTableServiceGetListRequest, вы должны проверить соответствующий исходный код (который отвечает за результат WSDL - я не говорю о результате wsimport), если что-то отсутствует (аннотация или подобное).

Кроме того: я бы предложил скорее создать контракт с первым проектом (сначала создайте WSDL, а затем сгенерируйте код), чем код-первый дизайн, потому что, как видите, результат от кода может быть не таким, как ожидаемый и поиск основная причина в коде может быть сложной.

Edit 1 Что касается вопроса 1 из комментариев:

Если вы хотите переместить CallContext из мыла: заголовок в мыльном: тело, после должны быть изменены в WSDL (xppservice-WSDL.XML):

До:

<wsdl:operation name="getList"> 
     <soap:operation soapAction="http://ax.bernina.com/01/services/TestTableService/getList" style="document"/> 
     <wsdl:input name="TestTableServiceGetListRequest"> 
      <soap:header message="i1:TestTableServiceGetListRequest_Headers" part="context" use="literal"/> 
      <soap:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output name="TestTableServiceGetListResponse"> 
      <soap:body use="literal"/> 
     </wsdl:output> 
     <wsdl:fault name="AifFaultFault"> 
      <soap:fault name="AifFaultFault" use="literal"/> 
     </wsdl:fault> 
     </wsdl:operation> 

После:

<wsdl:operation name="getList"> 
     <soap:operation soapAction="http://ax.bernina.com/01/services/TestTableService/getList" style="document"/> 
     <wsdl:input name="TestTableServiceGetListRequest"> 
      <soap:body message="i1:TestTableServiceGetListRequest_Headers" part="context" use="literal"/> 
     </wsdl:input> 
     <wsdl:output name="TestTableServiceGetListResponse"> 
      <soap:body use="literal"/> 
     </wsdl:output> 
     <wsdl:fault name="AifFaultFault"> 
      <soap:fault name="AifFaultFault" use="literal"/> 
     </wsdl:fault> 
     </wsdl:operation> 
+0

Если вы ожидаете некоторого определения в TestTableServiceGetList-Request, вам нужно будет исправить его в коде, который отвечает за службу на стороне сервера и WSDL. Впоследствии вы можете перейти на клиентскую сторону. –

+0

Если серверная сторона выполнена (ожидаемые параметры, существующие в WSDL + XSD), и худшее приходит к худшему, и вы вынуждены добиваться прогресса на стороне клиента, вы все равно можете обойти все шаги генерации wsimport wsdl и сделать следующее довольно грубое обходное решение: Создайте мыльные конверты с soapUI (как я сделал выше) и отправьте полученный мыльный конверт с помощью простого http-клиента (например, apache httpclient - даже завиток из командной строки) в качестве http-полезной нагрузки на сервер. Да, это пропускает все преимущества технологии webservice (контракты, типы, ..), но, как я сказал: если худшее приходит к худшему .. –

+0

Большое спасибо за этот очень хороший ответ. Ваше объяснение очень подробное и ясное для меня. У меня есть еще несколько вопросов, и я был бы признателен, если бы вы могли мне помочь: – tinu73

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

  • Нет связанных вопросов^_^