Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Interfejs API modelu usługi WWSAPI modeluje komunikację między klientem a usługą jako wywołaniami metody, a nie jako komunikaty o danych. W przeciwieństwie do warstwy kanału , która obsługuje bardziej tradycyjne wymiany komunikatów między klientem a usługą, model usługowy automatycznie zarządza komunikacją za pomocą serwera proxy klienta oraz hosta usługowego. Oznacza to, że klient wywołuje wygenerowane funkcje, a serwer implementuje wywołania zwrotne.
Rozważmy na przykład usługę kalkulatora, która wykonuje dodawanie i odejmowanie na dwóch liczbach. Dodawanie i odejmowanie to operacje naturalnie reprezentowane jako wywołania metod.
Model usługi reprezentuje komunikację między klientem a usługą jako zadeklarowane wywołania metod, a więc zamyka szczegóły komunikacji warstwy kanałowej dla aplikacji, co ułatwia implementację usługi.
Określanie usługi
Usługę należy określić pod względem wzorców wymiany komunikatów, a także reprezentacji danych sieciowych. W przypadku usług ta specyfikacja jest zwykle dostarczana jako dokumenty schematu WSDL i XML.
Dokument WSDL jest dokumentem XML zawierającym powiązanie kanału i wzorce wymiany komunikatów usługi, natomiast dokument schematu XML jest dokumentem XML definiującym reprezentację danych poszczególnych komunikatów.
W przypadku usługi kalkulatora i jej operacji dodawania i odejmowania dokument WSDL może wyglądać podobnie do następującego przykładu:
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://Example.org"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa10="http://www.w3.org/2005/08/addressing"
xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" targetNamespace="http://Example.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:portType name="ICalculator">
<wsdl:operation name="Add">
<wsdl:input wsaw:Action="http://Example.org/ICalculator/Add"
message="tns:ICalculator_Add_InputMessage" />
<wsdl:output wsaw:Action="http://Example.org/ICalculator/AddResponse"
message="tns:ICalculator_Add_OutputMessage" />
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
Podobnie schemat XML można zdefiniować w następujący sposób:
<xs:schema xmlns:tns="http://Example.org" elementFormDefault="qualified"
targetNamespace="http://Example.org" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Add">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="a" type="xs:int" />
<xs:element minOccurs="0" name="b" type="xs:int" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="AddResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="result" type="xs:int"
/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Konwertowanie metadanych na kod
Model usługi udostępnia WsUtil.exe jako narzędzie do przetwarzania tych dokumentów metadanych, konwertowania pliku WSDL na nagłówek języka C i pliki źródłowe.
WsUtil.exe generuje nagłówki oraz pliki źródłowe implementacji usługi, a także operacje po stronie klienta.
Wywoływanie usługi kalkulatora z poziomu klienta
Podobnie jak w przypadku implementacji usługi, klient musi dołączyć wygenerowany nagłówek lub nagłówki.
#include "CalculatorProxyStub.h"
Teraz aplikacja kliencka może utworzyć i otworzyć proxy serwisowy, aby rozpocząć komunikację z serwisem kalkulatora.
WS_ENDPOINT_ADDRESS address = {0};
WS_STRING uri= WS_STRING_VALUE(L"http://localhost/example");
address.uri = uri;
if (FAILED (hr = WsCreateServiceProxy(WS_CHANNEL_TYPE_REQUEST, WS_HTTP_CHANNEL_BINDING, NULL, NULL, 0, &serviceProxy, error)))
goto Error;
if (FAILED (hr = WsOpenServiceProxy(serviceProxy, &address, NULL, error)))
goto Error;
Aplikacja może wywołać operację Dodaj w usłudze kalkulatora przy użyciu następującego kodu:
if (FAILED (hr = DefaultBinding_ICalculator_Add(serviceProxy, heap, 1, 2, &result, NULL, 0, NULL, error)))
goto Error;
Zapoznaj się z przykładem kodu w HttpCalculatorClientExample, aby uzyskać pełną implementację usługi kalkulatora.
Składniki modelu usługi
Interakcja poszczególnych składników modelu usługi WWSAPI w przykładzie Kalkulator jest następująca:
- Klient tworzy serwer proxy usługi i otwiera go.
- Klient wywołuje funkcję Add usługi i przekazuje do niej proxy usługi.
- Komunikat jest serializowany zgodnie z metadanymi serializacji w nagłówku i plikach źródłowych generowanych przez narzędzie metadanych (WsUtil.exe).
- Komunikat jest zapisywany w kanale i jest przesyłany przez sieć do usługi.
- Po stronie serwera usługa jest uruchomiona wewnątrz hosta serwisowego i ma punkt końcowy nasłuchujący kontraktu ICalculator.
- Korzystając z metadanych modelu usługi w wycinku, usługa deserializuje komunikat z klienta i wysyła go do wycinku.
- Usługa po stronie serwera wywołuje metodę Add, przekazując jej kontekst operacji. Ten kontekst operacji zawiera odwołanie do komunikatu przychodzącego.
Składniki
- Host usługi: obsługuje usługę.
- proxy usługi: definiuje sposób, w jaki klient komunikuje się z usługą.
- kontekst: zbiór właściwości umożliwiający udostępnianie informacji dotyczących konkretnego stanu dla operacji serwisowej.
- Contract: definicja interfejsu usługi. Na przykład funkcja ICalculator reprezentuje kontrakt dla usługi kalkulatora w naszym przykładowym kodzie.
- WsUtil.exe: narzędzie metadanych modelu usługi do generowania serwerów proxy i wycinków.