繁体   English   中英

WCF Delphi7方法输入参数

[英]WCF Delphi7 method input parameters

我有 wcf 网络服务(basicHttpBinding)。 我们的 Delphi7 客户无法正确使用它。 我已经用 WCF 附加功能压平了 WSDL。 好的。 Delphi7 wsdl 导入器生成代理正确。

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

来自方法 delphi7 的 Output 值正常。 例如:

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

此方法始终返回“测试”。 我的日志系统修复了我的 at 方法为空,所以问题是正确的传输输入参数。

我无法理解出了什么问题

编辑

代理人:

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>

工作正常;

德尔福7

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

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

Delphi 使用 RPC/编码 SOAP 而 WCF 使用 Document/Literal/Wrapped Z4DE91F0FCB9CD3A0ABD6B。 所以你需要告诉 Delphi 使用相同的格式。 您可以通过在THttpRio.Converter.Options中指定soLiteralParams来做到这一点。

我已经做到了。 我通过 THttpRio 的事件处理程序 OnBeforeExecute 在每个服务sonsume 修复了 soap 信封。

我修复(删除名称空间前缀)并且它有效。 谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM