Einzelnen Beitrag anzeigen

RuX

Registriert seit: 21. Jul 2004
Ort: Nürnberg
115 Beiträge
 
Delphi 7 Architect
 
#1

HILFE! SOAP-Client für document literal Webservice!?

  Alt 26. Okt 2007, 13:59
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.
Delphi3/Delphi5/Delphi7/Delphi8 User
  Mit Zitat antworten Zitat