다음을 통해 공유


컨텍스트 핸들에 대한 오류 의미 체계

이 항목에서는 컨텍스트 핸들에 대한 실패 의미 체계에 대해 설명합니다.

컨텍스트 핸들 닫기 실패 시 오류 의미 체계

클라이언트 애플리케이션이 클라이언트 프로세스를 종료하지 않고 서버에서 열린 컨텍스트 핸들을 닫으려고 시도했다고 상상해 보십시오. 또한 컨텍스트 핸들을 닫기 위해 서버에 대한 호출이 실패하는 것으로 가정합니다(예: 클라이언트가 메모리 부족). 이 상황을 처리하는 적절한 방법은 RpcSsDestroyClientContext 함수를 호출하는 것입니다 . 이러한 경우 클라이언트는 컨텍스트 핸들의 측면을 정리하고 서버에 대한 연결을 중단합니다. 연결은 실제로 연결 풀( RPC 및 네트워크 참조)이므로 열려 있는 각 바인딩 또는 컨텍스트 핸들에 대해 하나의 참조로 참조 계산되므로 RpcSsDestroyClientContext 함수를 호출하여 컨텍스트 핸들을 삭제해도 실제로 연결이 삭제되지 않습니다. 대신 연결 풀에 대한 참조 수를 감소합니다. 풀의 연결을 닫기 위해 클라이언트는 클라이언트 프로세스에서 해당 서버에 대한 모든 바인딩 핸들 및 컨텍스트 핸들을 닫아야 합니다. 그런 다음 풀의 모든 연결이 닫혀 서버 런다운 메커니즘이 시작되고 정리됩니다.

컨텍스트 핸들의 상태 변경 중 오류 의미 체계

이 섹션의 정보는 Windows XP 이상 플랫폼을 참조합니다.

컨텍스트 핸들은 단순히 함수에 대한 매개 변수입니다. 컨텍스트 핸들의 상태에 대한 모든 변경 내용은 매개 변수가 마샬링되거나 마스헤어링되지 않은 경우에 발생합니다. 예를 들어 클라이언트가 컨텍스트 핸들을 열면(NULL에서 비 NULL로 변경) RPC 런타임은 인수가 클라이언트로 보내기 위해 마샬링될 때까지 실제로 핸들의 RPC 부분을 열지 않습니다. 중간에 오류가 발생할 수 있습니다. 다양한 가능한 네트워크 또는 낮은 리소스 조건으로 인해 패킷을 클라이언트로 전송하지 못할 수 있습니다. 또는 컨텍스트 핸들을 변경하는 동안 서버 루틴이 예외를 throw할 수 있습니다. 이러한 오류 또는 기타 오류 상황에서 클라이언트와 서버는 컨텍스트 핸들에 대한 일관되지 않은 보기를 얻을 수 있습니다. 이 섹션에서는 컨텍스트 핸들의 상태에 대한 규칙과 다양한 오류 조건 동안 클라이언트 및 서버 코드의 책임에 대해 설명합니다.

  • NULL 컨텍스트 핸들이 도착하지만 서버 루틴에서 오류가 발생하고 예외가 throw됩니다.

    만든 컨텍스트 핸들 관련 상태를 클린 것은 서버 루틴의 책임입니다. RPC 런타임은 상태를 정리합니다.

  • NULL이 아닌 컨텍스트 핸들이 도착하지만 서버 루틴에서 오류가 발생하고 예외가 throw됩니다.

    서버 루틴이 컨텍스트 핸들을 닫은 경우 호출이 성공하지 않으므로 클라이언트는 해당 핸들에 대해 알지 못합니다. 컨텍스트 핸들을 추가로 사용하면 클라이언트에서 RPC_X_SS_CONTEXT_MISMATCH 오류가 발생합니다. 서버 루틴이 컨텍스트 핸들을 수정하지 않는 경우 클라이언트는 컨텍스트 핸들을 계속 사용할 수 있습니다. 서버 루틴이 서버 컨텍스트에 저장된 정보를 변경하는 경우 클라이언트의 새 호출에서 해당 정보를 사용합니다.

  • NULL이 아닌 컨텍스트 핸들이 도착하고 서버 루틴이 핸들을 닫지만 컨텍스트 핸들이 마샬링된 후 마샬링이 실패하거나 마샬링이 실패한 후 처리가 실패합니다.

    컨텍스트 핸들이 닫혀 있고 이 컨텍스트 핸들을 사용하여 이 클라이언트가 추가로 호출하면 클라이언트에서 RPC_X_SS_CONTEXT_MISMATCH 오류가 발생합니다.

  • NULL 컨텍스트 핸들이 도착하고 서버가 이 핸들에 대한 컨텍스트를 만들지만 컨텍스트 핸들이 마샬링된 후 마샬링이 실패하거나 마샬링이 실패한 후 처리가 수행됩니다.

    이 경우 RPC 런타임은 이 컨텍스트 핸들에 대한 런다운을 호출하고 이 컨텍스트 핸들에 대한 RPC 상태를 정리합니다. 컨텍스트 핸들은 클라이언트 쪽에서 만들어지지 않습니다.

  • NULL이 아닌 컨텍스트 핸들이 도착하면 서버는 컨텍스트 핸들을 변경하지 않거나 서버 컨텍스트에 저장된 정보를 변경하고 컨텍스트 핸들이 마샬링된 후 마샬링이 실패합니다.

    클라이언트의 새 호출은 서버에 있는 컨텍스트 핸들을 사용합니다.

  • NULL 컨텍스트 핸들이 도착하고 서버가 NULL 이외의 항목으로 설정하지 않지만 컨텍스트 핸들이 마샬링되기 전에 호출이 실패합니다.

    이 경우 클라이언트에 컨텍스트 핸들이 만들어지지 않습니다.

  • NULL이 아닌 컨텍스트 핸들이 도착하고 서버에서 NULL로 설정하지만 컨텍스트 핸들이 마샬링되기 전에 마샬링이 실패합니다.

    이 경우 컨텍스트 핸들은 서버에서 닫혀 있으며 클라이언트는 컨텍스트 핸들을 사용하려고 할 때 RPC_X_SS_CONTEXT_MISMATCH 오류를 가져옵니다.

  • NULL 컨텍스트 핸들이 서버에 도착하고 서버에서 NULL이 아닌 핸들로 설정하지만 컨텍스트 핸들이 마샬링되기 전에 마샬링이 실패합니다.

    컨텍스트 핸들 런다운은 서버가 클린 수 있도록 호출되고 클라이언트에 컨텍스트 핸들이 만들어지지 않습니다.

  • NULL이 아닌 컨텍스트 핸들이 도착하면 서버가 컨텍스트 핸들을 변경하지 않거나 서버 컨텍스트에 저장된 정보를 변경하고 컨텍스트 핸들이 마샬링되기 전에 마샬링이 실패합니다.

    클라이언트의 새 호출은 서버의 상태를 사용합니다.

  • 컨텍스트 핸들이 반환 값으로 선언되고, 컨텍스트 핸들이 마샬링되기 전에 서버 루틴이 컨텍스트 핸들에 대해 NULL 을 반환하고 마샬링이 실패합니다.

    이 경우 클라이언트에 새 컨텍스트가 만들어지지 않습니다.

  • 컨텍스트 핸들이 반환 값으로 선언되고, 컨텍스트 핸들이 마샬링되기 전에 서버 루틴이 컨텍스트 핸들에 대해 NULL 이 아닌 값을 반환하고 마샬링이 실패합니다.

    RPC 런타임은 컨텍스트 핸들 런다운 루틴을 호출하여 클린 기회를 제공하며 클라이언트에 새 컨텍스트가 만들어지지 않습니다.