Я абсолютно плохо знаком с веб-сервисами, но не плохо знаком с Delphi.
Я импортирую файл WSDL в Delphi 2010 с "мастером" Средства импорта WSDL. Файл WSDL содержит некоторые теги "attributeGroup", которые полностью игнорирует Delphi, который является, по-видимому, ошибкой, хотя я еще не нашел запись на Качестве Центральной для этой проблемы, только упоминает на форумах как здесь и здесь.
Мой вопрос имеет несколько частей:
Обновление
На основе моих событий и ответов в этом вопросе, я решил пойти путем обертки с консольным приложением C#, которое ест входные данные JSON и выводы данные ответа JSON. Приложение Delphi управляет приложением C#. Часть SOAP всего этого теперь легка, и "просто работает" в C#.NET, и остальная часть функциональности обрабатывается хорошо Delphi. Я рекомендовал бы этот маршрут кому-либо еще с подобными проблемами. Я действительно пытался экспортировать блок SOAP C# как библиотеку COM и соединиться с этим от Delphi, но это стало очень сложным, потому что спецификация SOAP в моем конкретном приложении является большой и несколько сложной.
Хорошо, это заняло некоторое время.
Согласно в этом сообщении , существуют определенные теги, которые инструмент .NET wsdl.exe просто не распознает при импорте файла wsdl. Согласно MSDN :
attributeGroup : игнорируется. DataContractSerializer не поддерживает использование xs: group, xs: attributeGroup и xs: attribute. Эти объявления игнорируются как дочерние по отношению к xs: schema, но на них нельзя ссылаться из complexType или других поддерживаемых конструкций.
Это поведение также описано (хотя и очень трудно для понимания) в одном из блогов MSDN . В моем конкретном случае конкретная часть файла wsdl, вызывающая проблему, выглядит следующим образом:
<xs:complexType name="PhonesType">
<xs:annotation>
<xs:documentation xml:lang="en">Provides detailed phone information.</ xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Phone">
<xs:annotation>
<xs:documentation xml:lang="en">Used to pass detailed phone information.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attributeGroup ref="TelephoneInfoGroup"/>
<xs:attributeGroup ref="ID_OptionalGroup">
<xs:annotation>
<xs:documentation xml:lang="en">The ID attribute in this group is a unique identifying value assigned by the creating system and may be used to reference a primary-key value within a database or in a particular implementation.</xs:documentation>
</xs:annotation>
</xs:attributeGroup>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
Кажется, что
игнорируется .NET wsdl.exe, точно так же, как он игнорировался импортером wsdl Delphi. В такой ситуации, когда импорт не удается как в Delphi, так и в .NET, вероятно, придется изменить файл wsdl, а это означает, что мне все-таки придется использовать самодельный python ref-flattener.
У нас была аналогичная проблема с Delphi 2009 и стандартной службой Soap (CRM). Это не было связано с attributeGroup. Мы обнаружили так много несовместимостей, что наконец решили использовать небольшое приложение C # в качестве прокси для реальной службы на основе .Net.
Я был автором первой ссылки, которую вы приводите. Кажется, я узнал, что этот баг так и не был исправлен.
Позже я разместил другой вопрос на Embarcadero Developer Network, где Ник Ходжес сказал, что
Мы концентрируемся на разработке клиентов [...] если вы хотите создавать SOAP-серверы, то я бы посоветовал вам также обратить внимание на Delphi Prism.
Мы решили перейти на C# для разработки наших SOAP-серверов. Я решил, что служба будет общаться с базой данных, к которой затем будет обращаться наше приложение Delphi.
Позже я столкнулся с проблемами при разработке клиента и под Delphi, поэтому мы делаем это тоже на C#. На этот раз класс C# является com visible и может быть доступен из Delphi. Кажется, все работает нормально.
С уважением, Миэль.