Проблема с импортом WSDL в Delphi

У меня есть URL-адрес WSDL: http://www.persiansms.info/webservice/smsService.php?wsdl

когда я пытаюсь создать интерфейс с Delphi WSDL Importer, Delphi генерирует это предупреждение:

  // ************************************************************************ //
  // 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.
  // ************************************************************************ //
  // !:int             - "http://www.w3.org/2001/XMLSchema"[]
  // !:ArrayOf_xsd_long - "http://www.w3.org/2001/XMLSchema"[]
  // !:string          - "http://www.w3.org/2001/XMLSchema"[]
  // !:array           - "http://www.w3.org/2001/XMLSchema"[]

Итак, массив чего?? документ WSDL никогда не упоминал, какой у него тип, например:

<part name="note" type="xsd:array"/>

Я в замешательстве, это ошибка в delphi? или документ WSDL неполный? С ним хорошо работает программа на C#, но у меня нет исходного кода.

что мне делать тогда? Можно ли узнать, что это такое?


person You-See    schedule 30.12.2012    source источник
comment
Похоже, вы получили ответ ниже. Причина, по которой я спросил, какая версия Delphi, заключается в том, что пять или шесть лет назад я обнаружил, что код, сгенерированный импортером WSDL D7 на определенном сайте, содержит ошибки. Я получил подтверждение того, что ошибки были характерны для D7, и некоторую помощь от кого-то, ответственного за код в Embarcadero в то время, но у меня нет сведений о том, в чем была проблема или с кем я работал. Если вы столкнетесь с проблемами, хотя я знаю, что это будет болезненно, вам может понадобиться посмотреть, можете ли вы использовать более современную версию Delphi для какой-то части этого, возможно, в DLL? Извините, я больше ничем не могу помочь.   -  person RobertFrank    schedule 01.01.2013


Ответы (3)


мы можем решить, что проблема с этим типом должна быть заменена на "Array"; :

T2dArray = массив массива WideString;

может быть, это может помочь другим. я тестирую это, все еще это работает!

person You-See    schedule 05.01.2013

Мой старый BDS2006 (немецкий) добавляет комментарий к сгенерированному коду

// ************************************************************************ //
// Die folgenden Typen, auf die im WSDL-Dokument Bezug genommen wird, sind in dieser Datei
// nicht repräsentiert. Sie sind entweder Aliase(@) anderer repräsentierter Typen oder auf sie wurde Bezug genommen,
// aber in diesem Dokument nicht deklariert (!). Die Typen aus letzterer Kategorie
// sind normalerweise mit vordefinierten/bekannten XML- oder Borland-Typen verbunden; sie könnten aber auch ein Anzeichen
// für ein falsches WSDL-Dokument sein, das einen Schema-Typ nicht deklariert oder importiert..
// ************************************************************************ //
// !:string          - "http://www.w3.org/2001/XMLSchema"
// !:array           - "http://www.w3.org/2001/XMLSchema"
// !:int             - "http://www.w3.org/2001/XMLSchema"
// !:ArrayOf_xsd_long - "http://www.w3.org/2001/XMLSchema"

Это означает: Следующие типы, на которые есть ссылки в документе WSDL, не представлены (объявлены?) в нем. Они либо являются псевдонимами (@) других включенных типов, но не (!) объявленными в этом документе. Типы последней категории обычно связаны с предопределенными/известными типами XML или Borland, но также могут указывать на недействительный WSDL-документ, который не объявляет или не импортирует тип схемы.

Извините за экзотический перевод.

person alzaimar    schedule 30.12.2012

Проблема связана с кодировкой WSDL RPC, которую Delphi не поддерживает (даже XE3), как показано в выдержке из wsdl ниже:

<binding name="sms_webserviceBinding" type="tns:sms_webservicePort">
  <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="send_sms_array">

Он работает с клиентом C#, поскольку поддерживается RPC, как показано ниже:

public interface sms_webservicePort {

    [System.ServiceModel.OperationContractAttribute(Action="urn:sms_webservice#sms_webservice#send_sms_array", ReplyAction="*")]
    [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, SupportFaults=true, Use=System.ServiceModel.OperationFormatUse.Encoded)]
    [return: System.ServiceModel.MessageParameterAttribute(Name="send_sms_array")]
    string send_sms_array(string username, string password, string sender_number, string receiver_number, string note, string ersal_flash, string onlysend, int date);

А в Java с использованием NetBeans 7.x можно получить более явное сообщение:

Выбранный wsdl имеет кодировку rpc. Вы должны выбрать JAX-RPC Client.

person Jack G.    schedule 31.12.2012