Partilhar via


Operações de Serviço do Lado do Servidor

Essa seção descreve as operações de serviço do lado do serviço.

A seguir, o layout de uma operação de serviço do lado do servidor

  • const WS_OPERATION_CONTEXT* context: o contexto da operação.
  • Parâmetros de Operações de Serviço: parâmetros pertencentes à operação de serviço.
  • const WS_ASYNC_CONTEXT* asyncContext: contexto assíncrono para executar as operações de serviço de forma assíncrona.
  • WS_ERROR* error: objeto de erro avançado.
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;
}

Tratamento de Falhas e Erros

O lado do servidor deve usar falhas para entregar condições de erro ao cliente. É possível fazer isso retornando um HRESULT com falha e inserindo a falha no objeto de erro.

Se a falha não estiver definida como o objeto de erro e um HRESULT de falha for retornado, a infraestrutura tentará entregar uma falha de volta ao cliente. O nível de detalhes divulgados ao cliente nesse caso é controlado pela propriedade de serviço WS_SERVICE_PROPERTY_FAULT_DISCLOSURE no Host do Serviço.

Conclusão da Chamada

Diz-se que uma chamada em uma operação de serviço síncrona do lado do servidor está concluída quando o controle retorna de volta para o host de serviço. Para uma operação de serviço assíncrona, uma chamada é considerada concluída uma vez que a notificação de retorno da chamada é emitida por uma implementação da operação de serviço.

Tempo de Vida da Chamada

Deve-se tomar cuidado especial ao implementar uma operação de serviço do lado do servidor com relação ao seu tempo de vida. O tempo de vida de uma chamada pode afetar muito o tempo que o host de serviço leva para ser desligado.

Se for esperado que uma operação de serviço do lado do servidor seja bloqueada devido a alguma operação de E/S, recomenda-se que ela registre um retorno de chamada de cancelamento para que seja notificada se o host de serviço estiver sendo abortado ou quando a conexão subjacente for fechada pelo cliente.

Operações de serviço do lado do servidor e consideração de memória

Se uma operação de serviço precisar alocar memória para seus parâmetros de saída, ela deverá usar o objeto WS_HEAP disponível através do WS_OPERATION_CONTEXT.

Exemplo: Operação de Serviço 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;
} 

Valores de retorno

  • WS_S_ASYNC: a chamada será concluída de forma assíncrona.
  • WS_S_END: chamada concluída com êxito, o servidor não está esperando nenhuma WS_MESSAGE do cliente além dessa chamada. Se outra WS_MESSAGE for recebida, o servidor deverá anular o canal.
  • NOERROR/Todos os outros HRESULTS bem-sucedidos: chamada concluída com êxito. Observe que é recomendável que o aplicativo não retorne HRESULT diferente de NOERROR para a conclusão bem-sucedida da operação de serviço.
  • Tudo com falha HRESULT: uma falha é enviada de volta ao cliente se houver uma disponível em WS_ERROR. Caso contrário, uma falha genérica será enviada de volta para o cliente. Veja a discussão sobre falhas acima.

Consulte Cancelamento de chamada.