Operazioni sul lato server

Questa sezione descrive le operazioni sul lato servizio.

Di seguito è riportato il layout di un'operazione sul lato server

  • contesto const WS_OPERATION_CONTEXT* : contesto dell'operazione.
  • Parametri delle operazioni del servizio: parametri relativi all'operazione del servizio.
  • const WS_ASYNC_CONTEXT* asyncContext: contesto asincrono per l'esecuzione asincrona delle operazioni del servizio.
  • WS_ERROR* errore: oggetto errore avanzato.
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;
}

Gestione degli errori e degli errori

Il lato server deve usare errori per recapitare le condizioni di errore al client. Può farlo restituiscendo un errore HRESULT e incorporando l'errore nell'oggetto error.

Se l'errore non è impostato sull'oggetto errore e viene restituito un errore HRESULT, l'infrastruttura tenterà di restituire un errore al client. Il livello di dettagli divulgati al client in questo caso è controllato dalla proprietà del servizio WS_SERVICE_PROPERTY_FAULT_DISCLOSUREnell'host del servizio.

Completamento chiamata

Una chiamata a un'operazione del servizio lato server sincrono viene detto essere completata quando entrambi hanno restituito il controllo all'host del servizio. Per un'operazione di servizio asincrona una chiamata viene considerata completata dopo l'emissione della notifica di callback dall'implementazione dell'operazione di servizio.

Durata delle chiamate

Prestare particolare attenzione quando si implementa un'operazione sul lato server sulla durata. La durata di una chiamata può influire notevolmente sulla durata dell'arresto dell'host del servizio.

Se si prevede che un'operazione sul lato server blocchi a causa di un'operazione associata a I/O, è consigliabile registrare un callback di annullamento in modo che venga notificata se l'host del servizio viene interrotto o quando la connessione sottostante viene chiusa dal client.

Operazioni sul lato server e considerazioni sulla memoria

Se un'operazione del servizio deve allocare memoria per i parametri in uscita, deve usare WS_HEAP oggetto disponibile per il servizio tramite l'WS_OPERATION_CONTEXT.

Esempio: Operazione del servizio e 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;
} 

Valori restituiti

  • WS_S_ASYNC: la chiamata verrà completata asincrona.
  • WS_S_END: la chiamata è stata completata correttamente, il server non prevede alcuna WS_MESSAGE dal client oltre questa chiamata. Se viene fornito un altro WS_MESSAGE, il server dovrebbe interrompere il canale.
  • NOERROR/Tutte le altre risorse HRESULTS riuscite: chiamata completata correttamente. Si noti che è consigliabile che l'applicazione non restituisca HRESULT, quindi NOERROR per il completamento dell'operazione di servizio.
  • Tutto con un errore HRESULT: un errore viene restituito al client se disponibile in WS_ERROR. In caso contrario, un errore generico viene inviato al client. Vedere la discussione sull'errore precedente.

Vedere l'annullamento delle chiamate.