Delphi7 WCF方法输入参数

发布于 2024-11-10 13:47:24 字数 2077 浏览 1 评论 0原文

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

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

delphi7 方法的输出值正常。 例如:

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

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

我无法理解出了什么问题

EDIT

proxy:

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

call:

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

dmMain.HTTPRIO1 has soLiteralParams at options:

init:

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

After call 我收到异常消息:

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"

wsdlfragment:

<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

I've got wcf web-service(basicHttpBinding). Our Delphi7 clients couldn't correct consume it.
I've already flatten the WSDL with WCF extras. Ok. Delphi7 wsdl importer generate proxy correct.

Now I've got the problems with input parameters. they always have default values (empty for strings, 0 for int).

Output values from methods delphi7 gets ok.
for example:

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

This method always return "Test". My logging system fix that I've got empty a at method, so the problem is correct transfer input parameters.

I can't undersand what's wrong

EDIT

proxy:

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

call:

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

dmMain.HTTPRIO1 has soLiteralParams at options:

init:

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

After call I get exception with message:

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 fragment:

<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

I research http requests:

.NET

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

works correct;

Delph7

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

null input parameter.
The problem is in prefix xsd

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

‘画卷フ 2024-11-17 13:47:24

Delphi 使用 RPC/Encoded SOAP,而 WCF 使用 Document/Literal/Wrapped SOAP。所以你需要告诉Delphi使用相同的格式。您可以通过在 THttpRio.Converter.Options 中指定 soLiteralParams 来完成此操作。

Delphi uses RPC/Encoded SOAP whereas WCF uses Document/Literal/Wrapped SOAP. So you need to tell Delphi to use the same format. You could do this by specifying soLiteralParams in the THttpRio.Converter.Options.

最冷一天 2024-11-17 13:47:24

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

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

I've done it.
I fixed soap envelope at every service sonsume through event handler OnBeforeExecute of THttpRio.

I fix(remove namespace prefixes) and it works.
Thanks

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文