Операции на стороне сервера

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

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

  • контекст const WS_OPERATION_CONTEXT* — контекст операции.
  • Параметры операций службы: параметры, относящиеся к операции службы.
  • const WS_ASYNC_CONTEXT* asyncContext: контекст Async для асинхронного выполнения операций службы.
  • ошибка 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. В противном случае универсальный сбой отправляется клиенту. См. обсуждение ошибок выше.

См. отмену звонка.