Operaciones de servicio del lado del servidor
En esta sección se describen las operaciones de servicio del lado del servidor.
A continuación se muestra el diseño de una operación de servicio del lado del servidor.
- const WS_OPERATION_CONTEXT* context: el contexto de la operación.
- Parámetros de operaciones de servicio: parámetros relacionados con la operación de servicio.
- const WS_ASYNC_CONTEXT* asyncContext: contexto asincrónico para ejecutar las operaciones de servicio de forma asincrónica.
- WS_ERROR* error: objeto de error enriquecido.
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;
}
Control de errores
El lado del servidor debe usar errores para entregar condiciones de error al cliente. Puede hacerlo devolviendo un HRESULT con error e insertando el error en el objeto de error.
Si el error no se establece en el objeto de error y se devuelve un error HRESULT, la infraestructura intentará devolver un error al cliente. El nivel de detalles revelados al cliente en tal caso se controla mediante la propiedad de servicio WS_SERVICE_PROPERTY_FAULT_DISCLOSURE en el host de servicio.
Finalización de llamadas
Se dice que una llamada en una operación de servicio del lado del servidor sincrónica se ha completado cuando se ha devuelto el control al host del servicio. Para una operación de servicio asincrónica, una llamada se considera completada una vez que la implementación de la operación de servicio emite la notificación de devolución de llamada.
Duración de la llamada
Se debe tener especial cuidado al implementar una operación de servicio del lado del servidor sobre su duración. La duración de una llamada puede afectar en gran medida al tiempo que tarda en apagarse el host de servicio.
Si se espera que una operación de servicio del lado del servidor se bloquee debido a alguna operación enlazada a E/S, se recomienda registrar una devolución de llamada de cancelación de forma que se notifique si se anula el host de servicio o cuando el cliente cierra la conexión subyacente.
Consideración de memoria y operaciones de servicio del lado del servidor
Si una operación de servicio necesita asignar memoria para sus parámetros salientes, debe usar el objeto WS_HEAP disponible a través de WS_OPERATION_CONTEXT.
Ejemplo: Operación de servicio y 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 devueltos
- WS_S_ASYNC: La llamada se completará de forma asincrónica.
- WS_S_END: La llamada se completó correctamente, el servidor no espera ningún WS_MESSAGE del cliente más allá de esta llamada. Si se incluye otro WS_MESSAGE, el servidor debe anular el canal.
- NOERROR/Todos los demás HRESULTS correctos: La llamada se completó correctamente. Tenga en cuenta que se recomienda que la aplicación no devuelva un HRESULT que no sea NOERROR para completar correctamente la operación del servicio.
- Todo con un error HRESULT: Se devuelve un error al cliente si hay uno disponible en WS_ERROR. De lo contrario, se devuelve un error genérico al cliente. Consulte la explicación de errores anterior.
Consulte Cancelación de llamadas.