Announcement

Collapse
No announcement yet.

Keine Daten übertragen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Keine Daten übertragen

    Hallo,

    ich programmiere im Moment in C++ mit gSOAP. Ich versuche eine Verbindung mit affili.net aufzubauen (WSDL-Datei: https://developer-api.affili.net/V2.0/Logon.svc?wsdl).
    Ich habe entsprechend der gSOAP-Anleitung die Stubs erstellt. Dabei wurde unter anderem die Datei soapDefaultEndpointLogonProxy.cpp erstellt. Anschließend habe ich folgende main-Methode geschrieben:
    Code:
    int main() {
    	DefaultEndpointLogonProxy proxy;
    	std::string str;
    	ns3__Logon logon;
    	std::string name = "XYZ";
    	std::string pass = "XXXX";
    	logon.Username = &name;
    	logon.Password = &pass;
    	ns3__TokenDeveloperDetails det;
    	int id = 1;
    	det.SandboxPublisherID = &id;
    	ns3__TokenApplicationDetails appdet;
    	appdet.ApplicationID = &id;
    	appdet.DeveloperID = &name;
    	logon.DeveloperSettings = &det;
    	logon.ApplicationSettings = &appdet;
    	logon.WebServiceType = ns3__WebServiceTypes__Publisher;
    	if(proxy.Logon(&logon , str)==SOAP_OK)
    		std::cout << "es geht" << std::endl;
    	else
    		std::cout << "es geht nicht" << std::endl;
    	return 0;
    }
    Wireshark zeigt, dass zwar eine Verbindung zum Server aufgebaut wird, es werden allerdings keine Daten übertragen. Die Verbindung wird sofort wieder abgebaut.
    Ich habe mir die Sache mal im Debugger angeschaut und festgestellt, dass er die Methode DefaultEndpointLogonProxy::Logon betritt und dort dann bei folgendem Codeabschnitt die return-Anweisung ausführt:
    Code:
    	if (soap_connect(soap, soap_endpoint, soap_action)
    	 || soap_envelope_begin_out(soap)
    	 || soap_putheader(soap)
    	 || soap_body_begin_out(soap)
    	 || soap_put___ns1__Logon(soap, &soap_tmp___ns1__Logon, "-ns1:Logon", "")
    	 || soap_body_end_out(soap)
    	 || soap_envelope_end_out(soap)
    	 || soap_end_send(soap))
    		return soap_closesock(soap);
    Danach käme noch folgender Abschnitt, diesen führt er aber nicht aus:
    Code:
    	soap_default_std__string(soap, &ns1__CredentialToken);
    	if (soap_begin_recv(soap)
    	 || soap_envelope_begin_in(soap)
    	 || soap_recv_header(soap)
    	 || soap_body_begin_in(soap))
    		return soap_closesock(soap);
    	soap_tmp___ns1__LogonResponse = soap_get___ns1__LogonResponse(soap, NULL, "-ns1:LogonResponse", "");
    	if (soap->error)
    	{	if (soap->error == SOAP_TAG_MISMATCH && soap->level == 2)
    			return soap_recv_fault(soap);
    		return soap_closesock(soap);
    	}
    	if (soap_body_end_in(soap)
    	 || soap_envelope_end_in(soap)
    	 || soap_end_recv(soap))
    		return soap_closesock(soap);
    	ns1__CredentialToken = soap_tmp___ns1__LogonResponse->ns1__CredentialToken;
    	return soap_closesock(soap);
    Weiß jemand, woran das liegen kann?
    Vielen Dank für eure Hilfe!

  • #2
    Wohl weil das if einen true ergibt....
    Christian

    Comment


    • #3
      Dummerweise ist der Code bis auf die main-Methode automatisch von gSOAP generiert.
      Sprich ich habe keine Ahnung, was diese Zeilen eigentlich tun sollen.
      Bei mir bemerke ich nur, dass die main-Methode in den "es geht nicht"-Zweig springt und Wireshark den Verbindungsaufbau und sofortigen Verbindungsabbau loggt.

      Eigentlich würde ich erwarten, dass gSOAP einen Fehler wirft oder ähnliches. Aber nichts dergleichen geschieht. proxy.soap_fault_string() ist ein Nullzeiger, genauso wie proxy.soap_fault_detail().

      Kennt sich jemand mit gSOAP aus und weiß, unter welchen Umständen diese return-Anweisung aufgerufen wird bzw. was ich falsch gemacht habe?
      Es kann auch nicht am SOAP-Server liegen, da ja nicht einmal Daten zum Server geschickt werden.
      Irgendwie komme ich nicht weiter...

      Comment


      • #4
        hmmm könntest doch aber mit debuggen feststellen, welcher Ausdruck da ein true liefert und dann prüfen woher der kommt.

        Oder das mit einer anderen Sprache testweise machen?
        Christian

        Comment


        • #5
          Ich habe den Code jetzt folgendermaßen geändert:
          Code:
          if (soap_connect(soap, soap_endpoint, soap_action))
          		return soap_closesock(soap);
          	 if(soap_envelope_begin_out(soap))
          		 return soap_closesock(soap);
          	 if(soap_putheader(soap))
          		 return soap_closesock(soap);
          	 if(soap_body_begin_out(soap))
          		 return soap_closesock(soap);
          	 if(soap_put___ns1__Logon(soap, &soap_tmp___ns1__Logon, "-ns1:Logon", ""))
          		 return soap_closesock(soap);
          	 if(soap_body_end_out(soap))
          		 return soap_closesock(soap);
          	 if(soap_envelope_end_out(soap))
          		 return soap_closesock(soap);
          	 if(soap_end_send(soap))
          		 return soap_closesock(soap);
          Dabei nimmt er jetzt den return nach soap_connect(). Irgendwas geht also schon beim Verbindungsaufbau schief.
          Der soap_endpoint ist allerdings korrekt auf "https://developer-api.affili.net/V2.0/Logon.svc" gesetzt. soap_action ist "http://affilinet.framework.webservices/Svc/ServiceContract1/Logon".

          Die soap_connect-Methode kann ich mit dem Debugger leider nicht betreten, da dies ein Bibliotheksaufruf von gSOAP ist.

          edit:
          soap_connect gibt übrigens den Wert 26 zurück, das ist übrigens auch der Rückgabewert von soap_closesock, der dann an meine main-Methode weitergegeben wird. Dieser Wert entspricht der Fehlerkonstante SOAP_VERSIONMISMATCH.
          Ist damit die Serverversion gemeint? Aber wie kann der Client das erkennen, ohne Daten an ihn zu senden? Es findet ja effektiv keine Kommunikation statt.
          Zuletzt editiert von ugchm; 08.03.2011, 19:57.

          Comment

          Working...
          X