Sdílet prostřednictvím


Přehled vrstvy modelu služby

Rozhraní API modelu služby WWSAPI modeluje komunikaci mezi klientem a službou jako volání metod, nikoli jako datových zpráv. Na rozdíl od vrstvy kanálu , která podporuje tradiční výměny zpráv mezi klientem a službou, model služby automaticky spravuje komunikaci pomocí proxy serveru na straně klienta a hostitele služby na straně služby. To znamená, že klient volá generované funkce a server implementuje zpětná volání.

Představte si například službu kalkulačky, která provádí sčítání a odčítání u dvou čísel. Sčítání a odčítání jsou operace přirozeně reprezentované jako volání metody.

Diagram znázorňující, jak služba kalkulačky komunikuje s klientem pomocí volání metod pro sčítání a odčítání

Model služby představuje komunikaci mezi klientem a službou jako deklarovaná volání metod, takže skrývá podrobnosti o komunikaci základní vrstvy kanálu z aplikace, což usnadňuje implementaci služby.

Určení služby

Služba musí být určena z hlediska vzorců výměny zpráv a reprezentace síťových dat. Pro služby je tato specifikace obvykle poskytována jako dokumenty schématu WSDL a XML.

Dokument WSDL je dokument XML, který obsahuje vazbu kanálu a vzory výměny zpráv služby, zatímco dokument schématu XML je dokument XML, který definuje reprezentaci dat jednotlivých zpráv.

Pro službu kalkulačky a její operace sčítání a odčítání může dokument WSDL vypadat jako v následujícím příkladu:

<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>

Podobně lze jeho schéma XML definovat takto:

<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> 

Převod metadat na kód

Model služby poskytuje WsUtil.exe jako nástroj pro zpracování těchto dokumentů metadat a převod souboru WSDL na hlavičku jazyka C a zdrojové soubory.

Diagram znázorňující, jak WsUtil.exe převést soubor WSDL na hlavičku C a zdrojové soubory

WsUtil.exe generuje záhlaví a zdrojové kódy pro implementaci služby i operace služeb na straně klienta.

Volání služby kalkulačky z klienta

Stejně jako u implementace služby musí klient zahrnout vygenerovanou hlavičku nebo hlavičky.

#include "CalculatorProxyStub.h"

Klientská aplikace teď může vytvořit a otevřít proxy služby, aby mohla začít komunikovat se službou kalkulačky.

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;

Aplikace může volat operaci Přidat u služby kalkulačky s následujícím kódem:

if (FAILED (hr = DefaultBinding_ICalculator_Add(serviceProxy, heap, 1, 2, &result, NULL, 0, NULL, error)))
    goto Error;

Úplnou implementaci služby kalkulačky najdete v příkladu kódu na HttpCalculatorClientExample.

Komponenty modelu služby

Interakce jednotlivých komponent modelu služby WWSAPI v příkladu kalkulačky je následující:

  • Klient vytvoří proxy služby a otevře ji.
  • Klient volá funkci Add služby a předává do ní proxy objekt služby.
  • Zpráva je serializována podle metadat serializace v hlavičce a zdrojových souborech vygenerovaných nástrojem metadat (WsUtil.exe).
  • Zpráva je zapsána do kanálu a je přenášena přes síť do služby.
  • Na straně serveru je služba hostovaná uvnitř hostitele služby a má koncový bod, který naslouchá kontraktu ICalculator.
  • Pomocí metadat modelu služby v zástupném objektu služba deserializuje zprávu od klienta a odešle ji do zástupného objektu.
  • Služba na straně serveru volá metodu Add a předává ji kontext operace. Tento kontext operace obsahuje odkaz na příchozí zprávu.

diagram znázorňující interakci jednotlivých komponent modelu služby WWSAPI

Součásti

  • hostitel služby: Hostuje službu.
  • proxy služby: Definuje, jak klient komunikuje se službou.
  • Kontext: Kolekce vlastností pro umožnění přístupu ke stavově specifickým informacím pro operaci služby.
  • Contract: Definice rozhraní služby. Například ICalculator představuje kontrakt pro službu kalkulačky v našem ukázkovém kódu.
  • WsUtil.exe: Nástroj metadat modelu služby pro generování proxies a zástupů.