3 Stimmen

Wie funktionieren Delphi-Webdienste? (Methoden hinzufügen zur Laufzeit ??)

Ich habe einen Webdienst in Delphi XE mit dem WSDL-Importer erstellt. Delphi hat für mich das Modul ITransmitter1.pas mit dem ITransmitter-Interface und der GetITransmitter-Funktion generiert.

Um den Webservice zu nutzen, verwende ich:

var Transmitter: ITransmitter;
begin
  Transmitter := GetITransmitter(True, '', nil);
  Transmitter.Transmit(Memo1.Text, OutXML);
end;

Aber ich kann nirgendwo den Body der Methode Transmit sehen ...

In ITransmitter.pas sehe ich:

  InvRegistry.RegisterInterface(TypeInfo(ITransmitter), 'urn:TransmitterIntf-ITransmitter', 'utf-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(ITransmitter), 'urn:TransmitterIntf-ITransmitter#Transmit');

Wenn ich diese Zeilen kommentiere, erhalte ich einen "Schnittstelle nicht unterstützt" Fehler. Wie ich hier sehe, fügt Delphi die Methode zur Laufzeit hinzu! Wie funktioniert das? Kann ich zur Laufzeit Methoden zu meiner eigenen Klasse hinzufügen?

2voto

mjn Punkte 35903

Wenn Sie einen Web-Service-Client mit dem WSDL-Importer erstellt haben, ruft der generierte Clientcode eine Methode auf dem Server auf. Tatsächlich befindet sich die Methode 'body' (Code) auf dem Web-Service-Server.

Delphi generiert eine Soap-Anfrage basierend auf dem WSDL, und im Hintergrund wird RTTI (Introspektion) verwendet, um Parameter usw. des Web-Service-Aufrufs als XML zu generieren. Dieses XML wird an den Server gesendet, der die Methodenimplementierung ausführt und eine Soap-Antwort zurücksendet.

Die Dinge sind umgekehrt, wenn Sie den Web-Service-Server erstellen. In diesem Fall muss die Delphi-Anwendung natürlich alle Methodenimplementierungen implementieren.

1voto

jachguate Punkte 16748

Sie rufen tatsächlich eine in einem Interface definierte Methode auf, die wiederum von IInvokable geerbt wird, wie in System.pas deklariert.

Wenn Sie Ihren Quellcode überprüfen, werden Sie feststellen, dass kein lokales Objekt in Ihrem Projekt das von Ihnen aufgerufene IInvokable-Interface implementiert, weil diese Methode auf dem Server remote ausgeführt wird.

Vor diesem Vorgang wird etwas Pascal-Code verwendet, um eine ordnungsgemäße SOAP-Anforderung an den Server zu erstellen, diese zu senden und dann auf die Serverantwort zu warten und sie zu interpretieren. Berücksichtigen Sie diese Implementierungsdetails. Wenn Sie mehr darüber erfahren möchten, wie dies funktioniert, aktivieren Sie die Compileroption "use debug .dcus", um im VCL/RTL zu debuggen.

Dann verwenden Sie wie gewohnt den Befehl StepInto (F7), um den Debugger aufzufordern, die Methode Transmit schrittweise auszuführen... Nach einigem Assemblercode in der TRIO.GenericStub-Methode gelangen Sie zur TRIO.Generic-Methode, wo das Paket vorbereitet und gesendet wird.

Für eine btSOAP-Bindung, die ich zur Erstellung dieser Antwort verwende, beginnt der relevante Teil in Zeile 943 in der Einheit Rio.pas:

    try
      FWebNode.Execute(Req, Resp);
    finally
      { Clear Outbound headers }
      FHeadersOutBound.Clear;
    end;          

THTTPReqResp.Execute verwendet dann Wininet.dll-Funktionen, um die Verbindung herzustellen, Informationen mit dem Server auszutauschen und zu empfangen.

Sie können mit diesem Thema auf verschiedenen Ebenen tiefer gehen... wie weit Sie gehen möchten, hängt von Ihren Interessen ab, und die Vielzahl von Details geht weit über den Umfang meiner Antwort hier hinaus... zögern Sie nicht, weitere Fragen zu stellen zu bestimmten Themen, die Sie interessieren.

Ich bin mir nicht sicher, aber Details können zwischen Delphi-Versionen variieren... Ich verwende derzeit Delphi XE.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X