服务器端服务操作

本部分介绍服务端服务操作。

以下是服务器端服务操作的布局

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;
}

错误处理

服务器端应使用错误将错误条件传递到客户端。 它可以通过返回失败的 HRESULT 并在错误对象中嵌入错误来执行此操作。

如果未在错误对象上设置错误并返回失败 HRESULT,则基础结构将尝试将错误传递回客户端。 在这种情况下,向客户端披露的详细信息级别由服务主机上的 WS_SERVICE_PROPERTY_FAULT_DISCLOSURE 服务属性控制。

调用完成

当同步服务器端服务操作将控制返回给服务主机时,将完成对同步服务器端服务操作的调用。 对于异步服务操作,服务操作实现发出回调通知后,调用即被视为完成。

调用生存期

在实现服务器端服务操作时,应特别注意其生存期。 调用的生存期可能会极大地影响服务主机关闭所需的时间。

如果服务器端服务操作预期由于某些 IO 绑定操作而阻止,则建议注册一个取消回调,以便当服务主机中止或客户端关闭基础连接时进行通知。

服务器端服务操作和内存注意事项

如果服务操作需要为其传出参数分配内存,则应使用 WS_HEAP 对象通过 WS_OPERATION_CONTEXT 进行分配。

示例:服务操作和 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;
} 

返回值

  • WS_S_ASYNC:调用将异步完成。
  • WS_S_END:调用已成功完成,服务器不需要来自客户端的任何超出此调用的 WS_MESSAGE。 如果另一个 WS_MESSAGE 传入,则服务器应中止通道。
  • NOERROR/所有其他成功 HRESULTS:调用成功完成。 请注意,建议应用程序不应返回除 NOERROR 以外的 HRESULT,以便成功完成服务操作。
  • 出现失败 HRESULT 的所有内容:如果 WS_ERROR 中有一个错误,则会将错误发送回客户端。 否则,将向客户端发送回一般错误。 请参阅上面的错误讨论。

请参阅调用取消