Поделиться через


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

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

Подпись для операций службы на стороне клиента

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.

Примеры кода

Примеры кода см. в следующих статьях: