Для проекта мне нужно использовать сервис WCF (не создан мной).
Я создал соответствующие классы, используя набор инструментов gSoap, и все работало отлично!
Так продолжалось до тех пор, пока разработчик сервиса не решил обновить его и потребовать WS-Addressing!
Я протестировал сервис с помощью инструмента soapUI, и для получения ответа мне нужно проверить опцию «добавить wsa: Кому по умолчанию» в WS-A.
Я предполагаю, что мне нужно сделать что-то подобное в моем коде. Я читал об использовании плагина wsa, но не смог найти достаточных инструкций. Что я сделал до сих пор:
я использовал wsdl2h -o outfile.h url_to_service -t typemap.dat
и в typemap.dat я положил:
SOAP_ENV__Header =\
#import "wsa.h"\n\
struct SOAP_ENV__Header\n\
{\n\
mustUnderstand _wsa__MessageID wsa__MessageID 0;\n\
mustUnderstand _wsa__RelatesTo * wsa__RelatesTo 0;\n\
mustUnderstand _wsa__From * wsa__From 0;\n\
mustUnderstand _wsa__ReplyTo * wsa__ReplyTo 0;\n\
mustUnderstand _wsa__FaultTo * wsa__FaultTo 0;\n\
mustUnderstand _wsa__To wsa__To 0;\n\
mustUnderstand _wsa__Action wsa__Action 0;\n\
};
при использовании инструмента soapcpp2 я получаю сообщение об ошибке:
wsa5.h (288): ОШИБКА: удаленное столкновение с именем метода: struct / class ‘SOAP_ENV__Fault’
уже объявлено в строке 274
Наконец, когда я пытаюсь вызвать сервисные методы из моего кода (C ++, ничего не меняя по сравнению с предыдущей версией, где WS-A не требовался), программа зависает, и я вижу увеличение используемой памяти до точки (~ 700 МБ) , затем сбросьте и программа останется замороженной!
Я использую Windows, VS2010 и gSoap 2.8.17.
Может кто-нибудь указать мне правильное направление о том, как добавить WSA?
Заранее спасибо!
Я предполагаю, что вы смешиваете несколько выпусков WS-Addressing:
В gSOAP typemap.dat мы могли видеть:
wsa = <http://schemas.xmlsoap.org/ws/2004/08/addressing>
wsa3 = <http://schemas.xmlsoap.org/ws/2003/03/addressing>
wsa4 = <http://schemas.xmlsoap.org/ws/2004/03/addressing>
wsa5 = <http://www.w3.org/2005/08/addressing>
Если заголовок WS-Addressing определен в вашем wsdl, его определение будет выполнено без определения пользовательского заголовка в typemap.dat. Я думаю, что вы должны удалить определение SOAP_ENV__Header и добавить определение пространств имен wsa, управляемых плагинами wsa (если они отсутствуют).
Информацию об использовании плагина wsa вы найдете в документации по gSOAP. док / WSA / html / index.html и из образца плагина wsa Образцы / WSA / wsademo.c.
Убедитесь, что плагины gSOAP предоставляются в виде исходного файла, поэтому вам нужно будет скомпилировать и связать файл plugin / wsaapi.c.