Включить тип схемы в файл WSDL

Я создал WSDL вручную, в котором есть только одна операция без входного параметра и без выходного параметра.

Я получаю следующую ошибку при попытке создать клиента из этого WSDL:

Невозможно импортировать wsdl:portType. Подробно: Возникла исключительная ситуация при запуске расширения импорта WSDL: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Ошибка: схема с целевым пространством имен ' http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/'не может быть найдено. XPath to Error Источник: // wsdl: определения [@ targetNamespace = ' http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/'] / wsdl:portType [@ name = 'GAMEAssociateIntf'] C: \ Панели инструментов \BlueTest\BloodRedTest\BloodRedTest\Service

types (для использования в клиенте) должен быть сгенерирован из XML, присутствующего в WSDL. Я думаю, что при добавлении Service Reference инструмент не может создать его из-за какой-то ошибки в XML. Кажется, проблема в xsd.

Какие изменения необходимо внести в WSDL для создания прокси?

Примечание. Я пытаюсь включить типы xml, определенные в самом WSDL. [Мне не нужен отдельный файл для определения схемы]

WSDL

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="GAMEAssociate" 
         targetNamespace="http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/"
         xmlns:tns="http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/"
         xmlns="http://schemas.xmlsoap.org/wsdl/" 
         xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
         xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 
         xmlns:xsd="http://www.w3.org/2001/XMLSchema"
         xmlns:wsp="http://www.w3.org/ns/ws-policy"
         >

<types>
<xsd:schema>
</xsd:schema>

<xsd:element name="myData">
  <xsd:complexType />
</xsd:element>

<xsd:element name="myDataResponse">
  <xsd:complexType />
</xsd:element>

</types>

<message name="getAllVicePresidentsRequest">
<part element="tns:myData" name="getAllVicePresidentsRequest"/>
</message>

<message name="getAllVicePresidentsResponse">
<part element="tns:myDataResponse" name="getAllVicePresidentsResponse"/>
</message>

<portType name="GAMEAssociateIntf">
<operation name="getAllVicePresidents">
  <input message="tns:getAllVicePresidentsRequest"/>
  <output message="tns:getAllVicePresidentsResponse"/>
</operation>
</portType>

<binding name="GAMEAssociateIntfBinding" type="tns:GAMEAssociateIntf">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

<operation name="getAllVicePresidents">
  <soap:operation soapAction="http://www.xmlns.mycompany.com/GAME/wsdl/AssociateIntf/1.4/getAllVicePresidentsRequest"
                  style="document"/>
  <input>
    <soap:body use="literal"/>
  </input>
  <output>
    <soap:body use="literal"/>
  </output>

</operation>

</binding>

<service name="GAMEAssociate">
<port binding="tns:GAMEAssociateIntfBinding" name="GAMEAssociateSOAP">
  <soap:address location="http://localhost:8014/associateservice/GAMEAssociate.svc"/>
</port>
</service>

</definitions>

ССЫЛКИ:

  1. WSDL - без участия - лучшая практика
  2. Что означает эта ошибка WCF: "Предупреждение пользовательского инструмента: невозможно импортировать wsdl:portType"
  3. Написание контракта на веб-службу WSDL 1.1 вручную
  4. Написание контракта - первые веб-сервисы
  5. генерировать код сервера wcf из файлов wsdl
  6. Как получить входные и выходные имена WSDL, чтобы появиться
  7. Встроенная схема
  8. Ручной SOAP-запрос

3 ответа

Решение

Я упомянул встроенную схему. Благодаря @Indoknight также. Рабочий контракт WSDL приведен ниже.

Примечание 1: Префикс xsd и targetNamespace присутствуют в схеме, которая используется внутри wsdl type

Примечание 2: nillable="true" применяется для типа, используемого в ответном сообщении

Примечание 3: Если вы получаете следующее исключение, убедитесь, что soapAction точно так же в контракте WSDL и wsdl, сгенерированном из службы WCF. Некоторые инструменты, используемые для генерации кода Сервиса, могут изменять действие SOAP по собственному желанию.

Код ошибки: a: ActionNotSupported

Faultstring: сообщение с действием ' http://www.xmlns.mycompany.com/GAME/wsdl/AssociateIntf/1.4/getAllVicePresidentsRequest' не может быть обработано в получателе из-за несовпадения ContractFilter в EndpointDispatcher. Это может быть связано либо с несоответствием контракта (несоответствующие действия между отправителем и получателем), либо с несоответствием привязки / безопасности между отправителем и получателем. Убедитесь, что отправитель и получатель имеют одинаковый контракт и одинаковую привязку (включая требования безопасности, например, Сообщение, Транспорт, Нет).

Действие SOAP - Контракт WSDL

  <soap:operation soapAction="http://www.xmlns.mycompany.com/GAME/wsdl/AssociateIntf/1.4/getAllVicePresidentsRequest"

Действие SOAP - Сгенерированный WSDL

<soap:operation soapAction="http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/IGAMEAssociateIntf/getAllVicePresidents"

Контракт WSDL

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="GAMEAssociate"
     targetNamespace="http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/"
     xmlns:tns="http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/"
     xmlns="http://schemas.xmlsoap.org/wsdl/"
     xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
     xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:wsp="http://www.w3.org/ns/ws-policy"
     >

<types>
<xsd:schema targetNamespace="http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
  <xsd:element name="myData">
    <xsd:complexType />
  </xsd:element>
  <xsd:element name="myDataResponse" nillable="true">
    <xsd:complexType />
  </xsd:element>
</xsd:schema>
</types>

<message name="getAllVicePresidentsRequest">
<part element="tns:myData" name="getAllVicePresidentsRequest"/>
</message>

<message name="getAllVicePresidentsResponse">
<part element="tns:myDataResponse" name="getAllVicePresidentsResponse"/>
</message>

<portType name="GAMEAssociateIntf">
<operation name="getAllVicePresidents">
  <input message="tns:getAllVicePresidentsRequest"/>
  <output message="tns:getAllVicePresidentsResponse"/>
</operation>
</portType>

<binding name="GAMEAssociateIntfBinding" type="tns:GAMEAssociateIntf">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getAllVicePresidents">
  <soap:operation soapAction="http://www.xmlns.mycompany.com/GAME/wsdl/AssociateIntf/1.4/getAllVicePresidentsRequest"
                  style="document"/>
  <input>
    <soap:body use="literal"/>
  </input>
  <output>
    <soap:body use="literal"/>
  </output>
</operation>
</binding>

<service name="GAMEAssociate">
<port binding="tns:GAMEAssociateIntfBinding" name="GAMEAssociateSOAP">
  <soap:address location="http://localhost:8014/associateservice/GAMEAssociate.svc"/>
</port>
</service>

</definitions>

Запрос

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/">
<soapenv:Header/>
<soapenv:Body>
  <ns:myData/>
</soapenv:Body>
</soapenv:Envelope>

отклик

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <myDataResponse xsi:nil="true" xmlns="http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/"/>
</s:Body>
</s:Envelope>

Я провел некоторое время, пытаясь выяснить проблемы. Ваш раздел в wsdl неверен, он должен быть таким, как показано ниже. Теперь я могу создавать на стороне клиента артефакты на стороне клиента.

<types>
<schema targetNamespace="http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/"
          xmlns="http://www.w3.org/2001/XMLSchema">
   <element name="myData">
     <complexType/> 
   </element>

   <element name="myDataResponse">
     <complexType/>
   </element>
</schema></types>

ОБНОВИТЬ

На основе разговора ниже. Добавил nillable приписывать.

<element name="myDataResponse" nillable="true">
<complexType/>
</element>

Запрос

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/">
<soapenv:Header/>
<soapenv:Body>
  <ns:myData/>
</soapenv:Body>
</soapenv:Envelope>

отклик

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <myDataResponse xsi:nil="true" xmlns="http://www.xmlns.mycompany.com/GAME/service/Associate/1.1/"/>
</s:Body>
</s:Envelope>

На wsi.org есть набор инструментов для проверки, которые, безусловно, стоит попробовать.

Дополнительным преимуществом использования этих инструментов является то, что вы можете фактически заявить о соответствии спецификации WSDL.

Другие вопросы по тегам