Ügyféloldali szolgáltatásműveletek
Az ügyféloldali szolgáltatásművelet elrendezése a következő:
- WS_SERVICE_PROXY* serviceProxy: A szolgáltatásproxy a híváshoz.
- WS_HEAP* halom: A WS_MESSAGEtestszerializálásához és deszerializálásához szükséges halom.
- Szolgáltatásműveleti paraméterek: A szolgáltatásművelethez kapcsolódó paraméterek.
- Hívás tulajdonságai és száma: Hívástulajdonságok tömbje.
- Hívás tulajdonságszáma: A hívástulajdonságok száma.
- WS_ASYNC_CONTEXT asyncContext: Aszinkron környezet a hívás aszinkron végrehajtásához.
- WS_ERROR hiba: Rich error object.
Ügyféloldali szolgáltatásműveletek aláírása
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);
Az ügyféloldali szolgáltatásműveletek memóriahasználati szempontjai
A szolgáltatásművelet hívása egy WS_HEAP* paramétert vesz igénybe. Ez az üzenettörzsek paraméterekhez való szerializálásához/deszerializálásához szükséges paraméter.
Az alkalmazásnak meg kell hívnia WsResetHeap, hogy a hívás sikeres volt-e. Ha a hívás sikeres volt, és kimenő paraméterekkel rendelkezik, az alkalmazásnak közvetlenül azután kell meghívnia WsResetHeap, hogy a kimenő paraméterekkel végzett.
Az alkalmazásnak memóriát kell lefoglalnia a WsAllocparaméterhez. Előfordulhat, hogy a szolgáltatásproxynak újra kell helyeznie őket, hogy a megadott mutatók felülírva legyenek. Az ilyen memória felszabadítására tett kísérlet miatt az alkalmazás összeomlik.
Ügyféloldali szolgáltatásművelet és 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;
Hibaparaméter
Az alkalmazásnak mindig át kell adnia a hibaparamétert a következőnek:
- Részletes hibainformációk lekérése, ha hiba történik a szolgáltatásműveleti hívás során.
- Kérje le a hibaobjektumot, ha a szolgáltatás hibát adott vissza. A hiba a hibaobjektumban található. Ebben az esetben a szolgáltatásműveletből visszaadott HRESULT érték WS_E_ENDPOINT_FAULT_RECEIVED (lásd Windows Web Services Visszatérési értékek).
Ügyféloldali szolgáltatásműveletek hívási tulajdonságai
A hívás tulajdonságai lehetővé teszik, hogy az alkalmazások egyéni beállításokat adjanak meg egy adott híváshoz. Jelenleg csak egy hívástulajdonság érhető el a szolgáltatásmodellben, 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);
Hívás megszakítása
Gyakran kívánatos a hívás eredményeinek elhagyása annak érdekében, hogy a vezérlőt vissza lehessen adni az alkalmazásnak, hogy a tényleges hívásvégzítést az infrastruktúra kezelje. A szolgáltatásproxy ezt a létesítményt WsAbandonCallkeresztül biztosítja.
Vegye figyelembe, hogy előfordulhat, hogy a hívó vezérlőjét nem adja vissza azonnal, az egyetlen garancia, hogy a szolgáltatásproxy-futtatókörnyezet biztosítja, hogy nem várja meg, amíg egy I/O-hez kötött művelet befejeződik, mielőtt visszaadhatja az irányítást a hívónak.
A WsAbandonCallhívásával megszakítható az ügyféloldali szolgáltatásművelet hívása. Szolgáltatásproxyt és hívásazonosítót igényel. A hívásazonosító egy szolgáltatásművelet hívástulajdonságainak részeként van megadva.
Ha a hívásazonosító 0, akkor a szolgáltatásproxy az adott példány összes függőben lévő hívását megszakítja.
Hívás időtúllépései
Alapértelmezés szerint egy szolgáltatásproxy 30 másodperces időtúllépést biztosít minden híváshoz. A hívás időtúllépését módosíthatja WS_PROXY_PROPERTY_CALL_TIMEOUT szolgáltatásproxy tulajdonság, amikor szolgáltatásproxyt hoz létre WsCreateServiceProxy.
Az időtúllépés elérése után a hívás el lesz hagyva.
Értékek visszaadva
Minden sikeres HRESULT értéket sikerként kell kezelni, és minden hibaértéket hibaként kell kezelni. Az alábbiakban néhányat a HRESULT értékek közül, amelyekre az alkalmazás számíthat:
- WS_S_ASYNC: A hívás aszinkron módon fejeződik be.
- NOERROR: A hívás sikeresen befejeződött.
- WS_E_OPERATION_ABANDONED: A hívás megszakadt. A hibaobjektum tartalmazza a megszakítás okát.
- WS_E_INVALID_OPERATION: A szolgáltatásproxy nincs megfelelő állapotban a híváshoz, ellenőrizze a szolgáltatásproxy állapotát a szolgáltatásproxy állapotának megállapításához.
A visszatérési értékek teljes listáját a Windows Web Services Visszatérési értékekcímű témakörben találja.
Példakódok
Példakódokért tekintse meg a következőket: