Использовать WCF от клиента Delphi (массивы и наследование) - PullRequest
0 голосов
/ 04 июля 2011

Я создал прототип службы WCF, в которой есть операция, которая получает массив объектов в виде одного параметра.Проблема в том, что каждый объект наследуется от базового класса (называемого Message), и порядок их не известен заранее.Сначала то, что WCF получает (неправильно), представляет собой массив элементов Message, а не правильный тип, полученный из Message.

После некоторых усилий я смог вызвать эту службу из Delphi 6.02.Я использовал импортер WSDL для создания основного клиента и вручную отредактировал исходный код, чтобы исправить некоторые несовместимости с интерпретацией Delphi SOAP.По сути, я делаю некоторые изменения в событии OnBeforeExecute, например:

SOAPRequest := StringReplace(SOAPRequest, '<item ', '<Message ', [rfReplaceAll]);

Приведенный выше код исправляет способ, которым Delphi передает элементы массива.Я узнал об этом здесь Array_Of_Int в клиенте SOAP .

Затем каждый объект кодируется как Сообщение, но атрибут указывает на его тип времени выполнения:

<Message xsi:type="Authenticate"> <!-- I need to get this, exactly, types can vary -->

проблема в том, что у нас есть другие виды массивов.Затем вхождение «item» может быть заменено на Attachment или Address.Если я отмечу класс как ioDocument, тогда я получу базовый класс как tag-name, но потеряю правильный тип через атрибут.

Есть идеи, как с этим справиться?Может быть, другая библиотека SOAP, которую я мог бы использовать?Или .NET может понять кодировку "item"?

Спасибо.

1 Ответ

0 голосов
/ 05 июля 2011

Мне удалось заставить его работать, но мне пришлось изменить исходники Delphi следующим образом:

{OPToSOAPDomConv.pas, around line 3001}
procedure TSOAPDomConv.SetNodeType(RootNode, InstNode: IXMLNode; const ElemURI,
  TypeName: InvString);
var
  Pre, AttNodePre: InvString;
begin
  if not (soSendUntyped in Options) /*and not (soDocument in Options)*/ then
...

Таким образом, объект гарантированно экспортирует фактический тип:

<Message xsi:type="Authenticate"> <!-- I need to get this, exactly, types can vary -->
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...