Как мне импортировать этот WSDL? - PullRequest
2 голосов
/ 14 марта 2011

Я получил WSDL от клиента как часть импорта веб-службы для взаимодействия с их системой. Они отправили два файла: WSDL и схему. Когда я запускаю импортер WSDL, я получаю вывод, который выглядит следующим образом:

type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Embarcadero types; however, they could also
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:LoadData     - "http://client.com/"[Lit][]
  // !:LoadDataResponse - "http://client.com/"[Lit][]


  // ************************************************************************ //
  // Namespace : http://client.com/
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : document
  // binding   : ClientPortBinding
  // service   : ClientService
  // port      : ClientPort
  // URL       : http://localhost:8080/ClientService
  // ************************************************************************ //
  IClientLoad = interface(IInvokable)
  ['{8DC02C6F-78D3-E09A-FE43-EE5211DB188D}']

    // Cannot unwrap:
    //     - Input part does not refer to an element
    //     - Output part does not refer to an element
    function  LoadDataBatch(const parameters: LoadData): LoadDataResponse; stdcall;
  end;

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

<xsd:import namespace="http://client.com/" schemaLocation="file://C:/Users/mwheeler/Documents/WSDL/ClientLoadData Schema.xml"></xsd:import>

Как мне установить это правильно, чтобы мастер импорта Delphi WSDL проверил файл схемы в моей локальной системе и прочитал определения типов из него?

1 Ответ

0 голосов
/ 15 марта 2011

Проблема может быть не на стороне импорта, а скорее на стороне экспорта.У нас возникла ситуация:

  • Серверное приложение с кодировкой Delphi, которое также отвечает на веб-запросы SOAP.
  • Клиентское приложение с кодировкой .Net, использующее SOAP для взаимодействия с серверным приложением Delphi.

Серверное приложение Delphi не будет и не будет экспортировать определенный (базовый) тип в свой ответ WSDL, если этот (базовый) тип не используется ни в одном из экспортируемых интерфейсов SOAP.

Пример:

TBaseReponseClass = class(TRemotable)
end;

TLoginResponseClass = class(TBaseReponseClass)
end;

ISOAPResponse = interface(IInvokable)
['{SomeGUID}']
  function Ping: TBaseReponseClass ; stdcall
  function Login: TLoginResponseClass ; stdcall;
end;

С функцией Ping в ISOAPResponse все работает нормально.

Без функции Ping в ISOAPResponse TBaseResponseClass не будет экспортироваться в WSDL и импортироватьсяWSDL на стороне .Net будет выдавать ошибки о неопределенных элементах.

Я полагаю, вы можете проверить WSDL, полученный от вашего клиента, чтобы увидеть, использует ли он какие-либо классы, для которых один или несколько классов в иерархии предковне включены в WSDL / схему.Если это так, то вам, возможно, придется вернуться к своим клиентам, чтобы они изменили интерфейсы.Или, если вам повезет, возможно, найдите некоторые варианты включения классов-предков, на которые нет прямой ссылки, включенных в WSDL / Schema.Мы не исследовали последнее, так как оба приложения находятся под нашим собственным контролем, и было проще просто добавить функцию «Ping».

...