Udostępnij za pośrednictwem


Omówienie warstwy modelu usług

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.

Diagram przedstawiający sposób komunikowania się usługi kalkulatora z klientem przy użyciu wywołań metody dodawania i odejmowania.

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.

Diagram przedstawiający sposób, w jaki WsUtil.exe konwertuje plik WSDL na pliki nagłówkowe i źródłowe języka C.

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.

Diagram przedstawiający interakcję poszczególnych składników modelu usługi WWSAPI.

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.