Wiederum als Erinnerungshilfe für gSOAP Client auf Linux (eLux in dem Fall) gegen .NET Web Service (die alte Version, die mit .asmx). Durchgeführt auf einem Windows 10 Rechner mit WSL + Ubuntu 16.04 (!!).

build-essential, bison, flex, openssl, libssl-dev installieren

automake 1.16 deb installieren

gSOAP Sourcen runterladen/entpacken (im Beispiel Version 2.8.93 im Codeverzeichnis)

./configure
make
sudo make install

wsdl2h -c -o service.h https://whereever/whatever/service.asmx

soapcpp2 -c service.h

#include "soapH.h"     // wird von soapccp2 erzeugt
#include "ServiceSoap.nsmap"  // wird von soapccp2 erzeugt

int main(int argc, char** argv)
{
   struct soap *soap = soap_new();
   struct _tempuri__MethodResponse Result;

   soap->ssl_flags = SOAP_SSL_NO_AUTHENTICATION;

   if (soap_call___tempuri__Method(soap, NULL, NULL, NULL, &Result) == SOAP_OK)
   {
      printf("Result: %s\n" , Result.MethodResult);
   }
   else
      soap_print_fault(soap, stderr);
 }

“Method” ist der Name der Methode. In dem Fall gibt das Ding nur einen String zurück und hat keine Parameter (die letzte NULL vorm &Result beim Aufruf).

“tempuri” ist der Namespace des Services (Attribut [Namespace] im ASMX). Muss man ggf. aus dem erzeugten service.h ermitteln.

g++ -o service -DWITH_OPENSSL service.c soapC.c soapClient.c ./gsoap_2.8.93/gsoap-2.8/gsoap/stdsoap2.c ./gsoap_2.8.93/gsoap-2.8/gsoap/libgsoapssl.a -lssl -lcrypto

-DWITH_OPENSSL für Services auf HTTPS (bedingt -lssl und -lcrypto) – müssen hinter den Inputfiles stehen!
soapC.c und soapClient.c werden von soapcpp2 erzeugt
stdsoap2.c und libgsoapssl.a werden beim Build von gSOAP erzeugt – .a weil Library dann statisch gelinked wird (auf eLux nicht vorhanden).