gSOAP - SOAP-Action Header 未设置

gSOAP - SOAP-Action Header not set

我有几个 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++ 代码。

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

Error: WSWS3147E: Error: no SOAPAction header!

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

一些搜索没有为我提供可行的解决方案。 你们中有人以前可能遇到过这个问题并可以提供一些帮助吗?

可能是 WSDL 没有在 wsdl:binding/wsdl:operation/soap:operation/@soapAction 属性中定义 SOAP 操作 header,尽管事实并非如此非常可能。但是,如果是这种情况,或者 WSDL 中没有正确指定 soapAction,并且您知道 SOAP Action header 应该是什么,那么您可以在调用时简单地手动设置 SOAP Action header服务如下:

// 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 操作 HTTP header 设置为作为第二个参数提供的字符串。您可以将 NULL 用于端点 and/or 操作字符串,让调用改为使用 WSDL-defined 端点和操作。

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

PS#2。为什么不 运行 wsdl2h 结合所有 WSDL?这最终节省了大量生成的代码。当服务组合在一个大的 .h 文件中时,无论如何使用 soapcpp2 为 WSDL 中的服务单独生成服务代理 类。通过这种方式,您还可以确保 SOAP Headers 和 SOAP Faults 开箱即用。说明:env.h 应定义从单独生成的 .h 文件中提取的所有 SOAP Headers 和 SOAP 故障详细信息结构,手动完成这些结构可能很乏味。