gpt4 book ai didi

web-services - Delphi 2007 生成不正确的 SOAP 消息

转载 作者:行者123 更新时间:2023-12-03 15:00:23 27 4
gpt4 key购买 nike

我正在 Delphi 2007 中编写一个使用 Web 服务的应用程序。我使用 WSDL 导入器生成与服务通信所需的代码,但在尝试使用该服务时遇到“意外的子元素(元素名称)”错误。

使用 Fiddler 2,我发现问题在于 xmlns 被添加到 SOAP 消息中发送的值数组中:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="..." xmlns:xsd="..." xmlns:xsi="...">
<SOAP-ENV:Body>
<Request xmlns="http://service.com/theService/">
<UserName xmlns="">user</UserName>
<Password xmlns="">pass</Password>
<List xmlns="">
<Item xmlns="http://service.com/theService/">123456</Item>
<Item xmlns="http://service.com/theService/">84547</Item>
</List>
</Request>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

如果我重新发送 Delphi 在 Fiddler 中创建的消息,将 Item 元素的 xmlns 更改为空字符串,我将不再收到错误,并且服务会正确响应。即:

<List xmlns="">
<Item xmlns="">123456</Item>
<Item xmlns="">84547</Item>
</List>

现在,我可以通过更改服务类的部分初始化来摆脱列表项的 xmlns 属性:

InvRegistry.RegisterInvokeOptions(TypeInfo(ServicePort), ioDocument);
InvRegistry.RegisterInvokeOptions(TypeInfo(ServicePort), ioLiteral);
RemClassRegistry.RegisterSerializeOptions(RequestType, [xoLiteralParam]);

至:

InvRegistry.RegisterInvokeOptions(TypeInfo(ServicePort), ioDocument);
RemClassRegistry.RegisterSerializeOptions(RequestType, [xoHolderClass, xoLiteralParam]);

但是,这将导致请求元素名称更改为默认 SOAP 操作的名称(例如 GetInformation),这将再次导致错误。我已经为此苦苦挣扎太久了,任何想法将不胜感激。

此外,我还创建了一个使用该服务的测试 C# 应用程序,并且与该服务通信时没有任何问题。

最佳答案

我和其他在 Delphi 中遇到类似序列化问题的人交谈过,似乎没有明确的方法来解决这个问题。

相反,我采用的解决方案是将一个事件处理程序附加到发送 SOAP 消息的 THTTPRIO 对象的 OnBeforeExecute 事件,这使您能够以字符串形式访问序列化的 SOAP 消息。从那里我刚刚解析出了导致问题的属性,现在一切正常了。

这是一个有点丑陋的解决方案,但它确实有效。

关于web-services - Delphi 2007 生成不正确的 SOAP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2096284/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com