【问题标题】:Delphi 2007 not consuming JAX-WS web service properlyDelphi 2007 未正确使用 JAX-WS Web 服务
【发布时间】:2009-01-20 17:06:38
【问题描述】:

在尝试使用我使用 JAX-WS 在 Java 中设置的 Web 服务时,我遇到了 Delphi 2007 的问题。可以从另一个 Java 程序和 C#/ASP.NET 2.0 网站很好地使用 Web 服务。但是,当我尝试使用 Delphi 2007(17-DEc-2007 补丁)中的 WSDL Importer 访问相同的服务时,JAX-WS Web 服务无法识别我传递的任何参数并将它们设为空。

我检查了 Delphi 传递的 SOAP 消息,并将其与其他消息进行了比较,它们几乎相同(除了一些可忽略的命名空间 decs 和 .NET 的大量视图状态!)

我也浏览过网络(最有用的链接是 Bob 博士的 http://www.bobswart.nl/Weblog/Blog.aspx?RootId=5:798),但并不高兴。

以前有人遇到过这种情况吗?

TIA。


传奇继续!

在尝试使用 HTTPRIO 对象并尝试使其正常工作后,我最终放弃并尝试通过 HTTP 直接进行 XML 传输。失败。

好的,所以我用 C# 构建了一个简单的测试器并尝试了它。工作没问题。

使用 Fiddler 查看前后发送的内容,似乎唯一的区别在于命名空间。我在 Delphi 中更改了 XML 发送中的命名空间,并且......它有效!

这是由 WSDLImporter 生成的原始 XML 的示例:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <version xmlns="http://path.to.service.com/">
            <input>test</input>
        </version>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

这是真正有效的:

<?xml version="1.0"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:version xmlns:ns2="http://path.to.service.com/">
            <input>test</input>
        </ns2:version>
    </S:Body>
</S:Envelope>

那么,既然我知道了这一点,我是否应该着手更改 WSDLImporter 代码的命名空间值?我在 HTTPRIO 属性上看不到任何明显的东西。

TIA

【问题讨论】:

    标签: delphi soap jax-ws


    【解决方案1】:

    哈哈它活着!!!

    基本上我不得不拿出推荐的

    InvRegistry.RegisterInvokeOptions(TypeInfo(ActivityService), ioDocument);
    

    并强制它使用秒。 5 编码。根据需要生成命名空间,并将参数传递给 Java Web 服务。

    对,需要啤酒,很多啤酒:)

    【讨论】:

    • 我可以验证注释掉该行可以解决 JAX-WS Web 服务的问题。我无法验证大量啤酒的功效;-)
    【解决方案2】:

    你应该在你的 WSDL 中注释这一行:

    //InvRegistry.RegisterInvokeOptions(TypeInfo(WebService), ioDocument);
    

    够了……享受吧。

    【讨论】:

    • 确实够了。谢谢你的提示。如果您解释了该注释行的作用以及应将其删除的原因,那就太好了。
    【解决方案3】:

    不是您的问题的解决方案,但我最近在相同的环境中遇到了麻烦。 我不得不多次更改选项,直到找到使用 Web 服务的正确方法(用 C# 编写)。

    检查:

    - THTTPRIO.Converter.Options
    - THTTPRIO.HTTPWebNode
    - THTTPRIO.HTTPWebNode.InvokeOptions
    

    【讨论】:

    • 再次感谢塞萨尔!我想你需要给我你的快速拨号;)
    【解决方案4】:

    我用头撞墙了两天,直到我找到了这篇文章……Cesars 暗示要检查 THTTPRIO.Converter.Options……我几乎尝试了所有方法,最后一个是将 soXXXXHdr 设置为 true -> 然后发生了一些奇怪的事情,服务器没有更多的空值:O...

    我不知道为什么该设置会使值通过,它就是这样(至少对我而言)。

    如果有人真正了解正在发生的事情能解释这一点,那就太好了。

    【讨论】:

      【解决方案5】:

      从 Converter.Options 中删除 soSendMultiRefObj 有帮助

      【讨论】:

      • 多一点信息总是有帮助的。
      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      相关资源
      最近更新 更多