Dela via


Tjänståtgärder på klientsidan

Följande är layouten för en tjänståtgärd på klientsidan:

Signatur för tjänståtgärder på klientsidan

typedef HRESULT(CALLBACK *ICalculator_Add)(WS_SERVICE_PROXY* serviceProxy, 
                                           WS_HEAP* heap, 
                                           ULONG a, ULONG b, ULONG* result, 
                                           const WS_CALL_PROPERTY* callProperties, 
                                           const ULONG callPropertyCount, 
                                           const WS_ASYNC_CONTEXT* asyncContext, 
                                           WS_ERROR* error);

Minnesöverväganden för tjänståtgärder på klientsidan

Anropet till tjänståtgärden tar en WS_HEAP* som parameter. Det här är en obligatorisk parameter som används för serialisering/deserialisering av meddelandekroppar till parametrar.

Programmet måste anropa WsResetHeap om anropet lyckades eller inte. Om anropet lyckades och det har utgående parametrar bör programmet anropa WsResetHeap omedelbart efter att det har slutförts med de utgående parametrarna.

Programmet ska allokera minne för in- och ut-parametrar med WsAlloc. Tjänstproxyn kan behöva omallokera dem så att de tillhandahållna pekarna skrivs över. Ett försök att frigöra sådant minne gör att programmet kraschar.

Tjänståtgärd på klientsidan och WS_HEAP

HRESULT hr = IProcessOrder_ProcessOrder(serviceProxy, heap, orderNumber, &orderReceipt, NULL, 0, NULL, error);
if(FAILED(hr))
    goto error;
hr = ProcessReceipt(orderReceipt);
WsResetHeap(heap);
if(FAILED(hr))
    goto error;
hr = IProcessOrder_CompleteOrder(serviceProxy, heap, orderNumber, &orderMemo, NULL, 0, NULL, error);
if(FAILED(hr))
    goto error;
hr = ProcessMemo(orderMemo);
WsResetHeap(heap);
if(FAILED(hr))
    goto error;

Felparameter

Programmet bör alltid skicka in felparametern till:

  • Få omfattande felinformation om ett fel inträffar under tjänståtgärdsanropet.
  • Hämta felobjektet om tjänsten returnerade ett fel. Felet finns i felobjektet. I det här fallet är det HRESULT- värde som returneras från tjänståtgärden WS_E_ENDPOINT_FAULT_RECEIVED (se Return Values för Windows Web Services).

Anropa egenskaper för tjänståtgärder på klientsidan

Med samtalsegenskaper kan ett program ange anpassade inställningar för ett visst anrop. För närvarande är endast en anropsegenskap tillgänglig med tjänstmodellen WS_CALL_PROPERTY_CALL_ID.

WS_CALL_PROPERTY callProperties[1] = {0};
callProperties[0].id = WS_CALL_PROPERTY_CALL_ID;
callProperties[0].value = 5;

HRESULT hr = IProcessOrder_ProcessOrder(serviceProxy, heap, orderNumber, &orderReceipt,  callProperties, WsCountOf(callProperties), NULL, error);
if(FAILED(hr))
    goto error;
//:
//:
hr = IProcessOrder_CompleteOrder(serviceProxy, heap, orderNumber, &orderReceipt, callProperties, WsCountOf(callProperties), NULL, error);
if(FAILED(hr))
    goto error;

//:
//:
//:
// On a separate thread 
// In this case both the calls belong to call group 5, and will abandon as a result of the call to WsAbandonCall. 
hr = WsAbandonCall(serviceProxy, 5, error);

Avbryta ett samtal

Det är ofta önskvärt att avbryta resultatet av ett anrop för att lämna tillbaka kontrollen till programmet, så att det faktiska slutförandet av samtalet hanteras av infrastrukturen. Tjänstproxy tillhandahåller den här funktionen via WsAbandonCall.

Observera att kontrollen till anroparen kanske inte ges tillbaka omedelbart, den enda garanti som tjänstproxykörningen ger är att den inte väntar på att någon I/O-bunden åtgärd ska slutföras innan den ger kontroll tillbaka till anroparen.

Anrop på en tjänståtgärd på klientsidan kan avbrytas med hjälp av ett anrop till WsAbandonCall. Det tar en tjänstproxy och ett samtals-ID. Ett samtals-ID anges som en del av en anropsegenskaper för en tjänståtgärd.

Om anrops-ID:t är 0 kommer tjänstproxyn att avbryta alla väntande anrop på den instansen.

Tidsgränser för samtal

Som standard har en tjänstproxy en tidsgräns på 30 sekunder för varje anrop. Tidsgränsen för ett anrop kan ändras av WS_PROXY_PROPERTY_CALL_TIMEOUT tjänstproxyegenskap när du skapar en tjänstproxy via WsCreateServiceProxy.

När en tidsgräns har nåtts avbryts anropet.

Returnera värden

Alla lyckade HRESULT- värden måste behandlas som lyckade och alla felvärden måste behandlas som fel. Följande är några av de HRESULT- värden som ett program kan förvänta sig:

  • WS_S_ASYNC: Samtalet slutförs asynkront.
  • NOERROR: Samtalet har slutförts.
  • WS_E_OPERATION_ABANDONED: Samtalet har avbrutits. Felobjektet innehåller orsaken till att det avbryts.
  • WS_E_INVALID_OPERATION: Tjänstproxyn är inte i ett lämpligt tillstånd för att göra ett anrop, kontrollera tjänstens proxytillstånd för att ta reda på tillståndet för tjänstproxyn.

En fullständig lista över returvärden finns i Windows Web Services Return Values.

Kodexempel

Kodexempel finns i följande: