Hallo, vielleicht könnt ihr mir ja noch helfen? Bin langsam ratlos...
Ich probier gerade einen
SOAP-Client für einen Webservice hinzukriegen der mit document/literal Encoding arbeitet.
Der Webservice hat nur eine einzige Funktion der man ein WideString (
XML) übergeben kann und die mir auch wieder einen WideString (
XML) zurückliefert.
Die Webservice Client
Unit hab ich durch den WSDLImport generiert (
WSDL und generierte
Unit siehe unten).
Ich arbeite mit Delphi 7 und weiß dass man für document/literal Support einen
Patch installieren muss was ich auch getan habe.
Folgende
Exception beim aufrufen der Funktion:
Delphi-Quellcode:
End tag '
body' does
not match the start tag '
HR'.
Linie: 1
<
html><head><title>Apache Tomcat/5.5.15
Was soviel bedeutet ich krieg den HTML(!)-Text der WebService-URL zurück als wenn man sie im Browser aufrufen würde plus (ich vermute mal) irgendein Parser-Fehler.
Von rpc/encoded bin ich gewöhnt NICHTS an der generierten
Unit anfassen zu müssen und es funktioniert. Es erscheint mir alledings schon komisch dass nirgends in der
Unit auf document/literal eingegangen wird. Deswegen habe ich selber mal probiert durch verschiedenste Kombinationen von
Delphi-Quellcode:
initialization
InvRegistry.RegisterInvokeOptions(TypeInfo(SoapPort), ioLiteral);
und/oder
InvRegistry.RegisterInvokeOptions(TypeInfo(SoapPort), ioDocument);
oder
Delphi-Quellcode:
RIO.Converter.Options := RIO.Converter.Options + [SoDocument];
und/oder
RIO.Converter.Options := RIO.Converter.Options + [soLiteralParams];
irgendwas zu bewegen.
Hat leider alles nicht geklappt.
Was mach ich falsch?
die
wsdl schaut folgendermaßen aus:
Kann bitte jemand mit D2007 das für mich importieren und schauen ob das gleiche rauskommt?
Delphi-Quellcode:
<?
xml version="1.0" encoding="UTF-8"?>
<
wsdl:definitions xmlns:
wsdl="http:
//schemas.xmlsoap.org/wsdl/" xmlns:tns="http://blabla.org/SendMessageImpl/SendMessageImpl/xyz/query2__async2" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://blabla.org/SendMessageImpl/SendMessageImpl/xyz/query2__async2">
<
wsdl:types/>
<
wsdl:service name="ContractSqlSoap">
<
wsdl:port name="SOAPEventSource" binding="tns:SOAPEventSourceBinding">
<
soap:address location="https:
//url:12345/abc/ContractService"/>
</
wsdl:port>
</
wsdl:service>
<
wsdl:portType name="SoapPort">
<
wsdl:operation name="SendMessage">
<
wsdl:input message="tns:SendMessage"/>
<
wsdl:output message="tns:SendMessageResponse"/>
</
wsdl:operation>
</
wsdl:portType>
<
wsdl:binding name="SOAPEventSourceBinding" type="tns:SoapPort">
<
soap:binding style="document" transport="http:
//schemas.xmlsoap.org/soap/http"/>
<
wsdl:operation name="SendMessage">
<
soap:operation style="document" soapAction="/abc/ContractService" soapActionRequired="true"/>
<
wsdl:input>
<
soap:body use="literal" parts="XMLInput"/>
</
wsdl:input>
<
wsdl:output>
<
soap:body use="literal" parts="Result"/>
</
wsdl:output>
</
wsdl:operation>
</
wsdl:binding>
<
wsdl:
message name="SendMessage">
<
wsdl:part name="XMLInput" type="xs:string"/>
</
wsdl:
message>
<
wsdl:
message name="SendMessageResponse">
<
wsdl:part name="Result" type="xs:string"/>
</
wsdl:
message>
</
wsdl:definitions>
die generierte
unit:
Delphi-Quellcode:
// ************************************************************************ //
// Die in dieser Datei deklarierten Typen wurden aus Daten generiert, die aus
// unten beschriebener WSDL-Datei stammen:
// WSDL : W:\abc\meine.wsdl
// Codierung : UTF-8
// Version : 1.0
// (26.10.2007 14:49:12 - 1.33.2.5)
// ************************************************************************ //
unit meine;
interface
uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
type
// ************************************************************************ //
// Die folgenden Typen, auf die im WSDL-Dokument Bezug genommen wird, sind in dieser Datei
// nicht repräsentiert. Sie sind entweder Aliase(@) anderer repräsentierter Typen oder auf sie wurde Bezug genommen,
// aber in diesem Dokument nicht deklariert (!). Die Typen aus letzterer Kategorie
// sind normalerweise mit vordefinierten/bekannten XML- oder Borland-Typen verbunden; sie könnten aber auch ein Anzeichen
// für ein falsches WSDL-Dokument sein, das einen Schema-Typ nicht deklariert oder importiert..
// ************************************************************************ //
// !:string - "http://www.w3.org/2001/XMLSchema"
// ************************************************************************ //
// Namespace : [url]http://blabla.org/SendMessageImpl/SendMessageImpl/xyz/query2__async2[/url]
// Bindung : SOAPEventSourceBinding
// Service : ContractSqlSoap
// Port : SOAPEventSource
// ************************************************************************ //
SoapPort =
interface(IInvokable)
['
{D5E57539-5BA3-BF46-0EEF-979D83C3A6CE}']
function SendMessage(
const XMLInput: WideString): WideString;
stdcall;
end;
function GetSoapPort(UseWSDL: Boolean=System.False; Addr: string='
'; HTTPRIO: THTTPRIO =
nil): SoapPort;
implementation
function GetSoapPort(UseWSDL: Boolean; Addr:
string; HTTPRIO: THTTPRIO): SoapPort;
const
defWSDL = '
W:\abc\meine.wsdl';
defURL = '
';
defSvc = '
ContractSqlSoap';
defPrt = '
SOAPEventSource';
var
RIO: THTTPRIO;
begin
Result :=
nil;
if (Addr = '
')
then
begin
if UseWSDL
then
Addr := defWSDL
else
Addr := defURL;
end;
if HTTPRIO =
nil then
RIO := THTTPRIO.Create(
nil)
else
RIO := HTTPRIO;
try
Result := (RIO
as SoapPort);
if UseWSDL
then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end else
RIO.URL := Addr;
finally
if (Result =
nil)
and (HTTPRIO =
nil)
then
RIO.Free;
end;
end;
initialization
InvRegistry.RegisterInterface(TypeInfo(SoapPort), '
http://blabla.org/SendMessageImpl/SendMessageImpl/xyz/query2__async2', '
UTF-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(SoapPort), '
');
end.