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.