您的位置:首页 > 其它

gsoap 在一个客户端中调用多个service的解决方案

2010-12-28 15:49 411 查看
文档上关于这个的解决方案有两种

1.使用wsdl2h将多个wsdl生成为一个wsdl.

2.使用-q指定C++命名空间

方法1.没有成功,而且还要解决一大堆的命名空间问题

方法2.必须生成一个额外的没有命名空间的env,不然stdsoap2.cpp 编译不过.而且使用env会出很多问题,比如soap_header会调用env文件中的.而不会调用命名空间中我们自己生成的service的相关方法

试个很久,最后找到个简单的解决方法,对于要手动更改soap header来说,十分方便好用

先使用wsdl2h为不同的wsdl生成相关的文件

wsdl2h -o aHeader.h -nan -NAS a.wsdl

wsdl2h -o bHeader.h -nbn -NBS a.wsdl

注:-n 和 -N是必须的,这样才能替换掉默认的ns_等命名空间前缀

手动将两个文件的内容合在一个文件中,对照着很容易看出不同,把命名空间,类声明等合在一起就行了

最后使用soapcpp2自动生成代码

soapcpp2 -CLx -pAll all.h -I ../../import

这样就解决了

关于soapheader 可以自己在合好的.H文件里更改。soapcpp2生成代码时会自动完成相关工作,不用像网上说的更改soap_out_SAOP_ENV_Header等方法,但注意命名规则

比如

SOAP_ENV_Header

{

char* an__Username;

}

an__是在soap头中指定Username的命名空间

而an可以手工添加在wsdl2h生成的文件中,打开看一下应该就能很好的明白了

注意

在all.h里添加额外的命名空间时,应添加在尾部,不然会出现命名空间不匹配的错误

在生成的xxxProxy.h中 构造函数里 将其他service的命名空间去掉

SOAP_ENV_Header中节点如果是包含关系,需要定义成结构,而且不要继承xsd_anyType

比如

<as:GetName><UserName>test</UserName><Password>123455</Password></a:getName>

定义为

class GetName /*piblic:xsd_anyType*/

{

std::string* UserName;

std::string* Password;

}

SOAP_ENV_Header

{

GetName* as__GetName;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: