服务器端服务操作
本部分介绍服务端服务操作。
以下是服务器端服务操作的布局
- const WS_OPERATION_CONTEXT* 上下文:操作上下文。
- 服务操作参数:与服务操作相关的参数。
- const WS_ASYNC_CONTEXT* asyncContext:异步执行服务操作的异步上下文。
- WS_ERROR* 错误:丰富错误对象。
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 中有一个错误,则会将错误发送回客户端。 否则,将向客户端发送回一般错误。 请参阅上面的错误讨论。
请参阅调用取消。