У меня есть веб-сервис 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