Share via


오류

오류 메시지는 원격 엔드포인트에서 오류에 대한 오류 정보를 전달하는 데 사용됩니다. 오류 메시지는 메시지 본문의 형식이 표준 형식임을 제외하고 다른 메시지와 비슷합니다. 오류는 WS-Addressing과 같은 인프라 프로토콜과 상위 수준 애플리케이션 프로토콜에서 모두 사용할 수 있습니다.

개요

오류 메시지 본문의 내용은 WS_FAULT 구조를 사용하여 이 API에 표시됩니다. 오류에는 오류 유형을 식별하는 WS_FAULT_CODE 및 오류를 설명하는 텍스트가 포함된 WS_FAULT_REASON 등 오류에 대한 정보를 제공하는 데 사용되는 고정된 필드 집합이 있지만 오류와 관련된 임의의 XML 콘텐츠를 지정하는 데 사용할 수 있는 세부 정보 필드도 포함되어 있습니다.

서비스에서 오류 생성

서비스는 일반적으로 요청을 처리하는 동안 발생한 일부 오류로 인해 오류를 보냅니다. 이 API에서 사용하는 모델은 처리 오류가 발생하는 서비스의 코드가 WS_ERROR 개체에서 필요한 오류 정보를 캡처한 다음 호출 체인의 상위 수준에서 코드가 실제로 하위 계층에서 캡처된 정보를 사용하여 오류를 전송한다는 것입니다. 이 체계를 사용하면 오류를 전송하는 코드가 오류 상황에 매핑되는 방식과 격리되는 동시에 풍부한 오류 정보를 보낼 수 있습니다.

WsSetFaultErrorProperty와 함께 다음 속성을 사용하여 WS_ERROR 개체에 대한 오류 정보를 캡처할 수 있습니다.

  • WS_FAULT_ERROR_PROPERTY_ACTION. 오류 메시지에 사용할 작업을 지정합니다. 지정하지 않으면 기본 작업이 제공됩니다.
  • WS_FAULT_ERROR_PROPERTY_FAULT. 여기에는 오류 메시지의 본문에 전송되는 WS_FAULT 구조체가 포함됩니다.
  • WS_FAULT_ERROR_PROPERTY_HEADER. 일부 오류에는 요청 메시지의 헤더와 관련된 처리 오류를 전달하기 위해 오류 메시지에 추가되는 메시지 헤더가 포함됩니다. 이 속성은 오류 메시지에 추가할 헤더가 포함된 WS_XML_BUFFER 지정하는 데 사용할 수 있습니다.

WS_ERROR 개체에 추가된 모든 오류 문자열은 전송되는 오류의 텍스트로 사용됩니다. WsAddErrorString을 사용하여 오류 문자열을 오류 개체에 추가할 수 있습니다.

WsSetFaultErrorProperty 함수를 사용하여 WS_ERROR 개체의 이러한 속성을 설정할 수 있습니다.

WS_ERROR 개체에 저장된 오류의 세부 정보를 설정하려면 WsSetFaultErrorDetail 함수를 사용합니다. 이 함수는 임의의 XML 콘텐츠를 오류와 연결하는 데 사용할 수 있습니다.

서비스 호스트WS_ERROR 개체에서 위의 정보를 사용하여 오류를 자동으로 보냅니다. WS_SERVICE_PROPERTY_FAULT_DISCLOSURE 속성을 사용하여 오류의 자세한 전송 방법을 제어할 수 있습니다.

채널 계층에서 작업하는 경우 WsSendFaultMessageForError를 사용하여 WS_ERROR 개체에 대한 오류를 보낼 수 있습니다.

클라이언트에서 오류 처리

클라이언트가 서비스 프록시를 사용할 때 또는 WsRequestReply 또는 WsReceiveMessage를 통해 오류를 수신하는 경우 WS_E_ENDPOINT_FAULT_RECEIVED 오류가 반환됩니다. 자세한 내용은 Windows Web Services 반환 값을 참조하세요. 또한 이러한 함수는 호출에 제공된 WS_ERROR 개체를 수신된 오류에 대한 정보로 채웁니다.

WsGetFaultErrorProperty를 사용하여 WS_ERROR 개체의 다음 속성을 쿼리하여 수신된 오류에 대한 정보를 가져올 수 있습니다.

오류는 오류의 세부 정보에서 임의의 추가 XML 콘텐츠를 포함할 수 있습니다. WsGetFaultErrorDetail 함수를 사용하여 액세스할 수 있습니다.

메시지와 함께 오류 사용

다음 섹션은 오류 메시지 본문의 내용을 직접 처리할 때 적용됩니다.

오류 메시지 본문의 내용은 serialization을 기본적으로 지원하는 표준 WS_FAULT 구조로 표시됩니다.

예를 들어 다음 코드를 사용하여 메시지 본문에 오류를 작성할 수 있습니다.

HRESULT hr;
WS_ELEMENT_DESCRIPTION faultDescription = { NULL, WS_FAULT_TYPE, NULL, NULL };
WS_FAULT fault = { ... };
hr = WsWriteBody(message, &faultDescription, WS_WRITE_REQUIRED_VALUE, &fault, sizeof(fault), error);

다음 코드를 사용하여 메시지 본문에서 오류를 읽을 수 있습니다.

HRESULT hr;
WS_ELEMENT_DESCRIPTION faultDescription = { NULL, WS_FAULT_TYPE, NULL, NULL };
WS_FAULT fault;
hr = WsReadBody(message, &faultDescription, WS_READ_REQUIRED_VALUE, &fault, sizeof(fault), error);

수신된 메시지가 오류인지 여부를 알기 위해 WS_MESSAGE_PROPERTY_IS_FAULT 참조할 수 있습니다. 이 속성은 WsReadMessageStart 또는 WsReadEnvelopeStart 중에 본문의 첫 번째 요소가 오류 요소인지 여부에 따라 설정됩니다.

WS_ERROR 지정된 WS_FAULT 만들려면 WsCreateFaultFromError 함수를 사용합니다.

다음 열거형은 오류의 일부입니다.

다음 함수는 오류의 일부입니다.

다음 구조체는 오류의 일부입니다.