Вопрос

У меня есть проблема с созданием заголовка GSOAP Security (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

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

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

Другие советы

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

Используйте ws ws-typemap.dat в качестве базы (он уже определяет пространства имен WS-SE) и предоставьте его как аргумент для команды WSDL2H:

wsdl2h -t WS-typemap.dat ...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top