Freigeben über


Dienstproxy

Ein Dienstproxy ist der clientseitige Proxy für einen Dienst. Der Dienstproxy ermöglicht Anwendungen das Senden und Empfangen von Nachrichten über einen Kanal als Methodenaufrufe.

Dienstproxys werden bei Bedarf erstellt, geöffnet, zum Aufrufen eines Diensts verwendet und geschlossen, wenn sie nicht mehr benötigt werden. Alternativ kann eine Anwendung einen Dienstproxy wiederverwenden, um wiederholt eine Verbindung mit demselben Dienst herzustellen, ohne dass zeit- und ressourcenaufwendige Zeit- und Ressourcenaufwand für die mehrfache Initialisierung eines Dienstproxys erforderlich ist. Das folgende Diagramm veranschaulicht den Fluss der möglichen Zustände des Dienstproxys und der Funktionsaufrufe oder Ereignisse, die von einem Zustand zum anderen führen.

Diagramm: Dienstproxystatus und Funktionsaufrufe oder Ereignisse, die von einem Zustand zu einem anderen führen

Diese Dienstproxyzustände werden in der WS_SERVICE_PROXY_STATE enumerationiert.

Wie das obige Diagramm und der folgende Code veranschaulichen, wird ein Dienstproxy durch einen Aufruf der WsCreateServiceProxy-Funktion erstellt. Als Parameter für diesen Aufruf stellt WWSAPI die folgenden Enumerationen bereit:

Es akzeptiert auch optionale Parameter mit den folgenden Datentypen:

Wenn der Dienstproxy erstellt wurde, gibt die WsCreateServiceProxy-Funktion über einen out-Parameter einen Verweis auf den Dienstproxy zurück, WS_SERVICE_PROXY.

WS_SERVICE_PROXY* serviceProxy = NULL;
hr = WsCreateServiceProxy (
    WS_TCP_CHANNEL_BINDING, 
    WS_CHANNEL_TYPE_DUPLEX_SESSION, 
    NULL, 
    NULL, 
    0, 
    NULL,
    0,
    &serviceProxy, 
    error);

Wenn der Dienstproxy erstellt wurde, kann die Anwendung den Dienstproxy für die Kommunikation mit einem Dienst öffnen, indem sie die WsOpenServiceProxy-Funktion aufruft und eine Adressstruktur mit der Netzwerkadresse des Dienstendpunkts übergibt, mit dem eine Verbindung hergestellt werden soll.

WS_ENDPOINT_ADDRESS address = {0};
address.uri.chars = "net.tcp://localhost/example";
address.uri.length = wcslen("net.tcp://localhost/example";);
hr = WsOpenServiceProxy(serviceProxy, &address, NULL, error);

Wenn der Dienstproxy geöffnet wurde, kann die Anwendung ihn für Aufrufe des Diensts verwenden.

hr = Add(
    serviceProxy, 
    1, 
    2, 
    &result, 
    NULL, 
    0, 
    NULL, 
    error);

Wenn die Anwendung den Dienstproxy nicht mehr benötigt, wird der Dienstproxy durch Aufrufen der WsCloseServiceProxy-Funktion geschlossen. Außerdem wird der zugeordnete Arbeitsspeicher durch Aufrufen von WsFreeServiceProxy freigegeben.

hr = WsCloseServiceProxy(
    serviceProxy, 
    NULL, 
    error);
hr = WsFreeServiceProxy(
    serviceProxy, 
    error);

Wiederverwendung des Dienstproxys

Alternativ kann nach dem Aufruf von WsCloseServiceProxy eine Anwendung den Dienstproxy wiederverwenden, indem sie die WsResetServiceProxy-Funktion aufruft .

hr = WsResetServiceProxy(
    serviceProxy, 
    error);

Weitere Informationen zur Verwendung von Dienstproxys in verschiedenen Kontexten finden Sie in den folgenden Themen:

Sicherheit

Die folgenden Überlegungen zum Anwendungsentwurf sollten bei Verwendung der WWSAPI-Dienstproxy-API sorgfältig beachtet werden:

  • Der Dienstproxy führt keine Validierung der Daten über die Überprüfung von Basic Profile 2.0 und XML-Serialisierung hinaus aus. Es liegt in der Verantwortung der Anwendung, die daten zu überprüfen, die in den Parametern enthalten sind, die sie im Rahmen des Aufrufs zurückerhalten.
  • Das Konfigurieren der maximalen Anzahl ausstehender Aufrufe für den Dienstproxy mithilfe des WS_PROXY_PROPERTY_ID-Enumerationswerts WS_PROXY_PROPERTY_MAX_PENDING_CALLS bietet Schutz vor einem langsam ausgeführten Server. Der Standardwert ist 100. Anwendungen müssen beim Ändern der Standardwerte vorsichtig sein.
  • Der Dienstproxy bietet keine Sicherheitsgarantien, die über die in der WS_SECURITY_DESCRIPTION-Struktur für die Kommunikation mit dem Server hinausgehen.
  • Achten Sie darauf, wenn Sie die Standardeinstellungen für Nachrichten und Kanäle auf dem Dienstproxy ändern. Lesen Sie die Sicherheitsüberlegungen im Zusammenhang mit Nachrichten und Kanälen, bevor Sie die zugehörigen Eigenschaften ändern.
  • Der Dienstproxy verschlüsselt alle Anmeldeinformationen, die im Arbeitsspeicher gespeichert sind.

Die folgenden API-Elemente beziehen sich auf Dienstproxys.

Rückruf BESCHREIBUNG
WS_PROXY_MESSAGE_CALLBACK Wird aufgerufen, wenn die Header der Eingabenachricht über gesendet werden sollen oder wenn gerade eine Ausgabenachricht empfangen wird.

 

Enumeration Beschreibung
WS_CALL_PROPERTY_ID Listet optionale Parameter zum Konfigurieren eines Aufrufs für einen clientseitigen Dienstvorgang auf.
WS_PROXY_PROPERTY_ID Listet optionale Parameter zum Konfigurieren des Dienstproxys auf.
WS_SERVICE_PROXY_STATE Der Status des Dienstproxys.

 

Funktion BESCHREIBUNG
WsAbandonCall Gibt einen angegebenen Aufruf für einen angegebenen Dienstproxy ab.
WsAbortServiceProxy Bricht alle ausstehenden Eingaben und Ausgaben für einen angegebenen Dienstproxy ab.
WsCall Nur intern. Serialisiert Argumente in eine Nachricht und sendet sie über den Kanal.
WsCloseServiceProxy Schließt einen Dienstproxy für die Kommunikation.
WsCreateServiceProxy Erstellt einen Dienstproxy.
WsFreeServiceProxy Gibt den Speicher frei, der einem Dienstproxy zugeordnet ist.
WsGetServiceProxyProperty Ruft eine angegebene Dienstproxyeigenschaft ab.
WsOpenServiceProxy Öffnet einen Dienstproxy für einen Dienstendpunkt.
WsResetServiceProxy Setzt den Dienstproxy zurück.

 

Handle BESCHREIBUNG
WS_SERVICE_PROXY Ein nicht transparenter Typ, der verwendet wird, um auf einen Dienstproxy zu verweisen.

 

Struktur BESCHREIBUNG
WS_CALL_PROPERTY Gibt eine Aufrufeigenschaft an.
WS_PROXY_PROPERTY. Gibt eine Proxyeigenschaft an.