Операции на стороне сервера
В этом разделе описываются операции на стороне службы.
Ниже приведен макет операции на стороне сервера.
- контекст 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. В противном случае универсальный сбой отправляется клиенту. См. обсуждение ошибок выше.
См. отмену звонка.