Erstellen eines Clients
Das Erstellen eines Clients für Webdienste wird in WWSAPI durch die Dienstmodell-API und das WsUtil.exe-Tool erheblich vereinfacht. Das Dienstmodell stellt eine API bereit, mit der der Client Nachrichten über einen Kanal als C-Methodenaufrufe senden und empfangen kann. Das WsUtil-Tool generiert Header und Hilfsprogramme für die Implementierung des Clients. Diese Header enthalten die Typen und Funktionsprototypen für C-Funktionen, die die vom Zielwebdienst angebotenen Dienste darstellen. Die Hilfsprogramme werden verwendet, um den Dienstproxy zu erstellen, der die Bindungsinformationen und die Endpunktadresse für den Dienst enthält.
Verwenden von WsUtil zum Generieren von Headern und Hilfsprogrammen
Um die Header und Hilfsprogramme zu generieren, öffnet und liest WsUtil die Metadatendateien für den Zieldienst – wsdl- und xsd-Dateien – und konvertiert sie in Header. Daher ist es erforderlich, die Metadatendateien für den Zieldienst im Voraus abzurufen, z. B. mithilfe von SvcUtil, einem Teil der Windows Communication Foundation. Aus Sicherheitsgründen ist es zwingend erforderlich, dass Ihre Kopien dieser Dateien vertrauenswürdig sind. (Weitere Informationen finden Sie im Abschnitt "Sicherheit" des Themas WsUtil Compiler Tool .)
Verwenden Sie zum Ausführen von WsUtil die folgende Befehlszeilensyntax, wenn sich die WSDL- und XSD-Dateien für den Dienst im eigenen Verzeichnis befinden: WsUtil.exe *.wsdl *.xsd
. Alternativ können Sie die Dateien mit dem vollständigen Namen angeben.
WsUtil generiert im Allgemeinen zwei Dateien für jede Metadatendatei: einen Header und eine C-Datei. Fügen Sie diese Dateien Ihrem Codierungsprojekt hinzu, und verwenden Sie #include-Anweisungen, um sie in den Code für Ihren Client einzuschließen. (Die XSD-Dateien stellen Typen dar, und die WSDL-Dateien stellen Vorgänge dar.)
Erstellen des Dienstproxys
Der von WsUtil generierte Header enthält eine Hilfsroutine zum Erstellen des Dienstproxys mit der erforderlichen Bindung. Diese Routine ist im Abschnitt "Richtlinienhilfsroutinen" der generierten Headerdatei enthalten. Der generierte Header für den Rechnerdienst, der im httpcalculatorclientexample-Beispiel veranschaulicht wird, enthält beispielsweise den folgenden Funktionsprototyp.
HRESULT BasicHttpBinding_ICalculator_CreateServiceProxy(
__in_opt WS_HTTP_BINDING_TEMPLATE* templateValue,
__in_ecount_opt(proxyPropertyCount) const WS_PROXY_PROPERTY* proxyProperties,
__in const ULONG proxyPropertyCount,
__deref_out_opt WS_SERVICE_PROXY** _serviceProxy,
__in_opt WS_ERROR* error);
Integrieren Sie dieses Hilfsprogramm in Ihren Code, und übergeben Sie ein WS_SERVICE_PROXY Handle, um das Handle an den erstellten Dienstproxy zu erhalten. Im einfachsten Szenario, in dem nur ein Dienstproxyhandle und ein Fehlerobjekt an die Funktion übergeben werden, sieht der Aufruf wie folgt aus.
hr = BasicHttpBinding_ICalculator_CreateServiceProxy(
NULL,
NULL,
0,
&serviceProxy,
error);
Um den Adressteil des Dienstproxys zu erstellen, rufen Sie WsOpenServiceProxy mit einem Handle auf den Dienstproxy und einem Zeiger auf einen WS_ENDPOINT_ADDRESS auf, der die Dienstendpunktadresse enthält, mit der Sie eine Verbindung herstellen möchten.
Implementieren des Clients mit Funktionsprototypen
Die aus den WSDL-Dateien des Diensts generierten Header enthalten auch C-Funktionsprototypen, die die im Webdienst verfügbaren Dienste darstellen und für die erforderliche Bindung spezifisch sind. Beispielsweise enthält ein Header, der für den rechnerischen Dienst generiert wird, der in HttpCalculatorServiceExample dargestellt ist, den folgenden Prototyp für den Multiplikationsvorgang dieses Diensts.
HRESULT BasicHttpBinding_ICalculator_Multiply(
__in WS_SERVICE_PROXY* _serviceProxy,
__in double n1,
__in double n2,
__out double* MultiplyResult,
__in WS_HEAP* _heap,
__in_ecount_opt(_callPropertyCount) const WS_CALL_PROPERTY* _callProperties,
__in const ULONG _callPropertyCount,
__in_opt const WS_ASYNC_CONTEXT* _asyncContext,
__in_opt WS_ERROR* _error);
Sie können die Prototypen kopieren und als Vorlagen zum Codieren der Funktionsaufrufe in Ihrem Client verwenden, wobei sie jeweils das Handle an den Dienstproxy übergeben. Wenn Sie mit dem Dienstproxy fertig sind, rufen Sie WsCloseServiceProxy auf.