C++ gSOAP WSSE标头缺少xmlns命名空间声明

C++ gSOAP WSSE标头缺少xmlns命名空间声明,c++,web-services,wsdl,gsoap,wsse,C++,Web Services,Wsdl,Gsoap,Wsse,我在生成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:mustU

我在生成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  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">
#include "soapstubs/XXXX.nsmap"
我已经看过gSOAP文档,但我所能找到的只是如何添加头,而没有任何关于如何向头中的项添加命名空间定义的内容


我们将不胜感激

只要回答问题就可以结束它

您需要做的是编辑*.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:

<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  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">
#include "soapstubs/XXXX.nsmap"

只是回答问题来结束它

您需要做的是编辑*.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:

<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  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">
#include "soapstubs/XXXX.nsmap"

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

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

wsdl2h -t WS-typemap.dat ...

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

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

wsdl2h -t WS-typemap.dat ...

谢谢你的更新!我已经有一段时间没有使用gSoap了,但你是100%正确的!谢谢你的更新!我已经有一段时间没有使用gSoap了,但你是100%正确的!您能告诉我如何向代理对象添加安全标头吗?我假设您上面的代理变量是DeviceBindingProxy类型,但我在DeviceBindingProxy类中看不到任何这样的字段。您能告诉我如何向代理对象添加安全标头吗?我假设上面的代理变量是DeviceBindingProxy类型,但我在DeviceBindingProxy类中看不到任何这样的字段。