Manuelles Erstellen eines Dienstproxys für einen WCF-Dienst

Die einfachste Möglichkeit zum Erstellen eines Clientdienstproxys für einen Wcf-Dienst (Windows Communication Foundation) ist die Dienstmodellebene mit dem WsUtil-Tool, wie im Thema Erstellen eines Clients beschrieben. Bei Bedarf können Sie jedoch auch manuell einen Dienstproxy erstellen. Diese API enthält eine WsCreateServiceProxy-Funktion zum Erstellen des Dienstproxys sowie Strukturen, Enumerationen usw. zum Festlegen der Eigenschaften, die für die Zusammenarbeit mit WCF erforderlich sind.

WCF stellt eine Reihe von Standardbindungen bereit, die jeweils auf ein bestimmtes Verwendungsszenario ausgerichtet sind. Welche Bindung der Dienst, mit dem Sie eine Verbindung herstellen möchten, verwendet, bestimmt wiederum, welche Kanaleigenschaften Sie anpassen müssen, damit Ihr Dienstproxy mit dem Dienst kommunizieren kann.

Erstellen eines Dienstproxys für WSHttpBinding von WCF

WSHttpBinding ist für das Szenario mit Internet-Webdiensten im Hauptnetz vorgesehen. Es verwendet die neuere SOAP-Version 1.2 und WS-Addressing Version 1.0 und ermöglicht eine Vielzahl von Sicherheitseinstellungen über die öffentlichen HTTP- und HTTPS-Transporte. WWSAPI verfügt nicht über eine Entsprechung der WSHttpBinding (oder einer der WCF-Standardbindungen), aber da die SOAP-Standardversion, WS-Addressing Version und das Codierungsformat mit denen in WSHttpBinding übereinstimmen, ist das Erstellen eines Dienstproxys für einen Dienst, der die WSHttpBinding verwendet, einfach. Um beispielsweise einen Dienstproxy zu erstellen, um ohne Sicherheit mit einem WSHttpBinding-Endpunkt zu kommunizieren, können Sie einfach Code wie den folgenden Codeausschnitt verwenden (Variablendeklaration und Heap- und Fehlererstellung werden weggelassen). Beachten Sie, dass im Aufruf der WsCreateServiceProxy-Funktion keine Kanaleigenschaften oder Sicherheitsbeschreibungen angegeben sind.

// Create the proxy

hr = WsCreateServiceProxy(
        WS_CHANNEL_TYPE_REQUEST, 
        WS_HTTP_CHANNEL_BINDING, 
        NULL, // security description
        NULL, // proxy properties
        0, // proxy property count
        NULL, // channel properties
        0, // channel property count
        &proxy, 
        error);

Die Funktion erstellt den Dienstproxy und gibt einen Zeiger im serviceProxy-Parameter zurück (&Proxy im funktionsaufruf oben).

Erstellen eines Dienstproxys für "BasicHttpBinding" von WCF

Wenn Sie manuell einen Dienstproxy für einen WCF-Dienst erstellen, der eine BasicHttpBinding-Bindung verwendet, ist es jedoch erforderlich, die SOAP-Version und WS-Addressing Eigenschaften des Kanals festzulegen. Dies liegt daran, dass WWSAPI standardmäßig SOAP-Version 1.2 und WS-Addressing 1.0 verwendet. Das BasicHttpBinding von WCF verwendet dagegen SOAP-Version 1.1 und keine WS-Adressierung.

Um die SOAP-Version und WS-Addrssing Eigenschaften des Kanals festzulegen, deklarieren Sie ein Array von WS_CHANNEL_PROPERTY Strukturen, die die Kanaleigenschaften und zugehörigen Informationen enthalten.

WS_CHANNEL_PROPERTY channelProperties[4]; // Array to hold up to 4 channel properties

ULONG channelPropertyCount = 0; // Count of properties set
 
WS_ENVELOPE_VERSION soapVersion = WS_ENVELOPE_VERSION_SOAP_1_1; // Set required SOAP version
channelProperties[channelPropertyCount].id = WS_CHANNEL_PROPERTY_ENVELOPE_VERSION; // Type of first channel property
channelProperties[channelPropertyCount].value = &soapVersion; // Address of the SOAP version value
channelProperties[channelPropertyCount].valueSize = sizeof(soapVersion); // Size of the value
channelPropertyCount++; // Increment property count
 
WS_ADDRESSING_VERSION addressingVersion = WS_ADDRESSING_VERSION_TRANSPORT; // Set required WS-Addressing value
channelProperties[channelPropertyCount].id = WS_CHANNEL_PROPERTY_ADDRESSING_VERSION; // Type of second channel property
channelProperties[channelPropertyCount].value = &addressingVersion ; // Address of the WS-Addressing value
channelProperties[channelPropertyCount].valueSize = sizeof(addressingVersion ); // Size of the value
channelPropertyCount++; // Increment property count
 
// add more channel properties here

Übergeben Sie dann das Array der Kanaleigenschaften (channelProperties) und die Anzahl der Eigenschaften (channelPropertyCount) an WsCreateServiceProxy (oder WsCreateChannel , wenn Sie auf Kanalebene arbeiten).

// Create the proxy

hr = WsCreateServiceProxy(
        WS_CHANNEL_TYPE_REQUEST, 
        WS_HTTP_CHANNEL_BINDING, 
        NULL, // security description
        NULL, // proxy properties
        0, // proxy property count
        channelProperties, // channel properties
        channelPropertyCount, // channel property count
        &proxy, 
        error);

Das Array, das Sie für die Eigenschaften deklariert haben, wird in WsCreateServiceProxy kopiert. Daher können Sie den Arbeitsspeicher für das Eigenschaftenarray sofort nach dem Aufrufen der Funktion freigeben. Wenn Sie den Speicher aus dem Stapel zuordnen (wie der Codeausschnitt oben), können Sie auch direkt nach dem Aufruf von der Funktion zurückgeben.

Andere Bindungen

Darüber hinaus bietet WWSAPI Mechanismen zum Erstellen von Dienstproxys für die Kommunikation mit WCF-Diensten mithilfe anderer Bindungen, z. B. NetTcpBinding und WSFederationHttpBinding. Viele dieser Bindungen erfordern das Festlegen zusätzlicher Kanaleigenschaften, z. B. Sicherheitsbeschreibungen. Beispiele, die die Verwendung anderer Bindungen veranschaulichen, finden Sie im Abschnitt Beispiele für Windows-Webdienste, insbesondere in den Unterabschnitten TCP-Kanalebenenbeispiele, HTTP-Kanalebenenbeispiele und Beispiele für Sicherheitskanalebene .