Creazione di un servizio
La creazione di un servizio Web è notevolmente semplificata in WWSAPI dall'API del modello di servizio e dallo strumento WsUtil.exe. Il modello di servizio fornisce un'API che consente al servizio e al client di inviare e ricevere messaggi su un canale come chiamate al metodo C. Lo strumento WsUtil genera stub e intestazioni per l'implementazione del servizio.
Implementazione di un servizio Calculator con WWSAPI
Usando le origini generate dallo strumento Wsutil.exe, implementare il servizio seguendo questa procedura.
Includere le intestazioni nel codice sorgente dell'applicazione.
#include "CalculatorProxyStub.h"
Implementare le operazioni del servizio. In questo esempio, le operazioni del servizio sono le funzioni Add e Subtract del servizio calcolatrice.
HRESULT CALLBACK Add (const WS_OPERATION_CONTEXT* context,
int a, int b, int* result,
const WS_ASYNC_CONTEXT* asyncContext,
WS_ERROR* error)
{
*result = a + b;
printf ("%d + %d = %d\n", a, b, *result);
return NOERROR;
}
HRESULT CALLBACK Subtract (const WS_OPERATION_CONTEXT* context,
int a, int b, int* result,
const WS_ASYNC_CONTEXT* asyncContext,
WS_ERROR* error)
{
*result = a - b;
printf ("%d - %d = %d\n", a, b, *result);
return NOERROR;
}
Definire il contratto di servizio impostando i campi di una struttura WS_SERVICE_CONTRACT.
static const DefaultBinding_ICalculatorFunctionTable calculatorFunctions = {Add, Subtract};
static const WS_SERVICE_CONTRACT calculatorContract =
{
&DefaultBinding_ICalculatorContractDesc, // comes from the generated header.
NULL, // for not specifying the default contract
&calculatorFunctions // specified by the user
};
Creare ora un host del servizio e aprirlo per la comunicazione.
WS_SERVICE_ENDPOINT serviceEndpoint = {0};
serviceEndpoint.uri.chars = L"https://+:80/example"; // address given as uri
serviceEndpoint.binding.channelBinding = WS_HTTP_CHANNEL_BINDING; // channel binding for the endpoint
serviceEndpoint.channelType = WS_CHANNEL_TYPE_REPLY; // the channel type
serviceEndpoint.uri.length = (ULONG)wcslen(serviceEndpoint.uri.chars);
serviceEndpoint.contract = (WS_SERVICE_CONTRACT*)&calculatorContract; // the contract
serviceEndpoint.properties = serviceProperties;
serviceEndpoint.propertyCount = WsCountOf(serviceProperties);
if (FAILED (hr = WsCreateServiceHost (&serviceEndpoint, 1, NULL, 0, &host, error)))
goto Error;
// WsOpenServiceHost to start the listeners in the service host
if (FAILED (hr = WsOpenServiceHost (host, NULL, error)))
goto Error;
Per un'implementazione completa del servizio calcolatrice, fare riferimento all'esempio di codice in HttpCalculatorServiceExample.