Операции службы на стороне сервера

В этом разделе описываются операции службы на стороне службы.

Ниже приведен макет операции службы на стороне сервера.

  • const WS_OPERATION_CONTEXT* 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 на узле службы.

Завершение вызова

Вызов синхронной операции службы на стороне сервера завершается, когда любой из этих операций вернул управление узлу службы. Для асинхронной операции службы вызов считается завершенным после выдачи уведомления о обратном вызове реализацией операции службы.

Время существования вызова

При реализации операции службы на стороне сервера следует соблюдать особое внимание в отношении его времени существования. Время существования вызова может значительно повлиять на время завершения работы узла службы.

Если ожидается, что операция службы на стороне сервера будет блокироваться из-за некоторых операций с привязкой к вводу-вывода, рекомендуется зарегистрировать обратный вызов отмены, чтобы получать уведомления о прерывании узла службы или при закрытии базового соединения клиентом.

Рекомендации по операциям на стороне сервера и памяти

Если операция службы должна выделить память для исходящих параметров, она должна использовать объект 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/All other success HRESULTS: вызов успешно завершен. Обратите внимание, что приложение не должно возвращать HRESULT другое, а затем NOERROR для успешного завершения операции службы.
  • Все, что связано с ошибкой HRESULT: ошибка отправляется клиенту, если он доступен в WS_ERROR. В противном случае универсальная ошибка отправляется клиенту. См. обсуждение ошибки выше.

См. раздел "Отмена звонка".