Partager via


Création d'un service

La création d’un service web est considérablement simplifiée dans WWSAPI par l’API modèle de service et l’outilWsUtil.exe . Le modèle de service fournit une API qui permet au service et au client d’envoyer et de recevoir des messages sur un canal en tant qu’appels de méthode C. L’outil WsUtil génère des stubs et des en-têtes pour l’implémentation du service.

Implémentation d’un service calculatrice à l’aide de WWSAPI

À l’aide des sources générées à partir de l’outil Wsutil.exe , implémentez le service en procédant comme suit.

Incluez les en-têtes dans la source de votre application.

#include "CalculatorProxyStub.h"

Implémentez les opérations de service. Dans cet exemple, les opérations de service sont les fonctions Ajouter et Soustraire du service de calculatrice.

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

Définissez le contrat de service en définissant les champs d’une structure de 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
};

À présent, créez un hôte de service et ouvrez-le pour la communication.

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;

Reportez-vous à l’exemple de code sur HttpCalculatorServiceExample pour une implémentation complète du service de calculatrice.