Condividi tramite


Panoramica del livello del modello di servizio

L'API del modello di servizio WWSAPI modella la comunicazione tra un client e un servizio come chiamate al metodo, anziché come messaggi di dati. A differenza del livello del canale , che supporta scambi di messaggi più tradizionali tra client e servizio, il modello di servizio gestisce automaticamente la comunicazione tramite un proxy di servizio nel client e un host del servizio nel servizio. Ciò significa che il client chiama funzioni generate e il server implementa i callback.

Si consideri, ad esempio, un servizio calcolatrice che esegue l'addizione e la sottrazione su due numeri. L'addizione e la sottrazione sono operazioni naturalmente rappresentate come chiamate al metodo.

Diagramma che mostra come un servizio di calcolatrice comunica con un client usando chiamate ai metodi per l'addizione e la sottrazione.

Il modello di servizio rappresenta la comunicazione tra il client e il servizio come chiamate di metodo dichiarate e quindi nasconde i dettagli di comunicazione del livello del canale sottostante dall'applicazione, semplificando l'implementazione del servizio.

Specificare un servizio

È necessario specificare un servizio in termini di modelli di scambio di messaggi, nonché la relativa rappresentazione dei dati di rete. Per i servizi, questa specifica viene generalmente fornita sotto forma di documenti WSDL e xml schema.

Il documento WSDL è un documento XML che contiene l'associazione di canali e i modelli di scambio di messaggi del servizio, mentre il documento XML Schema è un documento XML che definisce la rappresentazione dei dati dei singoli messaggi.

Per il servizio calcolatrice e le operazioni di addizione e sottrazione, il documento WSDL potrebbe essere simile all'esempio seguente:

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

Analogamente, il relativo XML Schema può essere definito come segue:

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

Conversione dei metadati nel codice

Il modello di servizio fornisce il WsUtil.exe come strumento per elaborare questi documenti di metadati, convertendo un file WSDL in un'intestazione C e in file di origine.

Diagramma che mostra come WsUtil.exe converte un file WSDL in un'intestazione C e in file di origine.

Il WsUtil.exe genera header e sorgenti per l'implementazione del servizio e le operazioni sul lato client.

Effettuare la chiamata al servizio Calcolatrice da un client

Come avviene per l'implementazione del servizio, il client deve includere l'intestazione o le intestazioni generate.

#include "CalculatorProxyStub.h"

A questo punto, l'applicazione client può creare e aprire un proxy di servizio per iniziare la comunicazione con il servizio calcolatrice.

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;

L'applicazione può chiamare l'operazione Aggiungi nel servizio calcolatrice con il codice seguente:

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

Per l'implementazione completa del servizio calcolatrice, vedere l'esempio di codice in HttpCalculatorClientExample.

Componenti del modello di servizio

L'interazione dei singoli componenti del modello di servizio WWSAPI all'interno dell'esempio calculator è la seguente:

  • Il client crea un proxy del servizio e lo apre.
  • Il client chiama la funzione Add del servizio e passa il proxy del servizio come parametro.
  • Il messaggio viene serializzato in base ai metadati di serializzazione nei file di intestazione e di origine generati dallo strumento di metadati (WsUtil.exe).
  • Il messaggio viene scritto nel canale e viene trasmesso in rete al servizio.
  • Dal lato server, il servizio è ospitato all'interno di un host per servizi e ha un endpoint che ascolta il contratto ICalculator.
  • Usando i metadati del modello di servizio nello stub, il servizio deserializza il messaggio dal client e lo invia allo stub.
  • Il servizio lato server chiama il metodo Add, passandogli il contesto dell'operazione. Questo contesto dell'operazione contiene il riferimento al messaggio in arrivo.

Diagramma che mostra l'interazione dei singoli componenti del modello di servizio WWSAPI.

Componenti

  • Host del Servizio: Ospita un servizio.
  • proxy del servizio: definisce il modo in cui un client comunica con un servizio.
  • Contesto: portafoglio di proprietà per rendere disponibili informazioni specifiche dello stato per un'operazione del servizio.
  • Contratto: definizione dell'interfaccia di un servizio. Ad esempio, ICalculator rappresenta un contratto per il servizio calcolatrice nel codice di esempio.
  • WsUtil.exe: strumento di metadati del modello di servizio per la generazione di proxy e stub.