C ++和SOAP

时间:2020-03-05 18:47:59  来源:igfitidea点击:

我有一个需要连接到JAVA Web应用程序的C ++应用程序,对此是否有任何良好的开源SOAP软件包,或者只是自己动手会更容易?

解决方案

回答

一个快速的Google提出了这个作为工具包。尽管我从未使用过它,但它似乎非常流行且扎实。不完全是一个程序包,也不是真正地滚动我们自己的程序包,而是介于中间。

回答

看一下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这些定义_both来解决此问题:

#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代码,使接口看起来更像我想要的样子。

我在每种服务方法中都使用了作用域保护器来保存内存,并且由于我要处理各种各样的不同类型,因此我使用了" std :: list <boost :: any>"来实现。我有使我需要的每种对象类型都可用的函数,它们将实际的内存放入我的list &lt;any>中。它有一些问题,主要是配置更改。我现在正在生成数千个类,涉及许多Web服务。

我不确定我是否会向其他人推荐我的相同方法……我可能应该忍耐一下,开始尝试为gSOAP做出贡献,而不是维护依赖于gSOAP输出的我自己的工具...

回答

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

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