서버 쪽 서비스 작업

이 섹션에서는 서비스 쪽 서비스 작업에 대해 설명합니다.

다음은 서버 쪽 서비스 작업의 레이아웃입니다.

  • const WS_OPERATION_CONTEXT* 컨텍스트: 작업 컨텍스트입니다.
  • 서비스 작업 매개 변수: 서비스 작업과 관련된 매개 변수입니다.
  • const WS_ASYNC_CONTEXT* asyncContext: 비동기적으로 서비스 작업을 실행하기 위한 비동기 컨텍스트입니다.
  • 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 서비스 속성에 의해 제어됩니다.

통화 완료

동기 서버 쪽 서비스 작업에 대한 호출은 제어를 서비스 호스트에 다시 반환할 때 완료된 것으로 전해집니다. 비동기 서비스 작업의 경우 서비스 작업 구현에서 콜백 알림이 실행되면 호출이 완료된 것으로 간주됩니다.

통화 수명

수명에 대한 서버 쪽 서비스 작업을 구현할 때는 특별히 주의해야 합니다. 호출의 수명은 서비스 호스트가 종료하는 데 걸리는 시간에 큰 영향을 줄 수 있습니다.

일부 IO 바인딩된 작업으로 인해 서버 쪽 서비스 작업을 차단해야 하는 경우 서비스 호스트가 중단되거나 클라이언트가 기본 연결을 닫을 때 알림을 받도록 취소 콜백을 등록하는 것이 좋습니다.

서버 쪽 서비스 작업 및 메모리 고려 사항

서비스 작업에서 나가는 매개 변수에 메모리를 할당해야 하는 경우 WS_OPERATION_CONTEXT 통해 사용할 수 있는 WS_HEAP 개체를 사용해야 합니다.

예: 서비스 작업 및 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/기타 모든 성공 HRESULTS: 호출이 성공적으로 완료되었습니다. 서비스 작업을 성공적으로 완료하려면 애플리케이션이 NOERROR 이외의 HRESULT를 반환하지 않는 것이 좋습니다.
  • 오류 HRESULT가 있는 모든 항목: WS_ERROR 사용할 수 있는 경우 오류가 클라이언트로 다시 전송됩니다. 그렇지 않으면 제네릭 오류가 클라이언트로 다시 전송됩니다. 위의 오류 토론을 참조하세요.

통화 취소참조하세요.