Serverseitige Dienstvorgänge

In diesem Abschnitt werden dienstseitige Dienstvorgänge beschrieben.

Im Folgenden wird das Layout eines serverseitigen Dienstvorgangs angezeigt.

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.