0

对于一个项目,我需要使用 WCF 服务(不是我创建的)。
我已经使用 gSoap 工具包创建了适当的类,一切都运行良好!

直到服务的开发者决定更新它并需要 WS-Addressing!

我已经使用soapUI 工具测试了该服务,为了获得响应,我需要检查WS-A 下的“添加默认wsa:To”选项。

我假设我需要在我的代码中做类似的事情。我阅读了有关使用 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):错误:远程方法名称冲突:结构/类 'SOAP_ENV__Fault' 已在第 274 行声明

最后,当我尝试从我的代码中调用服务方法时(C++,不需要更改之前版本的任何内容,不需要 WS-A)程序冻结,我可以看到使用的内存增加到一个点(~700MB) ,然后放下,程序保持冻结状态!

我正在使用 Windows、VS2010 和 gSoap 2.8.17。
有人可以指出我如何添加 WSA 的正确方向吗?

先感谢您!

4

1 回答 1

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 插件是作为源文件提供的,因此您需要编译和链接 plugin/wsaapi.c 文件。

于 2014-05-31T15:03:10.243 回答