Clientseitige Dienstvorgänge
Im Folgenden wird das Layout eines clientseitigen Dienstvorgangs angezeigt:
- WS _ SERVICE _ PROXY * serviceProxy: Der Dienstproxy für den Aufruf.
- WS _ HEAP-Heap: * Ein erforderlicher Heap, der für die Serialisierung und Deserialisierung des Textkörpers der WS _ MESSAGEverwendet wird.
- Parameter für Dienstvorgänge: Parameter für den Dienstvorgang.
- Aufrufeigenschaften und deren Anzahl:Ein Array von Aufrufeigenschaften.
- Anzahl der Aufrufeigenschaften: Die Anzahl der Aufrufeigenschaften.
- WS _ ASYNC _ CONTEXT asyncContext: asynchroner Kontext zum asynchronen Ausführen des Aufrufs.
- WS _ FEHLERfehler: Umfangreiches Fehlerobjekt.
Signatur für clientseitige Dienstvorgänge
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);
Überlegungen zum Arbeitsspeicher für clientseitige Dienstvorgänge
Der Aufruf des Dienstvorgangs nimmt einen WS _ HEAP * als Parameter an. Dies ist ein erforderlicher Parameter, der für die Serialisierung/Deserialisierung von Nachrichtentexten in Parameter verwendet wird.
Die Anwendung muss WsResetHeap unabhängig davon aufrufen, ob der Aufruf erfolgreich war. Wenn der Aufruf erfolgreich war und ausgehende Parameter aufweist, sollte die Anwendung WsResetHeap sofort aufrufen, nachdem sie mit den ausgehenden Parametern fertig ist.
Die Anwendung sollte mit WsAllocArbeitsspeicher für ein- und ausgehende Parameter zuordnen. Der Dienstproxy muss sie möglicherweise neu zuordnen, damit bereitgestellte Zeiger überschrieben werden. Der Versuch, solchen Arbeitsspeicher freizugeben, führt dazu, dass die Anwendung abstürzt.
Clientseitiger Dienstvorgang und 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;
Error-Parameter
Die Anwendung sollte den Fehlerparameter immer an Folgendes übergeben:
- Rufen Sie umfassende Fehlerinformationen ab, wenn während des Dienstvorgangsaufrufs ein Fehler auftritt.
- Abrufen des Fehlerobjekts, wenn der Dienst einen Fehler zurückgegeben hat. Der Fehler ist im Fehlerobjekt enthalten. In diesem Fall lautet der vom Dienstvorgang zurückgegebene HRESULT-Wert WS _ E ENDPOINT FAULT _ _ _ RECEIVED (siehe Windows Webdienstrückgabewerte).
Aufrufeigenschaften für clientseitige Dienstvorgänge
Aufrufeigenschaften ermöglichen es einer Anwendung, benutzerdefinierte Einstellungen für einen bestimmten Aufruf anzugeben. Derzeit ist nur eine Aufrufeigenschaft mit dem Dienstmodell verfügbar, 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);
Verwerfen eines Aufrufs
Es ist häufig wünschenswert, die Ergebnisse eines Aufrufs zu verwerfen, um das Steuerelement an die Anwendung zurückzugeben, sodass die tatsächliche Anrufvervollständigung von der Infrastruktur verarbeitet wird. Der Dienstproxy stellt diese Funktion über WsAbproxynCall bereit.
Beachten Sie, dass das Steuerelement dem Aufrufer möglicherweise nicht sofort wieder zur Verfügung gestellt wird. Die einzige Garantie, die die Dienstproxylaufzeit bietet, besteht darin, dass nicht auf den Abschluss eines E/A-gebundenen Vorgangs gewartet wird, bevor die Steuerung an den Aufrufer zurückgibt.
Aufrufe für einen clientseitigen Dienstvorgang können durch einen Aufruf von WsAboanCallabgebrochen werden. Es werden ein Dienstproxy und eine Aufruf-ID verwendet. Eine Aufruf-ID wird als Teil einer Aufrufeigenschaften für einen Dienstvorgang angegeben.
Wenn die Aufruf-ID 0 ist, verbricht der Dienstproxy alle ausstehenden Aufrufe in dieser Instanz.
Aufruftimeouts
Standardmäßig weist ein Dienstproxy für jeden Aufruf ein Timeout von 30 Sekunden auf. Das Timeout für einen Aufruf kann durch die WS _ PROXY PROPERTY _ CALL _ _ TIMEOUT-Dienstproxyeigenschaft geändert werden, wenn ein Dienstproxy über WsCreateServiceProxyerstellt wird.
Nachdem ein Timeout erreicht wurde, wird der Aufruf abgebrochen.
Rückgabewerte
Alle Erfolgs-HRESULT-Werte müssen als erfolgreich behandelt werden, und alle Fehlerwerte müssen als Fehler behandelt werden. Im Folgenden finden Sie einige der HRESULT-Werte, die eine Anwendung erwarten kann:
- WS _ S _ ASYNC: Der Aufruf wird asynchron abgeschlossen.
- NOERROR: Der Aufruf wurde erfolgreich abgeschlossen.
- WS _ E _ OPERATION _ ABANDONED: Der Aufruf wurde abgebrochen. Das Error-Objekt enthält den Grund für den Abbruch.
- WS _ E _ UNGÜLTIGER _ VORGANG: Der Dienstproxy befindet sich nicht in einem geeigneten Zustand, um einen Aufruf auszuführen. Überprüfen Sie den Dienstproxystatus, um den Status des Dienstproxys zu finden.
Eine vollständige Liste der Rückgabewerte finden Sie unter Windows Webdienstrückgabewerte.
Codebeispiele
Codebeispiele finden Sie in den folgenden Themen: