다음을 통해 공유


오류 정의 및 지정

SOAP 오류는 서비스에서 클라이언트로 오류 조건 정보를 전달하고, 이중 사례에서는 상호 운용 가능한 방식으로 클라이언트에서 서비스로 전달합니다. 이 항목에서는 사용자 지정 오류 콘텐츠를 정의하고 반환할 수 있는 작업을 지정하는 시기와 방법에 대해 설명합니다. 서비스 또는 이중 클라이언트가 이러한 오류를 보낼 수 있는 방법 및 클라이언트 또는 서비스 애플리케이션이 이러한 오류를 처리하는 방법에 대한 자세한 내용은 오류 보내기 및 받기를 참조하세요. WCF(Windows Communication Foundation) 애플리케이션의 오류 처리 개요는 계약 및 서비스에서 오류 지정 및 처리를 참조하세요.

개요

선언된 SOAP 오류는 작업에 사용자 지정 SOAP 오류 형식을 지정하는 System.ServiceModel.FaultContractAttribute를 포함하는 오류입니다. 선언되지 않은 SOAP 오류는 작업에 대한 계약에 지정되지 않은 오류입니다. 이 항목에서는 이러한 오류 조건을 식별하고 사용자 지정 SOAP 오류로 알림을 받을 때 클라이언트가 해당 오류 조건을 적절하게 처리하는 데 사용할 수 있는 서비스에 대한 오류 계약을 만드는 데 도움이 됩니다. 기본 작업은 순서대로 다음과 같습니다.

  1. 서비스의 클라이언트가 알아야 하는 오류 조건을 정의합니다.

  2. 이러한 오류 조건에 대한 SOAP 오류의 사용자 지정 콘텐츠를 정의합니다.

  3. 특정 SOAP 오류가 발생할 때 해당 오류가 WSDL의 클라이언트에게 노출되도록 작업을 지정합니다.

클라이언트에서 알아야 하는 오류 조건 정의

SOAP 오류는 특정 작업에 대한 오류 정보를 전달하는 공개적으로 설명된 메시지입니다. WSDL의 다른 작업 메시지와 함께 설명되므로 클라이언트는 작업을 호출할 때 이러한 오류를 알고 있으므로 이러한 오류를 처리해야 합니다. 그러나 WCF 서비스는 관리 코드로 작성되므로 관리 코드의 오류 조건을 오류로 변환하고 클라이언트로 반환할 것을 결정하면 클라이언트와의 공식적인 오류 대화에서 서비스의 오류 조건과 버그를 구분할 수 있습니다.

예를 들어 다음 코드 예제에서는 두 개의 정수 및 다른 정수 반환 작업을 보여 줍니다. 여기서는 몇 가지 예외가 발생할 수 있으므로 오류 계약을 디자인할 때 클라이언트에 중요한 오류 조건을 결정해야 합니다. 이 경우 서비스에서 예외를 System.DivideByZeroException 감지해야 합니다.

[ServiceContract]  
public class CalculatorService  
{  
    [OperationContract]
    int Divide(int a, int b)  
    {  
      if (b==0) throw new Exception("Division by zero!");  
      return a/b;  
    }  
}  
<ServiceContract> _
Public Class CalculatorService
    <OperationContract> _
    Public Function Divide(a As Integer, b As Integer) As Integer
        If b = 0 Then Throw New DivideByZeroException("Division by zero!")
        Return a / b
    End Function
End Class

앞의 예제에서 연산은 0으로 나누는 것과 관련된 사용자 지정 SOAP 오류, 수학 연산과 관련된 사용자 지정 오류, 0으로 나누는 것과 관련된 정보, 여러 오류 상황에 대한 여러 오류 또는 SOAP 오류가 전혀 없는 사용자 지정 오류를 반환할 수 있습니다.

오류 조건의 내용 정의

사용자 지정 SOAP 오류를 유용하게 반환할 수 있는 오류 조건이 식별되면 다음 단계는 해당 오류의 내용을 정의하고 콘텐츠 구조를 serialize할 수 있도록 하는 것입니다. 이전 섹션의 코드 예제에서는 작업과 관련된 Divide 오류를 보여 주지만 서비스에 다른 작업이 Calculator 있는 경우 단일 사용자 지정 SOAP 오류가 포함된 모든 계산기 오류 조건을 Divide 클라이언트에 알릴 수 있습니다. 다음 코드 예제에서는 사용자 지정 SOAP 오류를 MathFault만드는 방법을 보여 줍니다. 이 오류는 을 비롯한 Divide모든 수학 연산을 사용하여 발생한 오류를 보고할 수 있습니다. 클래스는 작업(속성) 및 문제( OperationProblemType 속성)를 설명하는 값을 지정할 수 있지만, 사용자 지정 SOAP 오류에서 클라이언트로 전송하려면 클래스와 이러한 속성을 직렬화할 수 있어야 합니다. 따라서 System.Runtime.Serialization.DataContractAttribute 형식 및 System.Runtime.Serialization.DataMemberAttribute 특성은 형식과 해당 속성을 직렬화 가능하고 가능한 한 상호 운용 가능하게 만드는 데 사용됩니다.

// Define a math fault data contract
[DataContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public class MathFault
{
    private string operation;
    private string problemType;

    [DataMember]
    public string Operation
    {
        get { return operation; }
        set { operation = value; }
    }

    [DataMember]
    public string ProblemType
    {
        get { return problemType; }
        set { problemType = value; }
    }
}
' Define a math fault data contract
<DataContract([Namespace]:="http://Microsoft.ServiceModel.Samples")> _
Public Class MathFault

    Private m_operation As String
    Private m_problemType As String

    <DataMember()> _
    Public Property Operation() As String

        Get

            Return m_operation

        End Get

        Set(ByVal value As String)

            m_operation = value

        End Set

    End Property

    <DataMember()> _
    Public Property ProblemType() As String

        Get

            Return m_problemType

        End Get

        Set(ByVal value As String)

            m_problemType = value

        End Set

    End Property

End Class

데이터를 직렬화할 수 있도록 하는 방법에 대한 자세한 내용은 서비스 계약에서 데이터 전송 지정을 참조하세요. System.Runtime.Serialization.DataContractSerializer가 제공하는 직렬화 지원 목록은 데이터 계약 직렬 변환기가 지원하는 형식을 참조하십시오.

오류 계약을 수립하기 위한 작업 절차 설정

사용자 지정 SOAP 오류의 일부로 반환되는 직렬화 가능한 데이터 구조가 정의되면, 마지막 단계는 작업 계약이 해당 형식의 SOAP 오류를 발생시키도록 표시하는 것입니다. 이렇게 하려면 System.ServiceModel.FaultContractAttribute 특성을 사용하고 생성한 사용자 지정 데이터 형식의 형식을 전달하세요. 다음 코드 예제에서는 특성을 사용하여 FaultContractAttribute 작업이 형식Divide의 SOAP 오류를 반환할 수 있도록 MathFault 지정하는 방법을 보여줍니다. 이제 다른 수학 기반 연산에서 반환 MathFault할 수 있도록 지정할 수도 있습니다.

[OperationContract]
[FaultContract(typeof(MathFault))]
int Divide(int n1, int n2);
<OperationContract()> _
<FaultContract(GetType(MathFault))> _
Function Divide(ByVal n1 As Integer, ByVal n2 As Integer) As Integer

작업을 둘 이상의 FaultContractAttribute 특성으로 표시하여, 해당 작업이 둘 이상의 사용자 지정 오류를 반환하도록 지정할 수 있습니다.

작업 구현에서 오류 계약을 구현하기 위한 다음 단계는 오류 보내기 및 수신 항목에 설명되어 있습니다.

SOAP, WSDL 및 상호 운용성 고려 사항

경우에 따라 특히 다른 플랫폼과 상호 운용할 때 오류가 SOAP 메시지에 표시되는 방식이나 WSDL 메타데이터에 설명된 방식을 제어하는 것이 중요할 수 있습니다.

특성에는 FaultContractAttributeName 해당 오류에 대한 메타데이터에서 생성되는 WSDL 오류 요소 이름을 제어할 수 있는 속성이 있습니다.

SOAP 표준에 따르면, 오류에는 Action, Code, 및 Reason가 있을 수 있습니다. 속성 Action 에 의해 Action 제어됩니다. Code 속성과 Reason 속성은 모두 제네릭 System.ServiceModel.FaultException의 부모 클래스인 System.ServiceModel.FaultException<TDetail> 클래스의 속성입니다. Code 속성은 SubCode 멤버를 포함합니다.

오류를 생성하는 비서비스에 액세스할 때 특정 제한 사항이 있습니다. WCF는 스키마가 설명하고 데이터 계약과 호환되는 세부 유형이 있는 오류만 지원합니다. 예를 들어 위에서 설명한 것처럼 WCF는 세부 정보 형식에서 XML 특성을 사용하는 오류 또는 세부 정보 섹션에서 둘 이상의 최상위 요소가 있는 오류를 지원하지 않습니다.

참고하십시오