问题 C ++和SOAP


我有一个C ++应用程序,需要连接到一个JAVA Web应用程序,有没有任何好的,开源的SOAP包,或者是否更容易自己滚动?


8878
2017-09-05 01:50


起源



答案:


从那以后我会投票给黑暗的人 gSOAP的 也是我的建议。我们主要是一个Java商店,但有一些C ++位,gSoap一直是我们首选的SOAP集成方式。它确实比典型的Java堆栈更多,但看起来很稳固。


11
2017-09-05 07:00





一个快速的谷歌出现了 这个 一个工具包。虽然我从未使用它,但它似乎非常受欢迎且非常坚固。不完全是一个包,并没有真正滚动自己,而是在中间。


1
2017-09-05 01:55





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


1
2017-09-17 15:55



呵呵。我实际上认为我在gSOAP中看到了一些关于将所有生成的代码放在命名空间后面的好东西。实际上,我几乎是积极的。这意味着即使在单个链接对象中,通用名称函数(如soap_getfault()也不会发生冲突)。 - Matt Cruikshank
实际上你可以在一个链接对象中放置多个wsdl,我现在正在做! - fido


答案:


从那以后我会投票给黑暗的人 gSOAP的 也是我的建议。我们主要是一个Java商店,但有一些C ++位,gSoap一直是我们首选的SOAP集成方式。它确实比典型的Java堆栈更多,但看起来很稳固。


11
2017-09-05 07:00





一个快速的谷歌出现了 这个 一个工具包。虽然我从未使用它,但它似乎非常受欢迎且非常坚固。不完全是一个包,并没有真正滚动自己,而是在中间。


1
2017-09-05 01:55





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


1
2017-09-17 15:55



呵呵。我实际上认为我在gSOAP中看到了一些关于将所有生成的代码放在命名空间后面的好东西。实际上,我几乎是积极的。这意味着即使在单个链接对象中,通用名称函数(如soap_getfault()也不会发生冲突)。 - Matt Cruikshank
实际上你可以在一个链接对象中放置多个wsdl,我现在正在做! - fido


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


0
2017-09-05 02:58





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

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

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

我在每个服务方法中使用Scoped Guards来保留内存,因为我正在处理各种不同的类型,我使用了 std::list<boost::any> 去做吧。我有一些函数可以生成我需要的每个对象类型,并且它们将实际的内存放入我的 list<any>。它有一些问题 - 主要是配置更改。我现在正在生成数千个课程,与几十个Web服务交谈。

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


0
2017-09-18 12:55



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


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

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


0
2017-09-29 14:11