下面是客户端服务作的布局:
- WS_SERVICE_PROXY* serviceProxy:调用 服务代理。
- WS_HEAP* 堆:用于正文序列化和反序列化 WS_MESSAGE所需的堆。
- 服务作参数:与服务作相关的参数。
- 调用属性及其计数:调用属性数组。
- 调用 属性计数:调用属性计数。
- WS_ASYNC_CONTEXT asyncContext:异步执行调用的异步上下文。
- WS_ERROR 错误:丰富的错误对象。
客户端服务作的签名
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);
客户端服务作的内存注意事项
对服务作的调用采用 WS_HEAP* 作为参数。 这是一个必需的参数,用于将消息正文序列化/反序列化为参数。
应用程序必须调用 WsResetHeap 调用是否成功。 如果调用成功且具有传出参数,则应用程序应在使用传出参数完成后立即调用 WsResetHeap。
应用程序应使用 WsAlloc为传入和传出参数分配内存。 服务代理可能需要重新分配它们,以便覆盖提供的指针。 尝试释放此类内存将导致应用程序崩溃。
客户端服务作和WS_HEAP
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;
错误参数
应用程序应始终将错误参数传递给:
- 如果在服务作调用期间发生故障,则获取丰富的错误信息。
- 如果服务返回故障,则获取错误对象。 该错误包含在错误对象中。 在这种情况下,从服务作返回的 HRESULT 值 WS_E_ENDPOINT_FAULT_RECEIVED(请参阅 Windows Web Services 返回值)。
调用客户端服务作的属性
调用属性允许应用程序指定给定调用的自定义设置。 目前,服务模型仅提供一个调用属性,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);
放弃呼叫
通常需要放弃调用的结果,以便将控件放弃回应用程序,以便由基础结构处理实际调用完成。 服务代理通过 WsAbandonCall提供此设施。
请注意,对调用方的控制可能不会立即返回,唯一保证服务代理运行时提供的是,它不会等待任何 I/O 绑定作完成,然后再将控制权返回给调用方。
可以通过调用 WsAbandonCall来放弃客户端服务作上的调用。 它采用服务代理和调用 ID。调用 ID 作为服务作的调用属性的一部分提供。
如果调用 ID 为 0,则服务代理将放弃该实例上所有挂起的调用。
调用超时
默认情况下,服务代理对每次调用都有 30 秒的超时。 通过 WsCreateServiceProxy创建服务代理时,可以通过 WS_PROXY_PROPERTY_CALL_TIMEOUT 服务代理属性更改调用超时。
达到超时后,将放弃调用。
返回值
所有成功 HRESULT 值都必须被视为成功,并且所有失败值都必须被视为失败。 以下是应用程序的一些 HRESULT 值:
- WS_S_ASYNC:调用将以异步方式完成。
- NOERROR:调用成功完成。
- WS_E_OPERATION_ABANDONED:呼叫已被放弃。 错误对象包含放弃的原因。
- WS_E_INVALID_OPERATION:服务代理未处于适当的状态进行调用,请检查服务代理状态以找出服务代理的状态。
有关返回值的完整列表,请参阅 Windows Web Services 返回值。
代码示例
有关代码示例,请参阅以下内容: