gSOAP - 未设置 SOAP 操作标头
gSOAP - SOAP-Action Header not set
我有几个WSDL文件,并使用gSOAP来创建C++代码。
为了生成代码,使用了以下命令:
pathtowsdl2h -I pathtoimportdir -j -N Service1Prefix -n Namespace1Prefix -o pathtooutputheaderdirheader1.h -q CPPNamespace1 -t pathtotypemap.dat .pathtowsdl1.wsdl
其余的 WSDL 文件以此类推。 在 gsoap 文档中,我读到需要一个空的 env.h 文件来处理序列化和错误处理。所以我为此创建了一个空文件。
在此之后,我使用 soap2cpp 工具为每个 WSDL 文件生成了C++代码:
pathtosoap2cpp -1 -C -L -a -A -b -d pathtooutputdir -i -j -I pathtoimportdir -n -r -w -x pathtoheaderdirheader1.h
和环境
pathtosoap2cpp -1 -C -L -b -d pathtooutputdir -j -I pathtoimportdir -penv -r -w -x pathtoenv.h
一切正常,我得到了C++代码。
我把它放到我的代码中并尝试了一个方法,但提示错误。
错误: WSWS3147E: 错误: 没有 SOAPAction 标头!
我尝试了一些摆弄wsdl2h和soap2cpp的参数,但没有得到令人满意的结果。 当我删除前缀的参数时,设置了 SOAPAction 标头,但是当响应包含一些名称相同但内容不同的对象时,我会遇到问题。
一些搜索并没有为我带来可行的解决方案。 你们中的某个人以前可能遇到过这个问题并且可以提供一些帮助吗?
WSDL 可能没有在 wsdl:binding/wsdl:operation/soap:operation/@soapAction 属性中定义 SOAP Action 标头,尽管这不太可能。但是,如果是这种情况,或者 soapAction 未在 WSDL 中正确指定,并且您知道 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 操作 HTTP 标头设置为作为第二个参数提供的字符串。 您可以对端点和/或操作字符串使用 NULL,让调用改用 WSDL 定义的端点和操作。
PS #1. 仅使用 soapCPP2 选项-j
(首选(或-i
,但不要同时使用两者。
PS #2. 为什么不在所有 WSDL 组合上运行 wsdl2h?这最终节省了大量生成的代码。当服务组合在一个大的 .h 文件中时,无论如何,使用 soapcpp2 为 WSDL 中的服务单独生成服务代理类。这样,您还可以确保 SOAP 标头和 SOAP 错误是开箱即用的。说明:env.h 应定义从单独生成的 .h 文件中提取的所有 SOAP 标头和 SOAP 错误详细信息结构,手动操作可能很繁琐。
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 对字符串进行位操作
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- 位移操作和位掩码未检测到重复字符
- 如何进行特定的位操作?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 字符串操作 - 字符计数
- 此代码中的操作流程是什么?C/C++.
- 复制和交换习惯用法与移动操作之间的交互
- gSOAP - 未设置 SOAP 操作标头
- 无法使用WSO2(Axis2c)执行简单的SOAP操作