Neue Web-Services hinzufügen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Server mit Web-Service-Unterstützung schreiben


Sie können Ihrer Server-Anwendung eine neue Web-Service-Schnittstelle hinzufügen, indem Sie Datei > Neu > Weitere wählen und auf der Registerkarte WebServices auf das Symbol für die SOAP-Server-Schnittstelle doppelklicken.

Mithilfe des Experten zum Hinzufügen neuer Web-Services können Sie den Namen der aufrufbaren Schnittstelle festlegen, die Sie für Clients sichtbar machen möchten. Des Weiteren generiert dieser Experte den Code zum Deklarieren und Registrieren der Schnittstelle und ihrer Implementierungsklasse. Standardmäßig generiert der Experte außerdem Kommentare mit Beispielmethoden und zusätzlichen Typdefinitionen, die Ihnen als Hilfestellung beim Bearbeiten der generierten Dateien dienen sollen.

Generierten Code bearbeiten

Die Schnittstellendefinitionen erscheinen im interface-Abschnitt der generierten Unit. Diese generierte Unit trägt den Namen, den Sie im Experten angegeben haben. Sie müssen die Schnittstellendeklaration ändern, da die Beispielmethoden durch die Methoden ersetzt werden müssen, die Sie den Clients zur Verfügung stellen.

Die vom Experten generierte Implementierungsklasse ist von Soap.InvokeRegistry.TInvokableClass sowie von der aufrufbaren Schnittstelle abgeleitet. Wenn Sie eine aufrufbare Schnittstelle von Grund auf neu definieren, müssen Sie die Deklaration der Implementierungsklasse so ändern, dass die Änderungen denjenigen in der generierten aufrufbaren Schnittstelle entsprechen.

Beachten Sie beim Hinzufügen von Methoden zur aufrufbaren Schnittstelle und Implementierungsklasse, dass die Methoden lediglich Remotable-Typen verwenden dürfen. Informationen zu Remotable-Typen und aufrufbaren Schnittstellen finden Sie unter Nicht-skalare Typen in aufrufbaren Schnittstellen verwenden.

Eine andere Basisklasse verwenden

Der Experte zum Hinzufügen neuer Web-Services generiert Implementierungsklassen, die von TInvokableClass abgeleitet sind. Dies ist die einfachste Art und Weise, eine neue Klasse zur Implementierung eines Web-Service zu erstellen. Sie können die generierte Klasse jedoch durch eine Implementierungsklasse ersetzen, die eine andere Basisklasse aufweist (beispielsweise um eine bestehende Klasse als Basisklasse zu verwenden). Bedenken Sie die folgenden Punkte, wenn Sie die generierte Implementierungsklasse nicht beibehalten möchten:

  • Die neue Implementierungsklasse muss die aufrufbare Schnittstelle direkt unterstützen. In der Aufruf-Registrierung, in der Sie aufrufbare Schnittstellen und deren Implementierungsklassen eintragen, wird aufgezeichnet, welche Klasse die einzelnen Schnittstellen implementiert und für die Aufruferkomponente verfügbar macht, wenn der Aufrufer die Schnittstelle aufrufen muss. Die Aufruf-Registrierung kann allerdings nur dann erkennen, dass eine Schnittstelle von einer Klasse implementiert wird, wenn die Schnittstelle direkt in der Klassendeklaration enthalten ist. Wird die Schnittstelle gemeinsam mit der Basisklasse vererbt, kann die Schnittstellenunterstützung nicht erkannt werden.
  • Die neue Implementierungsklasse muss die IInterface-Methoden unterstützen, die Teil einer jeden Schnittstelle sind. Dies scheint evident zu sein, kann jedoch leicht übersehen werden.
  • Sie müssen dem zur Registrierung der Implementierungsklasse generierten Code eine Factory-Methode hinzufügen, so dass von der Implementierungsklasse Instanzen erstellt werden können.

Der letzte Punkt soll hier etwas näher erläutert werden. Wenn die Implementierungsklasse von TInvokableClass abgeleitet wird und den geerbten Konstruktor nicht durch einen neuen ersetzt, der einen oder mehrere Parameter enthält, weiß die Aufruf-Registrierung, wie sie bei Bedarf Instanzen der Klasse zu erstellen hat. Wenn Sie eine Implementierungsklasse programmieren, die nicht von TInvokableClass abgeleitet ist, oder wenn Sie den Konstruktor wechseln, müssen Sie der Aufruf-Registrierung mitteilen, wie sie Instanzen der Implementierungsklasse erhalten kann.

Zu diesem Zweck können Sie für die Aufruf-Registrierung eine Factory-Prozedur bereitstellen. Eine Factory-Prozedur empfiehlt sich auch dann, wenn Ihre Implementierungsklasse von TInvokableClass abgeleitet ist und den geerbten Konstruktor verwendet. Beispielsweise können Sie eine einzige globale Instanz der Implementierungsklasse verwenden, so dass die Aufruf-Registrierung nicht jedes Mal eine neue Instanz erstellen muss, wenn die Anwendung einen an die aufrufbare Schnittstelle gerichteten Aufruf erhält.

Die Factory-Prozedur muss vom Typ TCreateInstanceProc sein. Sie gibt eine Instanz Ihrer Implementierungsklasse zurück. Wenn die Prozedur eine neue Instanz erzeugt, sollte sich das Implementierungsobjekt selbsttätig freigeben, sobald die Anzahl der Referenzen auf die Schnittstelle auf Null sinkt, da die Aufruf-Registrierung Objektinstanzen nicht explizit freigibt. Der folgende Code veranschaulicht eine andere Herangehensweise, bei der die Factory-Prozedur eine einzige globale Instanz der Implementierungsklasse zurückgibt:

Delphi:

procedure CreateEncodeDecode(out obj: TObject);
begin
  if FEncodeDecode = nil then
  begin
    FEncodeDecode := TEncodeDecode.Create;
    { Referenz auf die Schnittstelle speichern, sodass sich die globale Instanz nicht selbst freigibt }
    FEncodeDecodeInterface := FEncodeDecode as IEncodeDecode;
  end;
  obj := FEncodeDecode; { globale Instanz zurückgeben }
end;

C++:

void __fastcall CreateEncodeDecode(System::TObject* &obj)
{
  if (!FEncodeDecode)
  {
    FEncodeDecode = new TEncodeDecodeImpl();
    // Verweis auf die Schnittstelle speichern, damit sich die globale Instanz nicht // selbsttätig freisetzt
    TEncodeDecodeImpl->QueryInterface(FEncodeDecodeInterface);
  }
  obj = FEncodeDecode;
}

Hinweis: In diesem Beispiel ist FEncodeDecodeInterface eine Variable des Typs IEncodeDecode.

Sie registrieren die Factory-Prozedur bei der Implementierungsklasse, indem Sie sie in einem zweiten Parameter dem Aufruf hinzufügen, der die Klasse in der Aufruf-Registrierung registriert. Suchen Sie zunächst den Aufruf, der vom Experten zum Registrieren der Implementierungsklasse generiert wurde. Dieser Aufruf erscheint im Initialisierungsabschnitt der Unit, durch welche die Klasse definiert wird. Er lautet etwa folgendermaßen:

Delphi:

InvRegistry.RegisterInvokableClass(TEncodeDecode);

C++:

InvRegistry()->RegisterInvokableClass(__classid(TEncodeDecodeImpl));

Fügen Sie dem Aufruf einen zweiten Parameter hinzu, in dem die Factory-Prozedur angegeben wird:

Delphi:

InvRegistry.RegisterInvokableClass(TEncodeDecode, CreateEncodeDecode);

C++:

InvRegistry()->RegisterInvokableClass(__classid(TEncodeDecodeImpl), &CreateEncodeDecode);

Siehe auch