Operaciones de servicio del lado cliente
A continuación se muestra el diseño de una operación de servicio del lado cliente:
- WS_SERVICE_PROXY* serviceProxy: proxy de servicio para la llamada.
- WS_HEAP* montón* : un montón necesario usado para la serialización y deserialización del cuerpo del WS_MESSAGE.
- Parámetros de operaciones de servicio: parámetros relacionados con la operación de servicio.
- Propiedades de llamada y su recuento: matriz de propiedades de llamada.
- Recuento de propiedades de llamada: recuento de propiedades de llamada.
- WS_ASYNC_CONTEXT asyncContext: contexto asincrónico para ejecutar la llamada de forma asincrónica.
- WS_ERROR error: objeto de error enriquecido.
Firma para las operaciones de servicio del lado cliente
typedef HRESULT(CALLBACK *ICalculator_Add)(WS_SERVICE_PROXY* serviceProxy,
WS_HEAP* heap,
ULONG a, ULONG b, ULONG* result,
const WS_CALL_PROPERTY* callProperties,
const ULONG callPropertyCount,
const WS_ASYNC_CONTEXT* asyncContext,
WS_ERROR* error);
Consideraciones de memoria para las operaciones de servicio del lado cliente
La llamada a la operación de servicio toma un WS_HEAP* como parámetro. Se trata de un parámetro necesario que se usa para la serialización o deserialización de cuerpos de mensaje en parámetros.
La aplicación debe llamar a WsResetHeap si la llamada se realizó correctamente o no. Si la llamada se realizó correctamente y tiene parámetros salientes, la aplicación debe llamar a WsResetHeap inmediatamente después de finalizar con los parámetros salientes.
La aplicación debe asignar memoria para los parámetros dentro y fuera con WsAlloc. Es posible que el proxy de servicio tenga que reasignarlos, por lo que se sobrescribirán los punteros proporcionados. Un intento de liberar dicha memoria hará que la aplicación se bloquee.
Operación y WS_HEAP de servicio del lado cliente
HRESULT hr = IProcessOrder_ProcessOrder(serviceProxy, heap, orderNumber, &orderReceipt, NULL, 0, NULL, error);
if(FAILED(hr))
goto error;
hr = ProcessReceipt(orderReceipt);
WsResetHeap(heap);
if(FAILED(hr))
goto error;
hr = IProcessOrder_CompleteOrder(serviceProxy, heap, orderNumber, &orderMemo, NULL, 0, NULL, error);
if(FAILED(hr))
goto error;
hr = ProcessMemo(orderMemo);
WsResetHeap(heap);
if(FAILED(hr))
goto error;
Parámetro de error
La aplicación siempre debe pasar el parámetro de error a:
- Obtenga información de error enriquecida si se produce un error durante la llamada a la operación de servicio.
- Obtenga el objeto de error si el servicio devolvió un error. El error está incluido en el objeto de error. En este caso, el valor HRESULT devuelto de la operación de servicio es WS_E_ENDPOINT_FAULT_RECEIVED (consulte Valores devueltos de servicios web de Windows).
Propiedades de llamada para las operaciones de servicio del lado cliente
Las propiedades de llamada permiten a una aplicación especificar la configuración personalizada para una llamada determinada. Actualmente, solo hay disponible una propiedad de llamada con el modelo de servicio, WS_CALL_PROPERTY_CALL_ID.
WS_CALL_PROPERTY callProperties[1] = {0};
callProperties[0].id = WS_CALL_PROPERTY_CALL_ID;
callProperties[0].value = 5;
HRESULT hr = IProcessOrder_ProcessOrder(serviceProxy, heap, orderNumber, &orderReceipt, callProperties, WsCountOf(callProperties), NULL, error);
if(FAILED(hr))
goto error;
//:
//:
hr = IProcessOrder_CompleteOrder(serviceProxy, heap, orderNumber, &orderReceipt, callProperties, WsCountOf(callProperties), NULL, error);
if(FAILED(hr))
goto error;
//:
//:
//:
// On a separate thread
// In this case both the calls belong to call group 5, and will abandon as a result of the call to WsAbandonCall.
hr = WsAbandonCall(serviceProxy, 5, error);
Abandonar una llamada
A menudo, es conveniente abandonar los resultados de una llamada con el fin de devolver el control a la aplicación, de modo que la infraestructura controla la finalización real de la llamada. El proxy de servicio proporciona esta instalación a través de WsAbandonCall.
Tenga en cuenta que es posible que el control al autor de la llamada no se devuelva inmediatamente, la única garantía de que el tiempo de ejecución del proxy de servicio proporciona es que no esperaría a que se complete ninguna operación enlazada de E/S antes de devolver el control al autor de la llamada.
Las llamadas en una operación de servicio del lado cliente se pueden abandonar mediante una llamada a WsAbandonCall. Toma un proxy de servicio y un identificador de llamada. Se asigna un identificador de llamada como parte de las propiedades de una llamada en una operación de servicio.
Si el identificador de llamada es 0, el proxy de servicio abandonará todas las llamadas pendientes en esa instancia.
Tiempos de espera de llamadas
De forma predeterminada, un proxy de servicio tiene un tiempo de espera de 30 segundos para cada llamada. El tiempo de espera de una llamada se puede cambiar mediante WS_PROXY_PROPERTY_CALL_TIMEOUT propiedad de proxy de servicio al crear un proxy de servicio a través de WsCreateServiceProxy.
Una vez alcanzado un tiempo de espera, se abandona la llamada.
Valores devueltos
Todos los valores HRESULT correctos deben tratarse como correctos y todos los valores de error deben tratarse como errores. A continuación se muestran algunos de los valores HRESULT que puede esperar una aplicación:
- WS_S_ASYNC: la llamada se completará de forma asincrónica.
- NOERROR: la llamada se completó correctamente.
- WS_E_OPERATION_ABANDONED: se ha abandonado la llamada. El objeto de error contiene el motivo del abandono.
- WS_E_INVALID_OPERATION: el proxy de servicio no está en un estado adecuado para realizar una llamada, compruebe el estado del proxy de servicio para averiguar el estado del proxy de servicio.
Para obtener una lista completa de los valores devueltos, vea Valores devueltos de servicios web de Windows.
Ejemplos de código
Para obtener ejemplos de código, consulte lo siguiente: