다음을 통해 공유


서비스 만들기

WWSAPI에서는 서비스 모델 API 및 WsUtil.exe 도구를 통해 웹 서비스 만들기가 크게 간소화되었습니다. 서비스 모델은 서비스 및 클라이언트가 C 메서드 호출로 채널을 통해 메시지를 보내고 받을 수 있도록 하는 API를 제공합니다. WsUtil 도구는 서비스를 구현하기 위한 스텁 및 헤더를 생성합니다.

WWSAPI를 사용하여 계산기 서비스 구현

Wsutil.exe 도구에서 생성된 원본을 사용하여 다음 단계에 따라 서비스를 구현합니다.

애플리케이션 원본에 헤더를 포함합니다.

#include "CalculatorProxyStub.h"

서비스 작업을 구현합니다. 이 예제에서 서비스 작업은 계산기 서비스의 추가 및 빼기 함수입니다.

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

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

이제 서비스 호스트를 만들고 통신을 위해 엽니다.

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;

계산기 서비스의 전체 구현은 HttpCalculatorServiceExample 의 코드 예제를 참조하세요.