В заголовке gSOAP WSSE отсутствуют объявления пространства имен xmlns - PullRequest
1 голос
/ 18 октября 2011

У меня проблема с генерацией заголовка безопасности 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, но все, что я смог найти, это как добавить заголовок, а не как добавить определения пространства имен к элементам в заголовке.

Помощь будет оценена.

Ответы [ 2 ]

3 голосов
/ 02 июля 2013

На самом деле, вам не следует редактировать файл .nsmap, а, скорее, typemap.dat, который влияет на автоматическую генерацию .nsmap.

Использование WS \ WS-typemap.dat в качестве основыопределяет пространства имен WS-SE) и предоставляет его в качестве аргумента для команды wsdl2h:

wsdl2h -t WS-typemap.dat ...
1 голос
/ 03 ноября 2011

Просто отвечая на вопрос, чтобы закрыть его.

Что вам нужно сделать, это отредактировать файл * .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"
...