gSOAP — заголовок SOAP-Action не установлен

У меня есть пара файлов WSDL, и я использовал gSOAP для создания кода C++.

Для генерации Кода использовались следующие команды:

\path\to\wsdl2h -I \path\to\import\dir -j -N Service1Prefix -n Namespace1Prefix -o \path\to\output\header\dir\header1.h -q CPPNamespace1 -t \path\to\typemap.dat .\path\to\wsdl1.wsdl

И так далее для оставшихся файлов WSDL. В документации gsoap я прочитал, что потребуется пустой файл env.h, который будет обрабатывать сериализацию и обработку ошибок. Поэтому я создал для этого пустой файл.

После этого я сгенерировал код C++ для каждого файла WSDL с помощью инструмента soap2cpp:

\path\to\soap2cpp -1 -C -L -a -A -b -d \path\to\output\dir -i -j -I \path\to\import\dir -n -r -w -x \path\to\header\dir\header1.h

И env.h

\path\to\soap2cpp -1 -C -L -b -d \path\to\output\dir -j -I \path\to\import\dir -penv  -r -w -x \path\to\env.h

Все заработало, и я получил код C++.

Я поместил его в свой код и попробовал метод, но выдал ошибку.

Ошибка: WSWS3147E: Ошибка: нет заголовка SOAPAction!

Я попытался немного повозиться с параметрами wsdl2h и soap2cpp, но не пришел к удовлетворительному результату. Когда я удаляю параметр для префиксов, заголовок SOAPAction был установлен, но у меня возникают проблемы, когда ответ содержит несколько объектов с одинаковым именем, но разным содержимым.

Некоторые поиски не привели к рабочему решению для меня. Сталкивался ли кто-нибудь из вас с этой проблемой раньше и мог бы предложить помощь?


person MBU    schedule 16.07.2017    source источник


Ответы (1)


Возможно, WSDL не определяет заголовок действия SOAP в атрибуте wsdl:binding/wsdl:operation/soap:operation/@soapAction, хотя это маловероятно. Однако, если это так или если soapAction неправильно указан в WSDL, и вы знаете, каким должен быть заголовок SOAP Action, то вы можете просто установить заголовок SOAP Action вручную при вызове службы следующим образом:

// create a service proxy object
SomeProxy proxy;
// invoke the service at an endpoint URL and SOAP Action, pass parameters:
if (proxy.someMethod("endpoint URL", "soap action", ...) == SOAP_OK)
  ... // got the results!

Это устанавливает HTTP-заголовок действия SOAP в строку, указанную в качестве второго параметра. Вы можете использовать NULL для конечной точки и/или строк действия, чтобы позволить вызову вместо этого использовать конечную точку и действие, определенные WSDL.

ПС №1. используйте только параметр soapcpp2 -j (предпочтительно) или -i, но не оба.

ПС №2. почему бы не запустить wsdl2h для всех вместе взятых WSDL? Это экономит значительное количество сгенерированного кода в конце. Прокси-классы службы в любом случае генерируются отдельно для служб в WSDL с помощью soapcpp2, когда службы объединены в один большой файл .h. Таким образом, вы также уверены, что заголовки SOAP и сбои SOAP работают «из коробки». Объяснение: env.h должен определять все заголовки SOAP и подробные структуры SOAP Fault, извлеченные из отдельно сгенерированных файлов .h, что может быть утомительно делать вручную.

person Dr. Alex RE    schedule 17.07.2017
comment
Каждый метод в каждом WSDL содержит атрибут soapAction. - person MBU; 17.07.2017
comment
Использовалась gSOAP версии 2.8.47. Я попробую 2.8.49. Объединение всех WSDL в один большой заголовочный файл вызвало у нас проблемы. Представьте позицию. В одном WSDL позиция содержит почтовый адрес, город и т.д. во втором WSDL позиция содержит широту, долготу и отметку времени движущегося объекта. wsdl2h хранит только первое вхождение этого объекта позиции. - person MBU; 17.07.2017
comment
Вы говорите, что ваши WSDL не имеют уникального пространства имен, что приводит к конфликтам имен? Это очень плохой дизайн. Вот для чего нужны пространства имен. Рад слышать, что есть способ обойти это. - person Dr. Alex RE; 17.07.2017
comment
Ваш WSDL использует WS-адресацию? Для WS-Addressing требуются заголовки Action, которые можно установить с помощью int soap_wsa_request(struct soap *soap, const char *id, const char *to, const char *action);, который является частью подключаемых модулей WS-Addressing wsaapi.h и wsaapi.c. - person Dr. Alex RE; 22.07.2017
comment
Что-то вроде этого: <wsa:Address>http://www.anyURI.com/any/path/</wsa:Address>? Нет, это не так. Но использование вашего предложения работает. - person MBU; 24.07.2017