Teilen über


Clientseitige Dienstvorgänge

Im Folgenden sehen Sie das Layout eines clientseitigen Dienstvorgangs:

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 akzeptiert eine WS_HEAP* als Parameter. Dies ist ein erforderlicher Parameter, der für die Serialisierung/Deserialisierung von Nachrichtentexten zu Parametern verwendet wird.

Die Anwendung muss WsResetHeap- aufrufen, ob der Aufruf erfolgreich war oder nicht. Wenn der Aufruf erfolgreich war und ausgehende Parameter enthält, sollte die Anwendung WsResetHeap- unmittelbar nach Abschluss der Ausgehenden Parameter aufrufen.

Die Anwendung sollte Speicher für Ein- und Ausgabeparameter mit WsAlloc-zuweisen. Der Dienstproxy muss diese möglicherweise neu zuordnen, sodass bereitgestellte Zeiger überschrieben werden. Ein Versuch, diesen 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;

Fehlerparameter

Die Anwendung sollte immer den Fehlerparameter an Folgendes übergeben:

  • Erhalten Sie umfassende Fehlerinformationen, wenn während des Dienstvorgangsaufrufs ein Fehler auftritt.
  • Ruft das Fehlerobjekt ab, wenn der Dienst einen Fehler zurückgegeben hat. Der Fehler ist im Fehlerobjekt enthalten. In diesem Fall wird der HRESULT- Wert, der vom Dienstvorgang zurückgegeben wird, WS_E_ENDPOINT_FAULT_RECEIVED (siehe Rückgabewerte für Windows-Webdienste).

Aufrufen von Eigenschaften für clientseitige Dienstvorgänge

Mithilfe von Aufrufeigenschaften kann eine Anwendung benutzerdefinierte Einstellungen für einen bestimmten Aufruf angeben. Derzeit ist nur eine Aufrufeigenschaft mit dem Dienstmodell WS_CALL_PROPERTY_CALL_IDverfügbar.

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);

Beenden eines Anrufs

Es ist oft wünschenswert, die Ergebnisse eines Aufrufs aufzugeben, um das Steuerelement wieder an die Anwendung zurückzugeben, sodass der tatsächliche Aufrufabschluss von der Infrastruktur verarbeitet wird. Der Dienstproxy stellt diese Einrichtung über WsAbandonCallbereit.

Beachten Sie, dass das Steuerelement an den Aufrufer möglicherweise nicht sofort zurückgegeben wird. Die einzige Garantie, dass die Dienstproxy-Laufzeit gibt, besteht darin, dass sie nicht warten würde, bis ein E/A-gebundener Vorgang abgeschlossen ist, bevor sie die Steuerung an den Aufrufer zurückgibt.

Aufrufe eines clientseitigen Dienstvorgangs können über einen Aufruf von WsAbandonCallabgebrochen werden. Er verwendet einen Dienstproxy und eine Anruf-ID. Eine Anruf-ID wird als Teil einer Aufrufeigenschaften für einen Dienstvorgang angegeben.

Wenn die Anruf-ID 0 ist, beendet der Dienstproxy alle ausstehenden Aufrufe an dieser Instanz.

Anruftimeouts

Standardmäßig verfügt ein Dienstproxy für jeden Anruf über ein Timeout von 30 Sekunden. Das Timeout für einen Aufruf kann durch WS_PROXY_PROPERTY_CALL_TIMEOUT Dienstproxyeigenschaft geändert werden, wenn ein Dienstproxy über WsCreateServiceProxyerstellt wird.

Nachdem ein Timeout erreicht wurde, wird der Anruf abgebrochen.

Rückgabewerte

Alle Erfolg HRESULT- Werte müssen als Erfolg 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 Anruf wurde erfolgreich abgeschlossen.
  • WS_E_OPERATION_ABANDONED: Der Anruf wurde abgebrochen. Das Fehlerobjekt enthält den Grund für das Verlassen.
  • WS_E_INVALID_OPERATION: Der Dienstproxy befindet sich nicht in einem geeigneten Zustand, um einen Aufruf durchzuführen, überprüfen Sie den Dienstproxystatus, um den Status des Dienstproxys zu ermitteln.

Eine vollständige Liste der Rückgabewerte finden Sie unter Rückgabewerte für Windows-Webdienste.

Codebeispiele

Codebeispiele finden Sie in den folgenden Themen: