Clientseitige Dienstvorgänge
Im Folgenden sehen Sie das Layout eines clientseitigen Dienstvorgangs:
- WS_SERVICE_PROXY* serviceProxy: Der Dienstproxy für den Anruf.
- WS_HEAP* Heap: Ein erforderlicher Heap, der für die Serialisierung des Texts und die Deserialisierung der WS_MESSAGEverwendet wird.
- Parameter für Dienstvorgänge: Parameter, die sich auf den Dienstvorgang beziehen.
- Anrufeigenschaften und deren Anzahl: Ein Array von Aufrufeigenschaften.
- Anzahl der Aufrufe Eigenschaft: Die Anzahl der Aufrufeigenschaften.
- WS_ASYNC_CONTEXT asyncContext: Async-Kontext für die asynchrone Ausführung des Aufrufs.
- WS_ERROR Fehler: Rich Error-Objekt.
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: