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

标签 web-services delphi soap delphi-2007

我正在 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/

相关文章:

java - 将 XML 文件传递​​到 Web 服务

c# - 使用 SSL 的 .net Web 服务。 wcf?

javascript - 使用 Javascript 向客户端发送命令

multithreading - Delphi Win API CreateTimerQueueTimer 线程和线程安全 FormatDateTime 崩溃

java - 如何测试 SOAP 服务?

c# - Fiddler 未检测到来自 C# 控制台应用程序的 soap 请求

java - 从 WSDL 生成的自顶向下 Java 服务中的 CXF 3.0.3 部署错误

java - Netbeans - 设计 View 不可用

delphi - 在运行时创建并运行 TTimer

delphi - 启用 TStringGrid 编辑