对于项目,我需要使用WCF服务(不是由我创建的) 我使用gSoap工具包创建了适当的类,一切都很好!
直到该服务的开发人员决定更新它并需要WS-Addressing!
我已经使用soapUI工具测试了该服务,为了获得响应,我需要检查"添加默认wsa:To" WS-A下的选项。
我认为我需要在代码中做类似的事情。我读过有关使用wsa插件的内容,但我找不到足够的说明。到目前为止我所做的是:
我使用了wsdl2h -o outfile.h url_to_service -t typemap.dat
并在我放的typemap.dat中:
SOAP_ENV__Header =\
#import "wsa.h"\n\
struct SOAP_ENV__Header\n\
{\n\
mustUnderstand _wsa__MessageID wsa__MessageID 0;\n\
mustUnderstand _wsa__RelatesTo * wsa__RelatesTo 0;\n\
mustUnderstand _wsa__From * wsa__From 0;\n\
mustUnderstand _wsa__ReplyTo * wsa__ReplyTo 0;\n\
mustUnderstand _wsa__FaultTo * wsa__FaultTo 0;\n\
mustUnderstand _wsa__To wsa__To 0;\n\
mustUnderstand _wsa__Action wsa__Action 0;\n\
};
使用soapcpp2工具时,我收到错误声明:
wsa5.h(288):错误:远程方法名称冲突:struct / class' SOAP_ENV__Fault' 已在第274行宣布
最后,当我尝试从我的代码中调用服务方法时(C ++,没有改变以前版本中的任何内容而不需要WS-A)程序冻结,我可以看到已用内存增加到一定程度( ~700MB),然后下降,程序仍然冻结!
我正在使用Windows,VS2010和gSoap 2.8.17 有人能指出我如何添加WSA的正确方向吗?
提前谢谢!
答案 0 :(得分:0)
我猜你正在混合使用WS-Addressing的几个版本:
在gSOAP typemap.dat中我们可以看到:
wsa = <http://schemas.xmlsoap.org/ws/2004/08/addressing>
wsa3 = <http://schemas.xmlsoap.org/ws/2003/03/addressing>
wsa4 = <http://schemas.xmlsoap.org/ws/2004/03/addressing>
wsa5 = <http://www.w3.org/2005/08/addressing>
如果在wsdl中定义了WS-Addressing头,则其定义将在typemap.dat中没有自定义头定义的情况下完成。我认为您应该删除SOAP_ENV__Header定义并添加由wsa插件管理的wsa名称空间的定义(如果不存在)。
您可以从gSOAP文档doc/wsa/html/index.html和wsa插件示例samples/wsa/wsademo.c中找到有关wsa插件使用情况的信息。
请注意gSOAP插件是作为源文件提供的,因此您需要编译并链接插件/ wsaapi.c文件。