Delphi7 WCF方法输入参数
我有 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
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 theTHttpRio.Converter.Options
.我已经做到了。
我通过 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