Toon posts:

C++ Soap client

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben momenteel bezig met het bouwen van een logging functionaliteit in een bestaande c++ applicatie. De gegevens moeten worden gelogd naar een andere server middels een webservice. Nu heb ik de ballen verstand van C++ en ben al tot de volgende code gekomen:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdio.h>
#include <iostream.h>
#include <atlbase.h>

#import "msxml3.dll"
using namespace MSXML2;

#import "C:\Program Files\Common Files\MSSoap\Binaries\MSSOAP1.dll" \
exclude("IStream", "ISequentialStream", "_LARGE_INTEGER", \
"_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")

using namespace MSSOAPLib;

void main()
{

   BSTR method = L"Greet";
   BSTR command = L"uri:Greet";
   BSTR m = L"m";

    try {
    
   CoInitialize(NULL);

  ISoapSerializerPtr Serializer;
  ISoapReaderPtr Reader;
  ISoapConnectorPtr Connector;

  // Connect to the service
  Connector.CreateInstance(__uuidof(HttpConnector));
  // Begin message
  Connector->Property["EndPointURL"] =
  "http://<blaat>/TestLogWebService/LogService.asmx";
  Connector->Connect();

  Connector->Property["SoapAction"] = "uri:Greet";
  Connector->BeginMessage();

  // Create the SoapSerializer
  Serializer.CreateInstance(__uuidof(SoapSerializer));

  // Connect the serializer to the input stream of the connector
  Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));

  // Build the SOAP Message
  Serializer->startEnvelope("", "", "");
  Serializer->startBody("");
  Serializer->startElement("Greet","uri:Greet","",m);
  //Serializer->startElement("username","","","");
  Serializer->writeString("Richard");
 // Serializer->endElement();
  Serializer->endElement();
  Serializer->endBody();
  Serializer->endEnvelope();

  // Send the message to the web service
  Connector->EndMessage();

  // Read the response
  Reader.CreateInstance(__uuidof(SoapReader));

  // Connect the reader to the output stream of the connector
  Reader->Load(_variant_t((IUnknown*)Connector->OutputStream),
                  "");
  // Display the result
  printf("Answer: %s\n", (const char *)Reader->RPCResult->text);
   // CoUninitialize();

    }
    catch (char * fout) {
        printf(fout);
    }

}


Deze code werkt deels. Dat wil zeggen: de webservice wordt gevonden. Wanneer de url wordt veranderd, geeft de applicatie een foutmelding, dus de url is goed.

De webmethod wordt echter niet uitgevoerd. Deze zou een regeltje moeten wegschrijven naar een tekstbestand, maar dit gebeurt niet.

De webmethod heet greet, en heeft 1 parameter: Een string

Wat kan hier fout zijn?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:42
Heb je de code al eens zelf gedebugged ?
Nu lijkt dit gewoon op een 'ziehier m'n code, debug het ff voor mij', maar in p&w laten we zo'n topics niet toe.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Wat valt er aan te debuggen? Ik stel een SOAP envelop op, die stuur ik naar mijn webservice.

Ik krijg geen foutmeldingen.

Uiteindelijk wordt er door het print command het volgende in m'n console geprint:

'Answer: soap:Client'

De webmethod zou 'Greet <naam>' moeten returnen, maar op deze manier werkt het iig niet.
Ik heb geprobeerd via de IXMLDOMElement klasse de inhoud van de soap response te bereiken, maar krijg vooralsnog een hoop casting foutmeldingen die ik niet echt opgelost krijg.

Verwijderd

Topicstarter
Update :)

Ik kan de method inmiddels wel aanroepen. De namespace was niet helemaal goed opgegeven.
Het enige probleem lijkt nu nog, om de parameter goed mee te geven.

Sample SOAP Request:

XML:
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <Greet xmlns="http://tempuri.org/TestLogWebService/LogService">
      <name>string</name>
    </Greet>
  </soap:Body>
</soap:Envelope>


En mijn stuk source code
C++:
1
2
3
4
5
6
7
8
9
10
   // Build the SOAP Message
   Serializer->startEnvelope("","","");
   Serializer->startBody("");
   Serializer->startElement("Greet","http://tempuri.org/TestLogWebService/LogService/Greet","","m");
   Serializer->startElement("name", "http://tempuri.org/TestLogWebService/LogService/Greet", "", "");
   Serializer->writeString("Richard");
   Serializer->endElement();
   Serializer->endElement();
   Serializer->endBody();
   Serializer->endEnvelope();


Ik denk dat de fout zit in de namespace, of naam setting van de parameter (de tweede aanroep van 'startElement'). Ik heb al geprobeerd de namespace weg te laten, maar ook dit mocht niet baten.
Iemand een idee?