Serverseitige Dienstvorgänge
In diesem Abschnitt werden dienstseitige Dienstvorgänge beschrieben.
Im Folgenden sehen Sie das Layout eines serverseitigen Dienstvorgangs.
- const WS_OPERATION_CONTEXT* context: Der Kontext des Vorgangs.
- Parameter für Dienstvorgänge: Parameter im Zusammenhang mit dem Dienstvorgang.
- const WS_ASYNC_CONTEXT* asyncContext: Asynchroner Kontext für die asynchrone Ausführung der Dienstvorgänge.
- Fehler WS_ERROR*: 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;
}
Fehlerbehandlung
Die Serverseite sollte Fehler verwenden, um Fehlerbedingungen für den Client bereitzustellen. Dazu kann ein HRESULT mit einem Fehlerwert zurückgeben und der Fehler in das Fehlerobjekt eingebettet werden.
Wenn der Fehler nicht für das Fehlerobjekt festgelegt ist und ein HRESULT mit Fehlerwert zurückgegeben wird, versucht die Infrastruktur, einen Fehler zurück an den Client zu übermitteln. Die Details, die für den Client in einem solchen Fall offengelegt werden, wird durch die Diensteigenschaft WS_SERVICE_PROPERTY_FAULT_DISCLOSURE auf dem Diensthost gesteuert.
Aufrufabschluss
Ein Aufruf eines synchronen serverseitigen Dienstvorgangs wird als abgeschlossen bezeichnet, wenn die Steuerung wieder an den Diensthost zurückgegeben wurde. Bei einem asynchronen Dienstvorgang gilt ein Aufruf als abgeschlossen, sobald die Rückrufbenachrichtigung von der Dienstvorgangsimplementierung ausgegeben wird.
Aufruflebensdauer
Bei der Implementierung eines serverseitigen Diensts sollte besonders auf dessen Lebensdauer geachtet werden. Die Lebensdauer eines Aufrufs kann sich erheblich darauf auswirken, wie lange der Diensthost zum Herunterfahren benötigt.
Wenn die Blockierung eines serverseitigen Dienstvorgangs aufgrund eines E/A-gebundenen Vorgangs erwartet wird, wird empfohlen, einen Abbruchrückruf zu registrieren, sodass er benachrichtigt wird, wenn der Diensthost abgebrochen wird oder wenn die zugrunde liegende Verbindung vom Client geschlossen wird.
Serverseitige Dienstvorgänge und Überlegungen zum Arbeitsspeicher
Wenn ein Dienstvorgang Speicher für die ausgehenden Parameter zuweisen muss, sollte er das Objekt WS_HEAP verwenden, das ihm über WS_OPERATION_CONTEXT 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, und der Server erwartet über diesen Aufruf hinaus keine WS_MESSAGE-Objekte. Wenn ein anderes WS_MESSAGE-Objekt eingeht, sollte der Server den Kanal abbrechen.
- NOERROR/Alle anderen Erfolgs-HRESULTs: Der Aufruf wurde erfolgreich abgeschlossen. Hinweis: Es wird empfohlen, dass die Anwendung bei erfolgreichem Abschluss des Dienstvorgangs keinen anderen HRESULT-Wert zurückgibt als NOERROR.
- Alles mit einem HRESULT mit einem Fehler: Ein Fehler wird an den Client zurück gesendet, wenn einer in WS_ERROR verfügbar ist. Andernfalls wird ein generischer Fehler zurück an den Client gesendet. Siehe Erläuterung zu Fehlern weiter oben.
Siehe Aufrufabbruch.