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