Операции службы на стороне клиента
Ниже приведен макет операции службы на стороне клиента.
- WS_SERVICE_PROXY* serviceProxy: прокси-сервер службы для вызова.
- куча WS_HEAP*: необходимая куча, используемая для сериализации тела и десериализации WS_MESSAGE.
- Параметры операций службы: параметры, относящиеся к операции службы.
- Свойства вызова и их количество: массив свойств вызова.
- Количество свойств вызова : количество свойств вызова.
- WS_ASYNC_CONTEXT asyncContext: асинхронный контекст для асинхронного выполнения вызова.
- ошибка WS_ERROR : объект rich error.
Подпись для операций службы на стороне клиента
typedef HRESULT(CALLBACK *ICalculator_Add)(WS_SERVICE_PROXY* serviceProxy,
WS_HEAP* heap,
ULONG a, ULONG b, ULONG* result,
const WS_CALL_PROPERTY* callProperties,
const ULONG callPropertyCount,
const WS_ASYNC_CONTEXT* asyncContext,
WS_ERROR* error);
Рекомендации по использованию памяти для операций службы на стороне клиента
Вызов операции службы принимает WS_HEAP* в качестве параметра. Это обязательный параметр, используемый для сериализации или десериализации тел сообщений в параметры.
Приложение должно вызвать WsResetHeap независимо от того, успешно ли выполнен вызов. Если вызов выполнен успешно и у него есть исходящие параметры, приложение должно вызвать WsResetHeap сразу после завершения с исходящими параметрами.
Приложение должно выделять память для параметров in и out с помощью WsAlloc. Прокси-серверу службы может потребоваться перераспределить их, чтобы предоставленные указатели были перезаписаны. Попытка освободить такую память приведет к сбою приложения.
Операции службы на стороне клиента и WS_HEAP
HRESULT hr = IProcessOrder_ProcessOrder(serviceProxy, heap, orderNumber, &orderReceipt, NULL, 0, NULL, error);
if(FAILED(hr))
goto error;
hr = ProcessReceipt(orderReceipt);
WsResetHeap(heap);
if(FAILED(hr))
goto error;
hr = IProcessOrder_CompleteOrder(serviceProxy, heap, orderNumber, &orderMemo, NULL, 0, NULL, error);
if(FAILED(hr))
goto error;
hr = ProcessMemo(orderMemo);
WsResetHeap(heap);
if(FAILED(hr))
goto error;
Параметр ошибки
Приложение всегда должно передавать параметр ошибки в:
- Получение подробных сведений об ошибке при сбое во время вызова операции службы.
- Получите объект сбоя, если служба вернула ошибку. Ошибка содержится в объекте error. В этом случае значение HRESULT , возвращаемое операцией службы, WS_E_ENDPOINT_FAULT_RECEIVED (см. раздел Возвращаемые значения веб-служб Windows).
Свойства вызова для операций службы на стороне клиента
Свойства вызова позволяют приложению указывать пользовательские параметры для данного вызова. В настоящее время в модели службы доступно только одно свойство вызова, WS_CALL_PROPERTY_CALL_ID.
WS_CALL_PROPERTY callProperties[1] = {0};
callProperties[0].id = WS_CALL_PROPERTY_CALL_ID;
callProperties[0].value = 5;
HRESULT hr = IProcessOrder_ProcessOrder(serviceProxy, heap, orderNumber, &orderReceipt, callProperties, WsCountOf(callProperties), NULL, error);
if(FAILED(hr))
goto error;
//:
//:
hr = IProcessOrder_CompleteOrder(serviceProxy, heap, orderNumber, &orderReceipt, callProperties, WsCountOf(callProperties), NULL, error);
if(FAILED(hr))
goto error;
//:
//:
//:
// On a separate thread
// In this case both the calls belong to call group 5, and will abandon as a result of the call to WsAbandonCall.
hr = WsAbandonCall(serviceProxy, 5, error);
Отказ от вызова
Часто желательно отказаться от результатов вызова, чтобы вернуть элемент управления приложению, чтобы фактическое завершение вызова обрабатывалось инфраструктурой. Прокси-сервер службы предоставляет эту возможность через WsAbandonCall.
Обратите внимание, что управление вызывающему объекту может быть передано не сразу. Единственной гарантией, которую дает среда выполнения прокси-сервера службы, является то, что она не будет ждать завершения любой связанной операции ввода-вывода, прежде чем вернуть управление вызывающему объекту.
Вызовы операции службы на стороне клиента можно прервать с помощью вызова WsAbandonCall. Он принимает прокси-сервер службы и идентификатор вызова. Идентификатор вызова предоставляется как часть свойств вызова для операции службы.
Если идентификатор вызова равен 0, прокси-сервер службы откажется от всех ожидающих вызовов в этом экземпляре.
Время ожидания вызова
По умолчанию прокси-сервер службы имеет 30-секундное время ожидания для каждого вызова. Время ожидания для вызова можно изменить , WS_PROXY_PROPERTY_CALL_TIMEOUT свойство прокси службы при создании прокси-сервера службы с помощью WsCreateServiceProxy.
По истечении времени ожидания вызов будет прерван.
Возвращаемые значения
Все значения успешного выполнения HRESULT должны рассматриваться как успешные, а все значения сбоев — как сбои. Ниже приведены некоторые из значений HRESULT , которые может ожидать приложение.
- WS_S_ASYNC. Вызов будет выполняться асинхронно.
- NOERROR: вызов успешно завершен.
- WS_E_OPERATION_ABANDONED: вызов был прерван. Объект error содержит причину отказа.
- WS_E_INVALID_OPERATION: прокси-сервер службы не находится в соответствующем состоянии для выполнения вызова, проверка состояние прокси-сервера службы, чтобы выяснить состояние прокси-сервера службы.
Полный список возвращаемых значений см. в разделе Возвращаемые значения веб-служб Windows.
Примеры кода
Примеры кода см. в следующих статьях: