Delen via


Een service maken

Het maken van een webservice is aanzienlijk vereenvoudigd in WWSAPI door de Service Model-API en het hulpprogramma WsUtil.exe. Het servicemodel biedt een API waarmee de service en client berichten kunnen verzenden en ontvangen via een kanaal als C-methodeaanroepen. Het hulpprogramma WsUtil genereert stubs en headers voor het implementeren van de service.

Een rekenmachineservice implementeren met WWSAPI

Implementeer de service met behulp van de gegenereerde bronnen uit het hulpprogramma Wsutil.exe door de volgende stappen uit te voeren.

Neem de headers op in uw toepassingsbron.

#include "CalculatorProxyStub.h"

Implementeer de servicebewerkingen. In dit voorbeeld zijn de servicebewerkingen de functies Toevoegen en aftrekken van de rekenmachineservice.

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

Definieer het servicecontract door de velden van een WS_SERVICE_CONTRACT structuur in te stellen.

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

Maak nu een servicehost en open deze voor communicatie.

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;

Raadpleeg het codevoorbeeld op HttpCalculatorServiceExample voor een volledige implementatie van de calculatorservice.