gSOAP - 未设置SOAP-Action标头

时间:2017-07-16 18:41:44

标签: c++ soap http-headers gsoap

我有几个WSDL文件,并使用gSOAP创建C ++代码。

要生成代码,请使用以下命令:

\path\to\wsdl2h -I \path\to\import\dir -j -N Service1Prefix -n Namespace1Prefix -o \path\to\output\header\dir\header1.h -q CPPNamespace1 -t \path\to\typemap.dat .\path\to\wsdl1.wsdl

等等剩余的WSDL文件。 在gsoap文档中,我读到需要一个空的env.h文件来处理序列化和错误处理。所以我为此创建了一个空文件。

在此之后,我使用soap2cpp工具为每个WSDL文件生成了C ++代码:

\path\to\soap2cpp -1 -C -L -a -A -b -d \path\to\output\dir -i -j -I \path\to\import\dir -n -r -w -x \path\to\header\dir\header1.h

和env.h

\path\to\soap2cpp -1 -C -L -b -d \path\to\output\dir -j -I \path\to\import\dir -penv  -r -w -x \path\to\env.h

一切正常,我得到了C ++代码。

我把它放入我的代码并尝试了一种方法,但提示错误。

  

错误:WSWS3147E:错误:没有SOAPAction标头!

我尝试了一些摆弄wsdl2h和soap2cpp的参数,但没有达到令人满意的结果。 当我删除前缀的参数时,SOAPAction Header已设置但当响应包含一些具有相同名称但内容不同的对象时,我会遇到问题。

有些搜索没有为我提供有效的解决方案。 您之前是否有人可能会遇到此问题并可以提供一些帮助?

1 个答案:

答案 0 :(得分:0)

可能是WSDL没有在wsdl:binding / wsdl:operation / soap:operation / @ soapAction属性中定义SOAP Action头,但这种情况不太可能。但是,如果是这种情况或者在WSDL中未正确指定soapAction,并且您知道SOAP Action标头应该是什么,那么您可以在调用服务时手动设置SOAP Action标头,如下所示:

// create a service proxy object
SomeProxy proxy;
// invoke the service at an endpoint URL and SOAP Action, pass parameters:
if (proxy.someMethod("endpoint URL", "soap action", ...) == SOAP_OK)
  ... // got the results!

这会将SOAP Action HTTP标头设置为作为第二个参数提供的字符串。您可以对端点和/或操作字符串使用NULL,以使调用使用WSDL定义的端点和操作。

PS#1。仅使用soapcpp2选项-j(首选)或-i,但不要同时使用这两个选项。

PS#2。为什么不在所有WSDL上运行wsdl2h?这最终节省了大量生成的代码。当服务组合在一个大的.h文件中时,无论如何,使用soapcpp2为WSDL中的服务单独生成服务代理类。这样您就可以确保SOAP Headers和SOAP Faults开箱即用。说明:env.h应该定义从单独生成的.h文件中提取的所有SOAP Headers和SOAP Fault详细结构,这可能是手工繁琐的。