客户端服务作

下面是客户端服务作的布局:

客户端服务作的签名

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;

错误参数

应用程序应始终将错误参数传递给:

  • 如果在服务作调用期间发生故障,则获取丰富的错误信息。
  • 如果服务返回故障,则获取错误对象。 该错误包含在错误对象中。 在这种情况下,从服务作返回的 HRESULTWS_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 返回值

代码示例

有关代码示例,请参阅以下内容: