![]() |
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:
Dieser wurde von der Netbeans IDE 6.5 erstellt und soweit ging dort auch alles.
<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> Ich habe dann dieses Schema in Delphi 2007 über den Assistenten importiert und habe versucht es auszuführen mit:
Delphi-Quellcode:
der erste Aufruf Klappt (Ich bekomme anscheinend auch ein gültiges Objekt zurück)
var
test : MyWebService; begin test := GetMyWebService(True); showmessage(test.calci('100', '100')); end; 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? |
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. |
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" |
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:
ändern.
test := GetMyWebService(false,'',HttpRio)
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:
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ß. :?
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; Gruß Frank |
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:
gelöscht habe... lief alles so wie ich wollte
InvRegistry.RegisterInvokeOptions(TypeInfo(NewWSDLFile), ioDocument);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz