【发布时间】:2010-09-07 21:19:06
【问题描述】:
我有一个需要连接到 JAVA Web 应用程序的 C++ 应用程序,是否有任何好的、开源的 SOAP 包可以用于此,或者我自己做会更容易吗?
【问题讨论】:
我有一个需要连接到 JAVA Web 应用程序的 C++ 应用程序,是否有任何好的、开源的 SOAP 包可以用于此,或者我自己做会更容易吗?
【问题讨论】:
一个快速的 Google 出现了 this 的工具包。虽然我从未使用过它,但它似乎很受欢迎和可靠。不完全是一个包,也不是你自己的包,而是在中间。
【讨论】:
看看 Apache 的 Axis 项目。它在 C++(和 Java)上得到很好的支持,如果您有幸从目标服务的良好 WSDL 开始,您将无家可归。
【讨论】:
我会投票支持 darkhelmet,因为 gSoap 也是我的推荐。我们主要是一家 Java 商店,但有一些 C++ 位,gSoap 一直是我们首选的 SOAP 集成方式。它确实比典型的 Java 堆栈工作量更大,但看起来很可靠。
【讨论】:
我们使用 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 生成的代码时,我差点心脏病发作。
要求用户为每个对象执行所有内存管理的事实让我大吃一惊。所以,我坐下来做了一些从长远来看可能很愚蠢,但在短期内相当令人满意的事情......
我编写了一个程序,用我自己的 CPP 类包装 gSOAP 代码,使界面看起来更像我想要的样子。
我在每个服务方法中使用 Scoped Guards 来保持内存,因为我要处理各种不同的类型,所以我使用了std::list<boost::any> 来做这件事。我有创建我需要的每种对象类型的函数,它们将实际内存放入我的list<any>。它有一些问题 - 主要只是配置更改。我现在正在生成数千个类,与数十个 Web 服务通信。
我不确定我是否会向其他人推荐我的相同路径...我可能应该硬着头皮开始尝试为 gSOAP 做出贡献,而不是维护我自己的依赖于 gSOAP 输出的工具。 ..
【讨论】:
这是我们刚刚发现的另一个 gSOAP 问题:它使用 select() 进行所有轮询,因此一旦打开 1024 个文件描述符(在 Windows 上为 64 个?),它就会破坏堆栈。这会导致无法发送消息的虚假错误,从而导致应用程序崩溃。
除非您准备修补 gSOAP 本身,否则解决方法是编写自己的网络代码并将其与 soap->fconnect、->fsend、->frecv 等挂钩。
【讨论】: