Servicebewerkingen aan de clientzijde
Hier volgt de indeling van een servicebewerking aan de clientzijde:
- WS_SERVICE_PROXY* serviceProxy: de -serviceproxy voor de aanroep.
- WS_HEAP* heap: een vereiste heap gebruikt voor lichaamsserialisatie en deserialisatie van de WS_MESSAGE.
- Parameters voor servicebewerkingen: parameters met betrekking tot de servicebewerking.
- Oproepeigenschappen en het aantal: een matrix met oproepeigenschappen.
- Aantal aanroepeigenschappen: het aantal gesprekseigenschappen.
- WS_ASYNC_CONTEXT asyncContext: Async-context voor het asynchroon uitvoeren van de aanroep.
- WS_ERROR fout: uitgebreid foutobject.
Handtekening voor servicebewerkingen aan de clientzijde
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);
Geheugenoverwegingen voor servicebewerkingen aan de clientzijde
De aanroep van de servicebewerking neemt een WS_HEAP* als parameter. Dit is een vereiste parameter die wordt gebruikt voor serialisatie/deserialisatie van berichtteksten naar parameters.
De toepassing moet WsResetHeap aanroepen of de aanroep is geslaagd of niet. Als de aanroep is geslaagd en er uitgaande parameters zijn, moet de toepassing WsResetHeap- aanroepen direct nadat deze is voltooid met de uitgaande parameters.
De toepassing moet geheugen toewijzen voor in- en uitparameters met WsAlloc-. De serviceproxy moet deze mogelijk opnieuw toewijzen, zodat opgegeven aanwijzers worden overschreven. Een poging om dergelijk geheugen vrij te maken, zorgt ervoor dat de toepassing vastloopt.
Servicebewerking aan de clientzijde en 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;
Foutparameter
De toepassing moet altijd de foutparameter doorgeven aan:
- Krijg uitgebreide foutinformatie als er een fout optreedt tijdens de aanroep van de servicebewerking.
- Haal het foutobject op als de service een fout heeft geretourneerd. De fout bevindt zich in het foutobject. In dit geval is de HRESULT- waarde die wordt geretourneerd door de servicebewerking WS_E_ENDPOINT_FAULT_RECEIVED (zie Windows Web Services Return Values).
Oproepeigenschappen voor servicebewerkingen aan de clientzijde
Met aanroepeigenschappen kan een toepassing aangepaste instellingen voor een bepaalde aanroep opgeven. Op dit moment is er slechts één aanroepeigenschap beschikbaar voor het servicemodel, 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);
Een gesprek afbreken
Het is vaak wenselijk om de resultaten van een aanroep af te schaffen om het besturingselement terug te sturen naar de toepassing, zodat de werkelijke voltooiing van de aanroep wordt verwerkt door de infrastructuur. Serviceproxy biedt deze faciliteit via WsAbandonCall.
Houd er rekening mee dat het besturingselement voor de aanroeper mogelijk niet onmiddellijk wordt teruggegeven. De enige garantie dat de serviceproxyruntime geeft, is dat er niet wordt gewacht totdat een I/O-afhankelijke bewerking is voltooid voordat het besturingselement teruggeeft aan de beller.
Aanroepen op een servicebewerking aan de clientzijde kunnen worden afgetrokken door middel van een aanroep naar WsAbandonCall. Er wordt een serviceproxy en een aanroep-id gebruikt. Een oproep-id wordt gegeven als onderdeel van een oproepeigenschappen voor een servicebewerking.
Als de aanroep-id 0 is, zal de serviceproxy alle in behandeling zijnde aanroepen bij dat exemplaar afbreken.
Time-outs voor bijschriften
Standaard heeft een serviceproxy een time-out van 30 seconden voor elke aanroep. De time-out voor een aanroep kan worden gewijzigd door WS_PROXY_PROPERTY_CALL_TIMEOUT serviceproxy-eigenschap bij het maken van een serviceproxy via WsCreateServiceProxy-.
Nadat een time-out is bereikt, wordt de oproep afgelaten.
Retourwaarden
Alle geslaagde HRESULT- waarden moeten als succes worden behandeld en alle foutwaarden moeten worden behandeld als fouten. Hier volgen enkele van de HRESULT- waarden die een toepassing kan verwachten:
- WS_S_ASYNC: Oproep wordt asynchroon voltooid.
- NOERROR: de oproep is voltooid.
- WS_E_OPERATION_ABANDONED: De oproep is afgenomen. Het foutobject bevat de reden voor verlaten.
- WS_E_INVALID_OPERATION: de serviceproxy heeft niet de juiste status om een aanroep uit te voeren. Controleer de status van de serviceproxy om de status van de serviceproxy te achterhalen.
Zie Windows Web Services Return Valuesvoor een volledige lijst met retourwaarden.
Codevoorbeelden
Zie het volgende voor codevoorbeelden: