WCF Delphi7 方法的输入参数

5

我需要翻译的内容:

我有一个使用basicHttpBinding协议的WCF web服务。我们的Delphi7客户端无法正确地使用它。

我已经通过WCF extras来压缩了WSDL文件。好的,Delphi7 wsdl导入程序可以正确地生成代理。

现在我遇到的问题是输入参数总是有默认值(对于字符串为空,对于整数为0)。

但是Delphi7可以正常获取方法的输出数据。

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

这个方法总是返回"Test"。我的日志记录系统显示我得到了一个空的“a”参数,所以问题在于正确传递输入参数。

我不明白出了什么问题。

编辑

代理:

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属性:

初始化:

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>

编辑2

我正在研究HTTP请求:

.NET

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

工作正确;

Delphi 7

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

空输入参数。 问题出在前缀xsd


不确定原因是什么。您是否收到任何异常?此服务是否与 .net 客户端(测试目的)正常工作? - Aravind
服务与 .NET 客户端良好兼容,输入参数已正确传递。 - Andrew Kalashnikov
1
请发布 WSDL 和生成的代理类。 - Sam
1
我大约两年前尝试在.NET和Delphi 7之间启用Web服务,但发现这非常困难。正如下面Darin所说,问题与SOAP风格有关,最终存在无法解决的差异(我记得数组和自定义类是一场噩梦)。我希望能为您提供更多详细信息,但最终我只是手动定义了消息来通过Post数据进行交互。如果您有其他可能的解决方法,您可能不想在此花费太多时间(我浪费了一周时间)。祝你好运! - Jemes
o6tech,感谢您的回答。我不需要数组、自定义类,只需要基本类型(int、string)。我不想回到asmx(它在Delphi7中运行得非常完美)。我非常希望能够用WCF的方式实现它 :) - Andrew Kalashnikov
2个回答

4

Delphi使用RPC/Encoded SOAP而WCF使用Document/Literal/Wrapped SOAP。因此,您需要告诉Delphi使用相同的格式。您可以通过在THttpRio.Converter.Options中指定soLiteralParams来实现此目的。


@Darin:你能否也发布一下在THTTPRIO.converter.Options中指定solietralPrams的代码语句? - pradeeptp

0

我做到了。 我通过THttpRio的事件处理程序OnBeforeExecute,在每个服务调用时修复了SOAP信封。

我修复了(删除命名空间前缀),现在它可以工作了。 谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接