Мой вопрос похож на вопрос в следующем сообщении: Consume XML SOAP Webservice in Java. В основном моя проблема заключается в том, что генерация кода клиента с помощью wsimport действительно не сработает, но генерирует предупреждение «Порт [WARNING]« reqReplyEndpoint »не содержит каких-либо пригодных для использования операций». Это приводит к неполному генерации кода, например. Мне не хватает параметров в сгенерированных классах запросов/reqponse. Это служба WCF, размещенная в IIS, которая использует службу маршрутизации сообщений WCF. IIS направляет все запросы на обслуживание в конечную точку. У меня нет контроля над этой Службой, я просто должен ее использовать. Любая идея, как достичь этого без рабочего wsimport, например. подход, упомянутый аксапти? Доступны ли какие-либо рамки, образцы? Кроме того, для упомянутого подхода решения использования валидатора схемы для проверки WSDL во время выполнения, а затем на основе которого есть отдельные механизмы синтаксического анализа?Cosuming XML SOAP Webservice без «wsimport»
ответ
только что проверил ваш пакет.
В вашем 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>
Если вы ожидаете некоторого определения в TestTableServiceGetList-Request, вам нужно будет исправить его в коде, который отвечает за службу на стороне сервера и WSDL. Впоследствии вы можете перейти на клиентскую сторону. –
Если серверная сторона выполнена (ожидаемые параметры, существующие в WSDL + XSD), и худшее приходит к худшему, и вы вынуждены добиваться прогресса на стороне клиента, вы все равно можете обойти все шаги генерации wsimport wsdl и сделать следующее довольно грубое обходное решение: Создайте мыльные конверты с soapUI (как я сделал выше) и отправьте полученный мыльный конверт с помощью простого http-клиента (например, apache httpclient - даже завиток из командной строки) в качестве http-полезной нагрузки на сервер. Да, это пропускает все преимущества технологии webservice (контракты, типы, ..), но, как я сказал: если худшее приходит к худшему .. –
Большое спасибо за этот очень хороший ответ. Ваше объяснение очень подробное и ясное для меня. У меня есть еще несколько вопросов, и я был бы признателен, если бы вы могли мне помочь: – tinu73
ли WSDL использовать вообще? Вы пытались импортировать его в другой инструмент, например, soapUI для проверки его целостности? –
Да WSDL можно использовать. Я могу использовать его с помощью основного консольного приложения C# и добавления ссылки на службу. Использование SoapUI: ошибка загрузки WSDL (org.apache.xmlbeans.XmlException: ошибка: ссылка на неопределенное сущность объекта raquo). WSDL импортирует схему из разных пространств имен, как простых, так и сложных типов. – tinu73
Хмм, если soapUI жалуется на WSDL во время импорта, я не думаю, что WSDL верен. Если возможно, вы можете разместить здесь WSDL-контент (включая XSD с ссылкой), и мы можем исправить WSDL. Затем wsimport также должен работать. –