SOAP&使用gsoap进行WS-Addressing

时间:2014-05-28 13:55:26

标签: c++ wcf soap gsoap ws-addressing

对于项目,我需要使用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的正确方向吗?

提前谢谢!

1 个答案:

答案 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文件。