Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C++] Aanspreken webservice via MSXML2

Pagina: 1
Acties:
  • 201 views sinds 30-01-2008
  • Reageer

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Hoi,

eerst even een situatieschets:

het bedrijf waar ik voor werk is een aantal jaar geleden begonnen om het gehele bedrijfsproces via het intranet bij te houden/te regelen/etcetera. In plaats van om voor een taal als PHP of ASP te kiezen is er, om voor mij niet geheel duidelijke redenen (ik werk er nu 2 jaar), voor gekozen een eigen HTML parser te schrijven in Borland C++.

Probleem is nu het volgende. Ik wil de executable van deze parser aanpassen en het mogelijk maken om webservices aan te spreken (in dit geval een webservice van een relatie die ons ordergegevens terugstuurt, maar in de toekomst bijv. een postcode webservice). Daartoe heb ik lekker wat code bijgeklopt in de executable, aangezien de programmeur die de hele executable opgezet heeft, sinds afgelopen augustus een nieuwe baan gevonden heeft en ik het dus zelf moet doen :).
Als ik de executable los uitvoer (dus gewoon de exe start vanaf mijn PC) wordt er prima contact gemaakt met de webservice en krijg ik keurig alle informatie. Als ik echter via de webbrowser een pagina op het intranet opvraag (en dus de executable gestart wordt) wordt er geen contact gemaakt met de webservice en krijg ik de veelzeggende foutmelding: "Exception occured".

Op dit moment is mijn code als volgt:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
         AnsiString XmlDoc = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:end=\"http://endpoint.webserviceadres.nl/\">";
     XmlDoc = XmlDoc + "<soapenv:Header/>";
     XmlDoc = XmlDoc + "<soapenv:Body>";
     XmlDoc = XmlDoc + "<end:get_certificate>";
     XmlDoc = XmlDoc + "<credentials>";
     XmlDoc = XmlDoc + "<password>pwd</password>";
     XmlDoc = XmlDoc + "<username>usr</username>";
     XmlDoc = XmlDoc + "</credentials>";
     XmlDoc = XmlDoc + "<receipt_no>1234</receipt_no>";
     XmlDoc = XmlDoc + "<retailer_id>9999</retailer_id>";
     XmlDoc = XmlDoc + "</end:get_certificate>";
     XmlDoc = XmlDoc + "</soapenv:Body>";
     XmlDoc = XmlDoc + "</soapenv:Envelope>";

         Variant XmlHttp =  Variant::CreateObject("MSXML2.XMLHTTP");

         XmlHttp.OleFunction("Open","POST",WideString("http://WebServiceAdres"),false);
         XmlHttp.OleFunction("setRequestHeader","Content-Type","text/xml; charset=utf-8");
         XmlHttp.OleFunction("send", WideString(XmlDoc));

         Variant responseXML = XmlHttp.OlePropertyGet("responseXML");
         AnsiString XML = responseXML.OlePropertyGet("xml");

Het is de bedoeling dat XmlDoc dynamisch gevuld gaat worden, maar zover ben ik dus nog niet.

Ik heb het programma HTTP Debugger Pro geinstalleerd. Dit programma registreert alle HTTP requests van mijn PC. Als ik de exe handmatig start (en ik dus wel resultaat krijg van de webservice) krijg ik hier ook keurig een paar regeltjes in die het contact met de webservice laten zien. Als ik echter een pagina via mijn localhost opvraag (die de executable dus ook aanroept) dan krijg ik echter alleen de aanvraag van deze pagina zelf te zien, maar niet de interne request naar de webservice. Dus of Debugger Pro is geen goeie sniffer en herkent de HTTP request van de exe niet of de exe voert uberhaupt de request niet uit.

Verder heb ik geprobeerd de HTTPRIO component te gebruiken. Echter ben ik nog niet zo bedreven in C++ en met google krijg ik of onduidelijke voorbeelden, maar vooral veel Delphi voorbeelden. En mijn C++ kunde is niet toereikend genoeg om deze Delphi code om te zetten in C++ code.

Heeft iemand misschien enige tips of denkrichtingen die ik nog zou kunnen uitproberen want ik ben inmiddels wel door mijn ideeen heen heb ik zo'n vermoeden...

En dan nog een vraagje: weet iemand een betere HTTP sniffer dan HTTP Debugger Pro, want mijn complete PC begint te bokken als ik dat programma draai :)

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Weinig tot geen ervaring met c++ dus ik kan alleen algemene tips aanvoeren. Ten eerste leid ik uit regel 17 jouw codevoorbeeld af dat de URL van de webservice die wordt aangesproken in een gehardcode string staat. Is deze hetzelfde als die op het intranet? Als dat zo is, dan komt alleen de initiele request van de pagina op jouw localhost binnen op jouw machine en gaat de webservice request vanaf jouw machine naar de server van de webservice. Ik ken HTTP Debugger Pro niet, maar vangt deze dat soort requests af, of alleen de lokale requests, of beide?

Wat je in elk geval kunt doen is simpele logging functionaliteit implementeren in de exe file. Gewoon bij het binnenkomen van de functie die de soap samenstelt even een lijntje naar de logfile schrijven. Dan weet je in elk geval of de aanroep wel bij de executable komt. Mogelijk heb je hier gewoon te maken met een rechten issue.

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Goed punt... was ik vergeten te melden...
ik heb de logregels in mijn code weggehaald om het niet te onoverzichtelijk te maken. Ik heb na iedere regel een logregel geschreven. Het blijkt dat de executable pas vastloopt op:
C++:
1
XmlHttp.OleFunction("send", WideString(XmlDoc));


want daarna worden geen log-regels meer getoond...


De URL wordt nu inderdaad nog hard aangeroepen. Ik wil dat allemaal dynamisch gaan maken, maar omdat het niet werkte ben ik steeds meer dingen hardcoded gaan invoeren om terug naar het probleem te komen. In principe worden uiteindelijk bijna alle gegevens dynamisch aangemaakt.


HTTP Debugger Pro vangt alleen de lokale requests af... maar ik heb de complete intranetomgeving naar mijn localhost gekopieerd, dus als de executable een HTTP request doet, zou ik deze m.i. ook in de debugger moeten zien... maar helaas...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Misschien een domme vraag, maar waarom attach je niet gewoon de Borland debugger op het moment dat de exception gegooid wordt?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Maar je roept een externe webservice aan met een gehardcode url. Of heb je de URL ook op je locale machine ingesteld (als in http://localhost/... etc)?

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
.oisyn schreef op vrijdag 28 december 2007 @ 11:34:
Misschien een domme vraag, maar waarom attach je niet gewoon de Borland debugger op het moment dat de exception gegooid wordt?
geen domme vraag, maar het antwoord gaat wel dom zijn :) :
ik weet nog te weinig van Borland C++ builder 6 en C++ om dat voor elkaar te krijgen. Ik ken zelfs de Borland debugger niet, dus daar ga ik even naar googlen.
Ik ga wel binnenkort een keer op cursus, maar voorlopig moet ik het mijn eigen kennis en google doen :)

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
bigbeng schreef op vrijdag 28 december 2007 @ 11:34:
Maar je roept een externe webservice aan met een gehardcode url. Of heb je de URL ook op je locale machine ingesteld (als in http://localhost/... etc)?
Ik geloof dat ik je niet begrijp? de URL staat hard in de exe... de exe staat lokaal op mijn PC... de URL is een externe URL...
als ik de exe handmatig start dan maakt hij ook prima contact met de webservice en geeft keurig het gewenste resultaat.... alleen via de browser wil het maar niet lukken...

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Heb je de event viewer van je computer al eens bekeken? Mogelijk treedt er een security issue op omdat de user die probeert het web op te gaan (IUSR_<machinenaam>) dat niet mag. Normaalgesproken draaien executables die vanaf een webpagina gestart worden onder deze user. Als je de exe direct opstart dan draait hij onder jouw username.

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
bigbeng schreef op vrijdag 28 december 2007 @ 11:44:
Heb je de event viewer van je computer al eens bekeken? Mogelijk treedt er een security issue op omdat de user die probeert het web op te gaan (IUSR_<machinenaam>) dat niet mag. Normaalgesproken draaien executables die vanaf een webpagina gestart worden onder deze user. Als je de exe direct opstart dan draait hij onder jouw username.
inderdaad ook naar gekeken (en nu nog een keer)... Er komen geen event-log-regels bij als ik de exe via de browser start... maar ik denk wel dat dit de richting is waarin ik het moet zoeken inderdaad... ik zal eens gaan bedenken of ik dit op e.o.a. manier kan achterhalen....
bedankt in ieder geval...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Edwardvb schreef op vrijdag 28 december 2007 @ 11:37:
[...]


geen domme vraag, maar het antwoord gaat wel dom zijn :) :
ik weet nog te weinig van Borland C++ builder 6 en C++ om dat voor elkaar te krijgen. Ik ken zelfs de Borland debugger niet, dus daar ga ik even naar googlen.
Doe dat, want dat gaat je namelijk gewoon het antwoord geven :). Al het andere is gewoon maar een beetje raden wat er aan de hand is. Ik ken Borland verder niet goed, maar er is vast een menu genaamd "Debug" oid waar iets als "Attach to process" of iets vergelijkbaars in staat. Als je nou die melding krijgt, moet je dat dialoog laten staan (tenminste, ik neem aan dat je het standaard windows exception dialog krijgt?) en dan je debugger attachen. Vervolgens kun je zien welke regel code de exception veroorzaakt heeft.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
.oisyn schreef op vrijdag 28 december 2007 @ 11:56:
[...]


...
Al het andere is gewoon maar een beetje raden wat er aan de hand is.
...
Nou ja zeg ;) Noem het dan in elk geval educated guessing :D

  • Milt
  • Registratie: Februari 2005
  • Laatst online: 06-07-2024
Komt die exception gelijk of pas na een bepaalde tijd ? Bijvoorbeeld pas na een timeout ? Zet eens expliciet de timeout waardes met:

C++:
1
XmlHttp.OleFunction("setTimeouts", 5000, 10000, 15000, 20000);


Aan de hand van het aantal secondes (5, 10, 15 en 20) kun je een beetje nagaan waar het wellicht mis gaat.

Is de server waarop de executable draait dezelfde server als waarop de webserver draait ? Heeft de server waarop de executable staat wel internet toegang ?

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Helaas heb ik nog steeds geen oplossing. Er wordt geen HTTP verkeer gegenereerd als ik de exe als een CGI applicatie draai. Als ik de exe handmatig start is er echter geen enkel probleem.

Kan het misschien zo zijn dat er vanuit een CGI applicatie geen 'extra' http-verbinding gelegd kan worden ofzo? of kan het zijn dat, als je een CGI applicatie draait, je ergens in IIS of whereever de settings moet veranderen dat een http-connectie mogelijk is?
Pagina: 1