Serverseitige Dienstvorgänge
In diesem Abschnitt werden dienstseitige Dienstvorgänge beschrieben.
Im Folgenden wird das Layout eines serverseitigen Dienstvorgangs angezeigt.
- const WS _ OPERATION CONTEXT _ context: * Der Vorgangskontext.
- Parameter für Dienstvorgänge: Parameter für den Dienstvorgang.
- const WS _ ASYNC _ CONTEXT * asyncContext: asynchroner Kontext zum asynchronen Ausführen der Dienstvorgänge.
- WS _ FEHLERfehler: * Umfangreiches Fehlerobjekt.
HRESULT CALLBACK Add(const WS_OPERATION_CONTEXT* context,
ULONG a, ULONG b, ULONG* result,
const WS_ASYNC_CONTEXT* asyncContext,
WS_ERROR* error)
{
*result = a +b;
return NOERROR;
}
Fehler- und Fehlerbehandlung
Die Serverseite sollte Fehler verwenden, um Fehlerbedingungen an den Client zu übermitteln. Dazu wird ein fehlerhaftes HRESULT zurückgegeben und der Fehler in das Fehlerobjekt eingebettet.
Wenn der Fehler nicht für das Fehlerobjekt festgelegt ist und ein Fehler-HRESULT zurückgegeben wird, versucht die Infrastruktur, einen Fehler an den Client zurückzugeben. Die Ebene der Details, die dem Client in einem solchen Fall offengelegt werden, wird durch die WS _ SERVICE PROPERTY _ FAULT _ _ DISCLOSURE-Diensteigenschaft auf dem Diensthostgesteuert.
Aufrufabschluss
Ein Aufruf eines synchronen serverseitigen Dienstvorgangs wird als abgeschlossen bezeichnet, wenn entweder die Steuerung an den Diensthost zurückgegeben wurde. Bei einem asynchronen Dienstvorgang gilt ein Aufruf als abgeschlossen, sobald die Rückrufbenachrichtigung von der Implementierung des Dienstvorgangs ausgegeben wird.
Aufruflebensdauer
Bei der Implementierung eines serverseitigen Dienstvorgangs sollte hinsichtlich seiner Lebensdauer besondere Vorsicht walten lassen. Die Lebensdauer eines Aufrufs kann sich erheblich darauf auswirken, wie lange das Herunterfahren des Diensthosts dauert.
Wenn ein serverseitiger Dienstvorgang aufgrund eines E/A-gebundenen Vorgangs blockiert werden soll, wird empfohlen, einen Abbruchrückruf so zu registrieren, dass er benachrichtigt wird, wenn der Diensthost abgebrochen wird oder wenn die zugrunde liegende Verbindung vom Client geschlossen wird.
Serverseitige Dienstvorgänge und Arbeitsspeicherüberlegungen
Wenn ein Dienstvorgang Arbeitsspeicher für seine ausgehenden Parameter zuordnen muss, sollte er das WS _ HEAP-Objekt verwenden, das ihm über den _ WS-VORGANGSKONTEXT _ zur Verfügung steht.
Beispiel: Dienstvorgang und WS _ HEAP
HRESULT CALLBACK ProcessOrder (const WS_OPERATION_CONTEXT* context, const ULONG orderNumber, OrderReceipt** orderReceipt, const WS_ASYNC_CONTEXT* asyncContext, WS_ERROR* error)
{
WS_HEAP* heap;
HRESULT hr = WsGetOperationContextProperty (context, WS_OPERATION_CONTEXT_PROPERTY_HEAP, &heap, sizeof(heap), NULL, error);
if (FAILED(hr))
return hr;
hr = WsAlloc(heap, sizeof (OrderReceipt), orderReceipt, error);
if (FAILED(hr))
return hr;
hr = FillInReceipt(*orderReceipt);
if (FAILED(hr))
return hr;
return NOERROR;
}
Rückgabewerte
- WS _ S _ ASYNC: Der Aufruf wird asynchron abgeschlossen.
- WS S END: Der Aufruf wurde erfolgreich abgeschlossen. Der Server erwartet über _ diesen Aufruf hinaus keine _ WS _ MESSAGE vom Client. Wenn eine weitere _ WS-NACHRICHT eingeht, sollte der Server den Kanal abbrechen.
- NOERROR/Alle anderen erfolgreichen HRESULTS: Der Aufruf wurde erfolgreich abgeschlossen. Beachten Sie, dass es empfohlen wird, dass die Anwendung nicht HRESULT other als NOERROR zurückgibt, um den Dienstvorgang erfolgreich abschließen zu können.
- Alles mit einem Fehler HRESULT: Ein Fehler wird zurück an den Client gesendet, wenn ein Fehler in WS ERROR verfügbar _ ist. Andernfalls wird ein generischer Fehler zurück an den Client gesendet. Weitere Informationen finden Sie weiter oben in der Fehlerübersprache.
Weitere Informationen finden Sie unter Aufrufabbruch.