1

我在生成 gSOAP 安全标头 (WSSE) 时遇到问题。我已经编译了所有必要的文件并使用以下调用将 WSSE 安全标头添加到请求中:

soap_wsse_add_Security(proxy.soap);
soap_wsse_add_UsernameTokenText(proxy.soap, "UsernameToken-1", "user","passwd");

我的安全标头看起来像这样:

<SOAP-ENV:Header>
  <wsse:Security SOAP-ENV:mustUnderstand="true">
    <wsse:UsernameToken wsu:Id="UsernameToken-1">
      <wsse:Username>testuser</wsse:Username>
      <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">
    testPassword</wsse:Password>
    </wsse:UsernameToken>
  </wsse:Security>
</SOAP-ENV:Header>

与我提供的服务器规范相比,该行

<wsse:Security SOAP-ENV:mustUnderstand="true">

缺少xmlns:wsse="http...." 和该行

<wsse:UsernameToken wsu:Id="UsernameToken-1">

缺少xmlns:wsu="http...."部分。所以我希望看起来像这样:

 <wsse:Security  xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"  SOAP-ENV:mustUnderstand="true">
  <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"  wsu:Id="UsernameToken-1">

如何将 xmlns:wsse 和 xmlns:wsu 部分添加到特定行以符合规范?我从服务中得到的错误是:

com.ctc.wstx.exc.WstxParsingException: Undeclared namespace
    prefix "wsse"

我查看了 gSOAP 文档,但我能找到的只是如何添加标头,没有关于如何将名称空间定义添加到标头中的项目。

协助将不胜感激。

4

2 回答 2

3

实际上,您不应该编辑 .nsmap 文件,而应该编辑 typemap.dat,这会影响 .nsmap 的自动生成。

使用 WS\WS-typemap.dat 作为基础(它已经定义了 WS-SE 命名空间)并将其作为参数提供给 wsdl2h 命令:

wsdl2h -t WS-typemap.dat ...
于 2013-07-02T07:42:30.500 回答
1

只需回答问题即可关闭它。

您需要做的是编辑 *.nsmap 文件。在那里,您可以在结构中添加命名空间定义,例如:

SOAP_NMAC struct Namespace ZamtelWSZambia_namespaces[] =
{
    {"wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-ecext-1.0.xsd", NULL, NULL},
    {NULL, NULL, NULL, NULL}
};

然后在客户端中简单地包含这样的 NSMAP:

#include "soapstubs/XXXX.nsmap"
于 2011-11-03T13:35:26.727 回答