Входные параметры метода WCF Delphi7 - PullRequest
5 голосов
/ 30 мая 2011

У меня есть веб-сервис wcf (basicHttpBinding). Наши клиенты Delphi7 не могли правильно их потреблять. Я уже сгладил WSDL с дополнениями WCF. Хорошо. Delphi7 wsdl импортер правильно генерирует прокси.

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

Вывод значений из методов delphi7 становится нормальным. например:

        public string Test(string a)
        {
              return "Test"+a;
        }

Этот метод всегда возвращает «Test». В моей системе журналирования исправлено, что у меня пустой метод at, поэтому проблема заключается в правильной передаче входных параметров.

Я не могу понять, что не так

EDIT

прокси:

ISyncer = interface(IInvokable)
  ['{D46862B0-BDD3-8B80-35A8-A2AC69F24713}']
    function  Test(const a: String): String; stdcall;
  end;

называют:

Sync:=(dmMain.HTTPRIO1 as ISyncer);
test:=Sync.Test('5555');

dmMain.HTTPRIO1 имеет soLiteralParams в опциях:

INIT:

InvRegistry.RegisterInvokeOptions(TypeInfo(ISyncer), ioLiteral);

После звонка я получаю исключение с сообщением:

Error deserializtion message body for operation Test. 
Operation formatter detects ivalid message body. Expecting node type "Element"
with name "Test" and namespace "http://tempuri.org". Actually node type "Element"
with name "xsd:String" and namespace "http://w3.org/2001/XMLSchema"

фрагмент wsdl:

<xsd:element name="Test">
−
<xsd:complexType>
−
<xsd:sequence>
<xsd:element minOccurs="0" name="a" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
−
<xsd:element name="TestResponse">
−
<xsd:complexType>
−
<xsd:sequence>
<xsd:element minOccurs="0" name="TestResult" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

EDIT2

Я исследую http запросы:

.NET

<Test> xmlns="http://tempuri.org/"><a>5555</a></Test>

работает правильно;

Delph7

<Test xmlns="http://tempuri.org/"><xsd:a>5555</xsd:a></Test>

нулевой входной параметр. Проблема в префиксе xsd

Ответы [ 2 ]

4 голосов
/ 30 мая 2011

Delphi использует RPC / Encoded SOAP, тогда как WCF использует Document / Literal / Wrapped SOAP.Таким образом, вы должны указать Delphi использовать тот же формат.Вы можете сделать это, указав soLiteralParams в THttpRio.Converter.Options.

0 голосов
/ 08 июня 2011

Я сделал это. Я исправил мыльный конверт в каждом сервисе через обработчик событий OnBeforeExecute из THttpRio.

Исправляю (удаляю префиксы пространства имен) и все работает. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...