Clientseitige Dienstvorgänge

Im Folgenden wird das Layout eines clientseitigen Dienstvorgangs angezeigt:

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: