11

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

4

6 回答 6

11

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

于 2008-09-05T07:00:30.260 回答
1

一个快速的谷歌发现了这个工具包。虽然我从未使用过它,但它似乎非常流行和可靠。不完全是一个包,也不是你自己的,而是在中间。

于 2008-09-05T01:55:03.910 回答
1

我们使用 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)。

于 2008-09-17T15:55:07.893 回答
0

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

于 2008-09-05T02:58:21.153 回答
0

当我看到 gSOAP 生成的代码时,我几乎要心脏病发作了。

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

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

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

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

于 2008-09-18T12:55:05.600 回答
0

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

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

于 2008-09-29T14:11:06.057 回答