다음을 통해 공유


클라이언트 쪽 서비스 작업

다음은 클라이언트 쪽 서비스 작업의 레이아웃입니다.

클라이언트 쪽 서비스 작업에 대한 서명

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*를 매개 변수로 사용합니다. 이는 메시지 본문을 매개 변수로 serialization/deserialization하는 데 사용되는 필수 매개 변수입니다.

애플리케이션은 호출이 성공했는지 여부에 관계없이 WsResetHeap 을 호출해야 합니다. 호출이 성공하고 나가는 매개 변수가 있는 경우 애플리케이션은 나가는 매개 변수로 완료된 직후 WsResetHeap 을 호출해야 합니다.

애플리케이션은 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;

오류 매개 변수

애플리케이션은 항상 오류 매개 변수를 다음으로 전달해야 합니다.

  • 서비스 작업 호출 중에 오류가 발생하는 경우 풍부한 오류 정보를 가져옵니다.
  • 서비스가 오류를 반환한 경우 오류 개체를 가져옵니다. 오류 개체에 오류가 포함됩니다. 이 경우 서비스 작업에서 반환된 HRESULT 값은 WS_E_ENDPOINT_FAULT_RECEIVED ( Windows Web Services 반환 값 참조).

클라이언트 쪽 서비스 작업에 대한 호출 속성

호출 속성을 사용하면 애플리케이션이 지정된 호출에 대한 사용자 지정 설정을 지정할 수 있습니다. 현재 서비스 모델에서 하나의 호출 속성만 사용할 수 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을 통해 이 기능을 제공합니다.

호출자에 대한 컨트롤은 즉시 다시 제공되지 않을 수 있습니다. 서비스 프록시 런타임이 제공하는 유일한 보장은 호출자에게 컨트롤을 다시 제공하기 전에 I/O 바인딩된 작업이 완료될 때까지 기다리지 않는다는 것입니다.

클라이언트 쪽 서비스 작업에 대한 호출은 WsAbandonCall 호출을 통해 중단될 수 있습니다. 서비스 프록시 및 호출 ID를 사용합니다. 호출 ID는 서비스 작업에 대한 호출 속성의 일부로 제공됩니다.

호출 ID가 0이면 서비스 프록시가 해당 instance 보류 중인 모든 호출을 중단합니다.

통화 시간 제한

기본적으로 서비스 프록시에는 모든 호출에 대해 30초의 시간 제한이 있습니다. WsCreateServiceProxy를 통해 서비스 프록시를 만들 때 서비스 프록시 속성을 WS_PROXY_PROPERTY_CALL_TIMEOUT 호출의 시간 제한을 변경할 수 있습니다.

시간 제한에 도달하면 호출이 중단됩니다.

반환 값

모든 성공 HRESULT 값은 성공으로 처리되어야 하며 모든 실패 값은 실패로 처리되어야 합니다. 다음은 애플리케이션에서 예상할 수 있는 HRESULT 값 중 일부입니다.

  • WS_S_ASYNC: 호출이 비동기적으로 완료됩니다.
  • NOERROR: 호출이 성공적으로 완료되었습니다.
  • WS_E_OPERATION_ABANDONED: 호출이 중단되었습니다. 오류 개체에는 중단 이유가 포함됩니다.
  • WS_E_INVALID_OPERATION: 서비스 프록시가 서비스 프록시 상태를 파악하기 검사 호출하기에 적절한 상태가 아닙니다.

반환 값의 전체 목록은 Windows Web Services 반환 값을 참조하세요.

코드 예제

코드 예제는 다음을 참조하세요.