다음을 통해 공유


방법: 서비스 계약에 오류 선언

관리 코드에서 오류 조건이 발생하면 예외가 throw됩니다. 그러나 WCF(Windows Communication Foundation) 애플리케이션에서는 서비스 계약에 SOAP 오류를 선언하여 서비스 계약이 클라이언트에 반환되는 오류 정보를 지정합니다. 예외와 오류 간의 관계에 대한 개요는 계약 및 서비스에서 오류 지정 및 처리를 참조하세요.

SOAP 오류를 지정하는 서비스 계약 만들기

  1. 작업을 하나 이상 포함하는 서비스 계약을 만듭니다. 예제는 방법: 서비스 계약 정의를 참조하세요.

  2. 클라이언트가 알림을 받을 수 있는 오류 조건을 지정할 수 있는 작업을 선택합니다. 어떤 오류 조건이 클라이언트에 SOAP 오류를 반환해야 하는지 결정하려면 계약 및 서비스에서 오류 지정 및 처리를 참조하세요.

  3. 선택한 작업에 System.ServiceModel.FaultContractAttribute를 적용하고 serialize할 수 있는 오류 형식을 생성자에 전달합니다. serialize 가능 gudtlr 생성 및 사용에 대한 자세한 내용은 서비스 계약에서 데이터 전송 지정을 참조하세요. 다음 예제에서는 SampleMethod 작업으로 인해 GreetingFault가 발생하도록 지정하는 방법을 보여 줍니다.

    [OperationContract]
    [FaultContractAttribute(
      typeof(GreetingFault),
      Action="http://www.contoso.com/GreetingFault",
      ProtectionLevel=ProtectionLevel.EncryptAndSign
      )]
    string SampleMethod(string msg);
    
    <OperationContract, FaultContractAttribute(GetType(GreetingFault), Action:="http://www.contoso.com/GreetingFault", ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
    Function SampleMethod(ByVal msg As String) As String
    
  4. 오류 조건을 클라이언트에 전달하는 계약의 모든 작업에 대해 2단계와 3단계를 반복합니다.

지정한 SOAP 오류를 반환하는 작업 구현

앞의 절차와 같이 특정 SOAP 오류를 반환하여 오류 조건을 호출 애플리케이션에 전달할 수 있도록 작업에서 지정하고 나면 다음 단계로 해당 사양을 구현합니다.

작업에서 지정한 SOAP 오류 throw

  1. FaultContractAttribute에 지정된 오류 조건이 작업에서 발생하면 지정한 SOAP 오류가 형식 매개 변수인 새 System.ServiceModel.FaultException<TDetail>을 throw합니다. 다음 예제에서는 앞의 절차와 다음 코드 섹션에 표시된 GreetingFault에서 SampleMethod를 throw하는 방법을 보여 줍니다.

    throw new FaultException<GreetingFault>(new GreetingFault("A Greeting error occurred. You said: " + msg));
    
        Throw New FaultException(Of GreetingFault)(New GreetingFault("A Greeting error occurred. You said: " & msg))
    End If
    

예시

다음 코드 예제에서는 GreetingFault 작업에 대해 SampleMethod를 지정하는 단일 작업 구현을 보여 줍니다.

using System;
using System.Collections.Generic;
using System.Net.Security;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(Namespace="http://microsoft.wcf.documentation")]
  public interface ISampleService{
    [OperationContract]
    [FaultContractAttribute(
      typeof(GreetingFault),
      Action="http://www.contoso.com/GreetingFault",
      ProtectionLevel=ProtectionLevel.EncryptAndSign
      )]
    string SampleMethod(string msg);
  }

  [DataContractAttribute]
  public class GreetingFault
  {
    private string report;

    public GreetingFault(string message)
    {
      this.report = message;
    }

    [DataMemberAttribute]
    public string Message
    {
      get { return this.report; }
      set { this.report = value; }
    }
  }

  class SampleService : ISampleService
  {
  #region ISampleService Members

  public string  SampleMethod(string msg)
  {
    Console.WriteLine("Client said: " + msg);
    // Generate intermittent error behavior.
    Random rnd = new Random(DateTime.Now.Millisecond);
    int test = rnd.Next(5);
    if (test % 2 != 0)
      return "The service greets you: " + msg;
    else
      throw new FaultException<GreetingFault>(new GreetingFault("A Greeting error occurred. You said: " + msg));
  }

  #endregion
  }
}

Imports System.Collections.Generic
Imports System.Net.Security
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.Text

Namespace Microsoft.WCF.Documentation
    <ServiceContract(Namespace:="http://microsoft.wcf.documentation")> _
    Public Interface ISampleService
        <OperationContract, FaultContractAttribute(GetType(GreetingFault), Action:="http://www.contoso.com/GreetingFault", ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
        Function SampleMethod(ByVal msg As String) As String
    End Interface

    <DataContractAttribute> _
    Public Class GreetingFault
        Private report As String

        Public Sub New(ByVal message As String)
            Me.report = message
        End Sub

        <DataMemberAttribute> _
        Public Property Message() As String
            Get
                Return Me.report
            End Get
            Set(ByVal value As String)
                Me.report = value
            End Set
        End Property
    End Class

    Friend Class SampleService
        Implements ISampleService
#Region "ISampleService Members"

        Public Function SampleMethod(ByVal msg As String) As String Implements ISampleService.SampleMethod
            Console.WriteLine("Client said: " & msg)
            ' Generate intermittent error behavior.
            Dim rand As New Random(DateTime.Now.Millisecond)
            Dim test As Integer = rand.Next(5)
            If test Mod 2 <> 0 Then
                Return "The service greets you: " & msg
            Else
                Throw New FaultException(Of GreetingFault)(New GreetingFault("A Greeting error occurred. You said: " & msg))
            End If
        End Function

#End Region
    End Class
End Namespace

참고 항목