Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Tworzenie usługi internetowej w WWSAPI jest znacznie uproszczone dzięki interfejsowi API Service Model oraz narzędziu WsUtil.exe. Model usługi udostępnia interfejs API, który umożliwia usłudze i klientowi wysyłanie i odbieranie komunikatów przez kanał jako wywołania metod języka C. Narzędzie WsUtil generuje wycinki i nagłówki służące do implementowania usługi.
Implementowanie usługi Kalkulator przy użyciu interfejsu WWSAPI
Korzystając z wygenerowanych źródeł z narzędzia Wsutil.exe, zaimplementuj usługę, wykonując następujące kroki.
Uwzględnij nagłówki w źródle aplikacji.
#include "CalculatorProxyStub.h"
Zaimplementuj operacje serwisu. W tym przykładzie operacje usługi to funkcje Dodawania i odejmowania usługi kalkulatora.
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;
}
Zdefiniuj kontrakt usługi, ustawiając pola struktury 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
};
Teraz utwórz hosta usługi i otwórz go na potrzeby komunikacji.
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;
Zapoznaj się z przykładem kodu w HttpCalculatorServiceExample, aby uzyskać pełną implementację usługi kalkulatora.