2011-10-18 66 views
1

我在生成gSOAP安全性头(WSSE)时遇到问题。我编写所有必要的文件,并使用下面的调用到WSSE安全头添加到请求:gSOAP WSSE头缺少xmlns名称空间声明

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的文档,但所有我能找到的是如何增加一个头,就如何命名空间定义添加到标题中的项目什么都没有。

援助将不胜感激。

+0

你能告诉我你是怎么添加安全性头代理对象?我假设你的上面的代理变量是DeviceBindingProxy类型,但我在DeviceBindingProxy类中看不到任何这样的字段。 – mualloc

回答

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" 
3

其实,你不应该编辑.nsmap文件,但而是影响自动生成.nsmap的typemap.dat。

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

wsdl2h -t WS-typemap.dat ... 
+1

感谢您的更新!过了一段时间,因为我不得不使用gSoap,但你100%正确! –