Condividi tramite


Operazioni sul lato server

In questa sezione vengono descritte le operazioni del servizio sul lato servizio.

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

  • contesto di 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 rtf.
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 gli errori per recapitare le condizioni di errore al client. Questa operazione può essere eseguita restituendo un HRESULT non riuscito e incorporando l'errore nell'oggetto errore.

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

Completamento chiamata

Una chiamata a un'operazione del servizio lato server sincrono viene considerata completata quando uno dei due controlli è tornato all'host del servizio. Per un'operazione asincrona del servizio, una chiamata viene considerata completa dopo l'emissione della notifica di callback dall'implementazione dell'operazione del servizio.

Durata delle chiamate

Prestare particolare attenzione quando si implementa un'operazione sul lato server relativa alla durata. La durata di una chiamata può influire notevolmente sul tempo necessario per l'arresto dell'host del servizio.

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

Considerazioni sulla memoria e le operazioni sul lato server

Se un'operazione del servizio deve allocare memoria per i parametri in uscita, deve usare WS_HEAP oggetto disponibile tramite il 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 arriva un altro WS_MESSAGE, il server deve interrompere il canale.
  • NOERROR/Tutte le altre operazioni HRESULTS riuscite: chiamata completata correttamente. Si noti che è consigliabile che l'applicazione non restituisca HRESULT diverso da NOERROR per il completamento dell'operazione del servizio.
  • Tutto ciò che presenta un errore HRESULT: un errore viene restituito al client, se disponibile in WS_ERROR. In caso contrario, viene restituito un errore generico al client. Vedere la discussione sugli errori riportata sopra.

Vedere Annullamento delle chiamate.