Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi SOAP-Abfrage führt zu Abstürz des Programms (https://www.delphipraxis.net/131075-soap-abfrage-fuehrt-zu-abstuerz-des-programms.html)

Zwixx 18. Mär 2009 11:55


SOAP-Abfrage führt zu Abstürz des Programms
 
Dies ist mein erster Versuch mit SOAP unter Delphi. Ich habe einen JBoss-ApplicationServer, darauf einen WebService deployed und wollte diesen von Delphi aus zugreifen (von PHP aus funktioniert dies).

Ich gabe folgende WSDL:
XML-Code:
<definitions name='MyWebServiceService' targetNamespace='http://MyWebService/' xmlns='http://schemas.xmlsoap.org/wsdl/' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:tns='http://MyWebService/' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
 <types>
  <xs:schema targetNamespace='http://MyWebService/' version='1.0' xmlns:tns='http://MyWebService/' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
   <xs:element name='calci' type='tns:calci'/>
   <xs:element name='calciResponse' type='tns:calciResponse'/>
   <xs:element name='callc' type='tns:callc'/>
   <xs:element name='callcResponse' type='tns:callcResponse'/>
   <xs:complexType name='calci'>
    <xs:sequence>
     <xs:element minOccurs='0' name='p1' type='xs:string'/>
     <xs:element minOccurs='0' name='p2' type='xs:string'/>
    </xs:sequence>
   </xs:complexType>
   <xs:complexType name='calciResponse'>
    <xs:sequence>
     <xs:element minOccurs='0' name='return' type='xs:string'/>
    </xs:sequence>
   </xs:complexType>
   <xs:complexType name='callc'>
    <xs:sequence/>
   </xs:complexType>
   <xs:complexType name='callcResponse'>
    <xs:sequence>
     <xs:element minOccurs='0' name='return' type='xs:string'/>
    </xs:sequence>
   </xs:complexType>
  </xs:schema>
 </types>
 <message name='MyWebService_callc'>
  <part element='tns:callc' name='callc'></part>
 </message>
 <message name='MyWebService_calciResponse'>
  <part element='tns:calciResponse' name='calciResponse'></part>
 </message>
 <message name='MyWebService_callcResponse'>
  <part element='tns:callcResponse' name='callcResponse'></part>
 </message>
 <message name='MyWebService_calci'>
  <part element='tns:calci' name='calci'></part>
 </message>
 <portType name='MyWebService'>
  <operation name='calci' parameterOrder='calci'>
   <input message='tns:MyWebService_calci'></input>
   <output message='tns:MyWebService_calciResponse'></output>
  </operation>
  <operation name='callc' parameterOrder='callc'>
   <input message='tns:MyWebService_callc'></input>
   <output message='tns:MyWebService_callcResponse'></output>
  </operation>
 </portType>
 <binding name='MyWebServiceBinding' type='tns:MyWebService'>
  <soap:binding style='document' transport='http://schemas.xmlsoap.org/soap/http'/>
  <operation name='calci'>
   <soap:operation soapAction=''/>
   <input>
    <soap:body use='literal'/>
   </input>
   <output>
    <soap:body use='literal'/>
   </output>
  </operation>
  <operation name='callc'>
   <soap:operation soapAction=''/>
   <input>
    <soap:body use='literal'/>
   </input>
   <output>
    <soap:body use='literal'/>
   </output>
  </operation>
 </binding>
 <service name='MyWebServiceService'>
  <port binding='tns:MyWebServiceBinding' name='MyWebServicePort'>
   <soap:address location='http://testserver:8080/WebApplication/MyWebService'/>
  </port>
 </service>
</definitions>
Dieser wurde von der Netbeans IDE 6.5 erstellt und soweit ging dort auch alles.

Ich habe dann dieses Schema in Delphi 2007 über den Assistenten importiert und habe versucht es auszuführen mit:
Delphi-Quellcode:
var
  test : MyWebService;
begin
  test := GetMyWebService(True);
  showmessage(test.calci('100', '100'));
end;
der erste Aufruf Klappt (Ich bekomme anscheinend auch ein gültiges Objekt zurück)
dann...

In Projekt abc.exe trat ein Problem mit folgender Meldung auf: 'access violation at 0x7c9452f5: write of address 0x016a0fec'. Prozess angehalten.

Woran kann das liegen?

Phoenix 18. Mär 2009 14:26

Re: SOAP-Abfrage führt zu Abstürz des Programms
 
Du erzeugst das Objekt mit dem Parameter true (das müsste der Parameter "UseWsdl" sein). Geb hier mal false rein.
Ich weiss nicht warum, aber die Indys (die im Hintergrund die ganze Seifenschmierei machen) kommen damit nicht wirklich klar.

Zwixx 19. Mär 2009 08:59

Re: SOAP-Abfrage führt zu Abstürz des Programms
 
danke für die Antwort,

hatte ich auch probiert... leider keine Änderung... ich habe jetzt das ganze wsdl weggeworfen und habe in Eclipse selber eines zusammengeklickt... auf einmal funktioniert es auch in Delphi. Er scheint mit der Struktur des wsdl nicht klar zu kommen wie mir das aussieht... k.a.

jetzt habe ich das nächste Problem... die parameter kommen weder in der php-version noch in der Delphi-Version bei dem java-Programm an... ich mache in dem java-Programm lediglich ein

return p1 + p2;

als Ergebnis bekomme ich in Delphi und in PHP "nullnull". Dies wird dann aber nicht an Delphi liegen, sondern da wird wohl applikationsserverseitig irgendwas schief gehen, da die Daten an den Appliaktionsserver übergeben werden.

EDIT: Nach einigen Aufrufen des Programms wieder der gleiche Absturz... aber nur innerhalb der IDE, ausserhalb ist alles wie gehabt bei dem Ergebnis "nullnull"

Keldorn 19. Mär 2009 18:41

Re: SOAP-Abfrage führt zu Abstürz des Programms
 
Hallo

vielleicht hilft es dir, mal zu vergleichen, was als soap-envelope übertragen wird.

Ich würde mal SoapUI oder soapscope probieren, damit kannst Du den Webserice testen, ohne ein Stückchen code zu schreiben. einfach wsdl aufrufen und du kannst die Methoden einfach ausprobieren. Mit beiden Programmen kannst du Den Request und die Response als xml anzeigen lassen und mal mit deinem Delphi-programm vergleichen:

Du kannst eine httprio-Komponente mit auf die Form zeihen und deinen Aufruf in
Delphi-Quellcode:
test := GetMyWebService(false,'',HttpRio)
ändern.
in der httprio-Kompo hast du dann 2 Ereignisse onbeforeexecute und onafterexecute

Delphi-Quellcode:
procedure TForm_xyz.HTTPRIODebugAfterExecute(const MethodName: string; SOAPResponse: TStream);
Var sl:Tstrings;
begin
  sl:=TStringList.Create;
  try
    sl.LoadFromStream(SOAPResponse);

    sl.SaveToFile('blub:\'+'SoapResponse.xml');
  finally
    sl.free;
  end;
end;
Delphi-Quellcode:
procedure TForm_xyz.HTTPRIODebugBeforeExecute(const MethodName: string; var SOAPRequest: WideString);
Var sl:Tstrings;
begin
  sl:=TStringList.Create;
  try
    sl.Text:=SOAPRequest;
    sl.SaveToFile('blub:\'+'Soaprequest.xml');
  finally
    sl.free;
  end;
end;
ich habe teilweise das Problem, das irgendwelche Schemas nicht richtig gesetzt werden. Ich muß immer den request anpassen, weil ich keine andere Lösung weiß. :?

Gruß Frank

Zwixx 25. Mär 2009 08:04

Re: SOAP-Abfrage führt zu Abstürz des Programms
 
ic habe die Lösung gefunden. Anscheinend hat der Importer von Delphi ein kleines Problem und hat da was durcheinander gebracht... als ich die Zeile

Delphi-Quellcode:
InvRegistry.RegisterInvokeOptions(TypeInfo(NewWSDLFile), ioDocument);
gelöscht habe... lief alles so wie ich wollte


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz