【问题标题】:Connect C++ app to JAVA web app with SOAP使用 SOAP 将 C++ 应用程序连接到 JAVA Web 应用程序
【发布时间】:2010-09-07 21:19:06
【问题描述】:

我有一个需要连接到 JAVA Web 应用程序的 C++ 应用程序,是否有任何好的、开源的 SOAP 包可以用于此,或者我自己做会更容易吗?

【问题讨论】:

    标签: java c++ soap


    【解决方案1】:

    一个快速的 Google 出现了 this 的工具包。虽然我从未使用过它,但它似乎很受欢迎和可靠。不完全是一个包,也不是你自己的包,而是在中间。

    【讨论】:

      【解决方案2】:

      看看 Apache 的 Axis 项目。它在 C++(和 Java)上得到很好的支持,如果您有幸从目标服务的良好 WSDL 开始,您将无家可归。

      【讨论】:

        【解决方案3】:

        我会投票支持 darkhelmet,因为 gSoap 也是我的推荐。我们主要是一家 Java 商店,但有一些 C++ 位,gSoap 一直是我们首选的 SOAP 集成方式。它确实比典型的 Java 堆栈工作量更大,但看起来很可靠。

        【讨论】:

          【解决方案4】:

          我们使用 gSOAP 而不是 Axis,以避免仅仅为了构建 C++ 项目而同时依赖 JRE 和 Axis。它工作正常,这很好,因为 gSOAP 代码很糟糕,而且修复其中的任何错误都非常令人生畏。

          关于 gSOAP 链接的警告:您永远不能在单个链接对象(可执行文件、dll、共享对象)中使用多个 WSDL。这是因为某些生成的特定于 WSDL 的函数具有通用名称(例如 soap_getfault())。

          更糟糕的是,使用 Unix ELF 链接,这些名称会导致共享对象之间的交叉链接,因此 BarService 的 soap_getfault() 可能会处理 FooService 故障,如果故障详细结构不同,则会损坏内存。

          解决方法是确保没有任何与 gSOAP 相关的内容暴露在它们链接到的 SO 之外。这可以通过在链接 gSOAP 库本身和链接代码时为 gcc 提供这些定义来解决:

          #define SOAP_FMAC2  __attribute__ ((visibility ("hidden")))
          #define SOAP_FMAC4  __attribute__ ((visibility ("hidden")))
          #define SOAP_FMAC6  __attribute__ ((visibility ("hidden")))
          #define SOAP_NMAC   __attribute__ ((visibility ("hidden")))
          

          我通过将它们放入头文件并强制 gcc 在 -include fixsoaplink.h 的任何其他内容之前包含它来解决它。

          如果您愿意,更好的方法可能是将默认的 ELF 可见性更改为隐藏,并且只导出您想要的符号(如 VC 中的 dllimport/dllexport)。

          【讨论】:

          • 嗯。实际上,我认为我在 gSOAP 中看到了一些关于将所有生成的代码放在名称空间后面的好东西。事实上,我几乎是肯定的。这意味着通用名称函数(例如soap_getfault())不会发生冲突,即使在单个链接对象中也是如此。
          • 实际上你可以在一个链接对象中放置多个 wsdl,我目前正在这样做!
          【解决方案5】:

          当我看到 gSOAP 生成的代码时,我差点心脏病发作。

          要求用户为每个对象执行所有内存管理的事实让我大吃一惊。所以,我坐下来做了一些从长远来看可能很愚蠢,但在短期内相当令人满意的事情......

          我编写了一个程序,用我自己的 CPP 类包装 gSOAP 代码,使界面看起来更像我想要的样子。

          我在每个服务方法中使用 Scoped Guards 来保持内存,因为我要处理各种不同的类型,所以我使用了std::list<boost::any> 来做这件事。我有创建我需要的每种对象类型的函数,它们将实际内存放入我的list<any>。它有一些问题 - 主要只是配置更改。我现在正在生成数千个类,与数十个 Web 服务通信。

          我不确定我是否会向其他人推荐我的相同路径...我可能应该硬着头皮开始尝试为 gSOAP 做出贡献,而不是维护我自己的依赖于 gSOAP 输出的工具。 ..

          【讨论】:

          • 我做了类似的事情然后意识到它是多么愚蠢和不可维护。在我重构代码之后,我有了一个模板类,它可以用于任何生成的 gSOAP C++ 类。如果你愿意,我可以把代码发给你。
          • 我会很感激的! - MCruikshank@Vitalimages.com 或者你可以将它发布在谷歌代码或类似的东西上。 :-)
          【解决方案6】:

          这是我们刚刚发现的另一个 gSOAP 问题:它使用 select() 进行所有轮询,因此一旦打开 1024 个文件描述符(在 Windows 上为 64 个?),它就会破坏堆栈。这会导致无法发送消息的虚假错误,从而导致应用程序崩溃。

          除非您准备修补 gSOAP 本身,否则解决方法是编写自己的网络代码并将其与 soap->fconnect、->fsend、->frecv 等挂钩。

          【讨论】:

            猜你喜欢
            • 2017-03-17
            • 1970-01-01
            • 1970-01-01
            • 2019-05-23
            • 2014-05-24
            • 1970-01-01
            • 2017-09-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多