具有相同操作的多个wsdl的gSoap
gSoap with multiple WSDLs with same operations
我的客户机需要能够与新旧服务器协议(相同的端点)通信,因此,我需要加载具有相同操作的2个WSDL,但具有不同的名称空间(XML方面)
例如:<operation name="getServerTime">
<input message="uc:GetServerTimeRequest"/>
<output message="uc:GetServerTimeResponse"/>
</operation>
wsdl2h似乎可以很好地处理这个问题。我运行命令:
wsdl2h -p -o gSoap.h service2013.wsdl service2015.wsdl
和gSoap.h中,我看到它成功地解析了这两个操作;
int __ns2__getServerTime(
_common_2012_msgs__GetServerTimeRequest* common_2012_msgs__GetServerTimeRequest, ///< Input parameter
_common_2012_msgs__GetServerTimeResponse* common_2012_msgs__GetServerTimeResponse ///< Output parameter
);
int __ns7__getServerTime(
_common_2015_msgs__GetServerTimeRequest* common_2015_msgs__GetServerTimeRequest, ///< Input parameter
_common_2015_msgs__GetServerTimeResponse* common_2015_msgs__GetServerTimeResponse ///< Output parameter
);
但问题是,当我使用soapcpp2生成代理时:
soapcpp2 -jLCx -I$(gsoap_pkg)/share/import/ gSoap.h
我生成的代理(soapCommonServiceSoapBindingProxy.h)的结果只有1个操作:
/// Web service operation 'getServerTime' (returns error code or SOAP_OK)
virtual int getServerTime(_common_2015_msgs__GetServerTimeRequest *common_2015_msgs__GetServerTimeRequest, _common_2015_msgs__GetServerTimeResponse *common_2015_msgs__GetServerTimeResponse) { return this->getServerTime(NULL, NULL, common_2015_msgs__GetServerTimeRequest, common_2015_msgs__GetServerTimeResponse); }
virtual int getServerTime(const char *endpoint, const char *soap_action, _common_2015_msgs__GetServerTimeRequest *common_2015_msgs__GetServerTimeRequest, _common_2015_msgs__GetServerTimeResponse *common_2015_msgs__GetServerTimeResponse);
我还应该提到,在此之前,我尝试生成2个独立的代理,但由于不同结构(SOAP_ENV__FAULT等)的模糊定义而遇到了无尽的链接问题。我试图通过手动命名stdsoap2.cpp和stdsoap2.h来解决,但不同的错误不断涌入。
如何成功生成一个同时支持两个版本的代理?
A)您可以在soapccp2中使用-qname,以便两个服务生成不同的soap文件和名称空间。
例如soapcpp2 -j -n -C -w -qs2013 -I$(INC) service2013.wsdl
soapcpp2 -j -n -C -w -qs2015 -I$(INC) service2015.wsdl
您可以参考gSoap文档了解更多细节gSoap代码命名空间
B)要解决与命名空间相关的链接器问题,请将以下代码添加到文件中(例如namespaces.cpp),添加到项目中并编译。
#include <stdsoap2.h>
extern "C" {
SOAP_NMAC struct Namespace namespaces[] = { { NULL, NULL} };
}
C)为了解决与序列化和反序列化功能相关的链接问题,创建一个空的env.h文件并用以下命令编译它:
soapcpp2 -n -CS -penv env.h
添加envC。
相关文章:
- 使用GSoap实现ONVIF
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- gSoap在从.wsdl创建.h期间出现错误
- 如何从客户端在 gsoap C++ 的标头中传递非 xml 数据?
- 在使用 gSoap 链接多个 SOAP 服务时启用保持活动状态
- 正在填充gsoap 2.8.59中的结构
- 使用c++的gSOAP中的stdsoap2.cpp中存在编译错误
- 使用 CMake (make) 和 GCC 构建和编译 gSOAP 项目
- 为没有 WSDL 的 Gsoap 创建一个标头
- 编译 gsoap 输出文件 (onvif) 时出现问题
- gSOAP - 未设置 SOAP 操作标头
- 有没有办法用c ++ Gsoap客户端调用python soap spyne服务器?
- ONVIF:配置文件 S 需要哪些 wsdl 文件
- GSOAP SOAPCPP2 #IMPORT:无法打开文件“ SOAP12.H”进行阅读
- gsoap-wsdl2h在wcf-wsdl文件上失败
- 使用gSOAP独立服务器发布wsdl
- C++ gSOAP wsdl types
- 具有相同操作的多个wsdl的gSoap
- gSOAP C++:创建一个没有WSDL定义的自定义SOAP:Header
- gSOAP RESTful实现是否需要定义WSDL ?