Operações de serviço do lado do servidor

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

Veja a seguir o layout de uma operação de serviço do lado do servidor

  • contexto const WS_OPERATION_CONTEXT*: o contexto da operação.
  • Parâmetros de operações de serviço: parâmetros relativos à 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.
  • erro WS_ERROR*: objeto rich error.
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 fornecer condições de erro ao cliente. Ele pode fazer isso retornando um HRESULT com falha e inserindo a falha no objeto de erro.

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

Conclusão de chamada

Uma chamada em uma operação de serviço síncrona do lado do servidor é considerada concluída quando um dos dois retorna o controle de volta para o host de serviço. Para uma operação de serviço assíncrona, uma chamada é considerada concluída depois que a notificação de retorno de chamada é emitida pela implementação da operação de serviço.

Tempo de vida de chamada

Cuidados especiais devem ser tomados ao implementar uma operação de serviço do lado do servidor sobre seu tempo de vida. O tempo de vida de uma chamada pode afetar muito quanto tempo o host de serviço leva para ser desligado.

Se espera-se que uma operação de serviço do lado do servidor seja bloqueada devido a alguma operação associada a E/S, é recomendável que ela registre um retorno de chamada de cancelamento de modo que seja notificado se o host de serviço estiver sendo anulado ou quando a conexão subjacente for fechada pelo cliente.

Consideração de memória e operações de serviço do lado do servidor

Se uma operação de serviço precisar alocar memória para seus parâmetros de saída, ela deverá usar WS_HEAP objeto disponível para ele por meio 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 como assíncrona.
  • WS_S_END: Chamada concluída com êxito, o servidor não espera nenhum WS_MESSAGE do cliente além dessa chamada. Se outro WS_MESSAGE entrar, o servidor deverá anular o canal.
  • NOERROR/Todos os outros HRESULTS de sucesso: chamada concluída com êxito. Observe que é recomendável que o aplicativo não retorne HRESULT outro NOERROR para conclusão bem-sucedida da operação de serviço.
  • Tudo com um HRESULT de falha: uma falha será enviada de volta para o cliente se estiver disponível no WS_ERROR. Caso contrário, uma falha genérica é enviada de volta para o cliente. Veja a discussão de falhas acima.

Veja o cancelamento da chamada.