생성된 클라이언트 코드 이해Understanding Generated Client Code

ServiceModel Metadata Utility Tool (Svcutil.exe) 는 클라이언트 응용 프로그램을 빌드하는 데 사용할 클라이언트 응용 프로그램 구성 파일과 클라이언트 코드를 생성합니다.The ServiceModel Metadata Utility Tool (Svcutil.exe) generates client code and a client application configuration file for use in building client applications. 이 항목에서는 표준 서비스 계약 시나리오를 위해 생성된 코드 예제를 간략히 살펴 봅니다.This topic provides a tour of generated code examples for standard service contract scenarios. 생성 된 코드를 사용 하 여 클라이언트 응용 프로그램을 빌드하는 방법에 대 한 자세한 내용은 WCF 클라이언트 개요를 참조 하세요.For more information about building a client application using the generated code, see WCF Client Overview.

개요Overview

Visual Studio를 사용 하 여 프로젝트에 대 한 WCF (Windows Communication Foundation) 클라이언트 형식을 생성 하는 경우 일반적으로 생성 된 클라이언트 코드를 검사할 필요가 없습니다.If you use Visual Studio to generate Windows Communication Foundation (WCF) client types for your project, you typically do not need to examine the generated client code. 동일한 서비스를 수행하는 개발 환경을 사용하지 않는 경우 Svcutil.exe 같은 도구를 사용하여 클라이언트 코드를 생성한 다음 해당 코드를 사용하여 클라이언트 애플리케이션을 개발할 수 있습니다.If you are not using a development environment that performs the same services for you, you can use a tool such as Svcutil.exe to generate client code and then use that code to develop your client application.

Svcutil.exe에는 생성된 형식 정보를 수정하는 많은 옵션이 있으므로 이 항목에서 모든 시나리오에 대해 설명하지는 않습니다.Because Svcutil.exe has a number of options that modify the generated type information, this topic does not discuss all scenarios. 그러나 다음 표준 작업에는 생성된 코드를 찾는 과정이 포함됩니다.However, the following standard tasks involve locating generated code:

  • 서비스 계약 인터페이스 식별Identifying service contract interfaces.

  • WCF 클라이언트 클래스를 식별 합니다.Identifying the WCF client class.

  • 데이터 형식 식별Identifying data types.

  • 이중 서비스에 대한 콜백 계약 식별Identifying callback contracts for duplex services.

  • 도우미 서비스 계약 채널 인터페이스 식별Identifying the helper service contract channel interface.

서비스 계약 인터페이스 찾기Finding Service Contract Interfaces

서비스 계약을 모델링하는 인터페이스를 찾으려면 System.ServiceModel.ServiceContractAttribute 특성으로 표시된 인터페이스를 검색합니다.To locate the interfaces that model service contracts, search for interfaces that are marked with the System.ServiceModel.ServiceContractAttribute attribute. 다른 특성이 있고 특성 자체에 명시적 속성이 설정되어 있어 빠른 읽기로 이 특성을 찾기 어려울 수 있습니다.Often this attribute can be difficult to locate with a quick read due to the presence of other attributes and the explicit properties set on the attribute itself. 서비스 계약 인터페이스와 클라이언트 계약 인터페이스는 두 가지 다른 형식입니다.Remember that the service contract interface and the client contract interface are two different types. 다음 코드 예제에서는 원래 서비스 계약을 보여 줍니다.The following code example shows the original service contract.

[ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
  [OperationContractAttribute]
  [FaultContractAttribute(typeof(microsoft.wcf.documentation.SampleFault))]
  string SampleMethod(string msg);
}

다음 코드 예제에서는 Svcutil.exe에서 생성된 것과 동일한 서비스 계약을 보여 줍니다.The following code example shows the same service contract as generated by Svcutil.exe.

[System.ServiceModel.ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
    [System.ServiceModel.OperationContractAttribute(
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
      ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
    )]
    [System.ServiceModel.FaultContractAttribute(
      typeof(microsoft.wcf.documentation.SampleFault),
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
    )]
    string SampleMethod(string msg);
}

생성 된 서비스 계약 인터페이스를 System.ServiceModel.ChannelFactory 클래스와 함께 사용 하 여 서비스 작업을 호출 하는 데 사용할 WCF 채널 개체를 만들 수 있습니다.You can use the generated service contract interface along with the System.ServiceModel.ChannelFactory class to create a WCF channel object with which to invoke service operations. 자세한 내용은 방법: ChannelFactory를 사용 합니다.For more information, see How to: Use the ChannelFactory.

WCF 클라이언트 클래스 찾기Finding WCF Client Classes

사용할 서비스 계약을 구현 하는 WCF 클라이언트 클래스를 찾으려면 형식 매개 변수가 이전에 찾아서 해당 인터페이스를 System.ServiceModel.ClientBase<TChannel>확장 하는 서비스 계약 인터페이스인의 확장을 검색 합니다.To locate the WCF client class that implements the service contract you want to use, search for an extension of System.ServiceModel.ClientBase<TChannel>, where the type parameter is the service contract interface that you previously located and that extends that interface. 다음 코드 예제에서는 ClientBase<TChannel> 형식의 ISampleService클래스를 보여 줍니다.The following code example shows the ClientBase<TChannel> class of type ISampleService.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class SampleServiceClient : System.ServiceModel.ClientBase<ISampleService>, ISampleService
{

    public SampleServiceClient()
    {
    }

    public SampleServiceClient(string endpointConfigurationName)
        :
            base(endpointConfigurationName)
    {
    }

    public SampleServiceClient(string endpointConfigurationName, string remoteAddress)
        :
            base(endpointConfigurationName, remoteAddress)
    {
    }

    public SampleServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress)
        :
            base(endpointConfigurationName, remoteAddress)
    {
    }

    public SampleServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress)
        :
            base(binding, remoteAddress)
    {
    }
    public string SampleMethod(string msg)
    {
        return base.Channel.SampleMethod(msg);
    }
}

이 WCF 클라이언트 클래스의 새 인스턴스를 만들고이 클래스에서 구현 하는 메서드를 호출 하 여이 클래스를 사용할 수 있습니다.You can use this WCF client class by creating a new instance of it and calling the methods it implements. 이러한 메서드는 상호 작용하도록 디자인 및 구성된 서비스 작업을 호출합니다.Those methods invoke the service operation with which it is designed and configured to interact. 자세한 내용은 WCF 클라이언트 개요를 참조 하세요.For more information, see WCF Client Overview.

참고

SvcUtil.exe는 WCF 클라이언트 클래스를 생성할 때 디버거가 WCF 클라이언트 클래스를 단계별로 실행하지 못하도록 하는 DebuggerStepThroughAttribute 를 클라이언트 클래스에 추가합니다.When SvcUtil.exe generates a WCF client class, it adds a DebuggerStepThroughAttribute to the client class that prevents debuggers from stepping through the WCF client class.

데이터 형식 찾기Finding Data Types

생성된 코드에서 데이터 형식을 찾으려는 경우 가장 기본적인 메커니즘은 계약에 지정된 형식 이름을 식별하고 해당 형식 선언에 대해 코드를 검색하는 것입니다.To locate data types in the generated code, the most basic mechanism is to identify the type name specified in a contract and search the code for that type declaration. 예를 들어 다음 계약은 SampleMethod 에서 microsoft.wcf.documentation.SampleFault형식의 SOAP 오류를 반환할 수 있도록 지정합니다.For example, the following contract specifies that the SampleMethod can return a SOAP fault of type microsoft.wcf.documentation.SampleFault.

[System.ServiceModel.OperationContractAttribute(
  Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
  ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
)]
[System.ServiceModel.FaultContractAttribute(
  typeof(microsoft.wcf.documentation.SampleFault),
  Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
)]
string SampleMethod(string msg);

SampleFault 를 검색하면 다음 형식 선언을 찾습니다.Searching for SampleFault locates the following type declaration.

[assembly: System.Runtime.Serialization.ContractNamespaceAttribute(
  "http://microsoft.wcf.documentation",
  ClrNamespace = "microsoft.wcf.documentation"
)]
namespace microsoft.wcf.documentation
{
    using System.Runtime.Serialization;

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute()]
    public partial class SampleFault : object, System.Runtime.Serialization.IExtensibleDataObject
    {
        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
        private string FaultMessageField;

        public System.Runtime.Serialization.ExtensionDataObject ExtensionData
        {
            get
            {
                return this.extensionDataField;
            }
            set
            {
                this.extensionDataField = value;
            }
        }

        [System.Runtime.Serialization.DataMemberAttribute()]
        public string FaultMessage
        {
            get
            {
                return this.FaultMessageField;
            }
            set
            {
                this.FaultMessageField = value;
            }
        }
    }
}

이 경우 데이터 형식은 클라이언트의 특정 예외인 FaultException<TDetail> 에서 throw되는 세부 유형이며, 여기서 세부 유형 매개 변수는 microsoft.wcf.documentation.SampleFault입니다.In this case the data type is the detail type thrown by a specific exception on the client, a FaultException<TDetail> where the detail type parameter is microsoft.wcf.documentation.SampleFault. 데이터 형식에 대 한 자세한 내용은 서비스 계약의 데이터 전송 지정을 참조 하세요.For more information about data types, see Specifying Data Transfer in Service Contracts. 클라이언트에서 예외를 처리 하는 방법에 대 한 자세한 내용은 오류 보내기 및 받기를 참조 하십시오.For more information about handling exceptions in clients, see Sending and Receiving Faults.

이중 서비스에 대한 콜백 계약 찾기Finding Callback Contracts for Duplex Services

계약 인터페이스가 ServiceContractAttribute.CallbackContract 속성 값을 지정하는 서비스 계약을 찾으면 해당 계약이 이중 계약을 지정합니다.If you locate a service contract for which the contract interface specifies a value for the ServiceContractAttribute.CallbackContract property, then that contract specifies a duplex contract. 이중 계약에서는 클라이언트 응용 프로그램이 콜백 계약을 구현하는 콜백 클래스를 만들고 해당 클래스의 인스턴스를 서비스와의 통신에 사용되는 System.ServiceModel.DuplexClientBase<TChannel> 또는 System.ServiceModel.DuplexChannelFactory<TChannel>로 전달해야 합니다.Duplex contracts require the client application to create a callback class that implements the callback contract and pass an instance of that class to the System.ServiceModel.DuplexClientBase<TChannel> or System.ServiceModel.DuplexChannelFactory<TChannel> used to communicate with the service. 이중 클라이언트 에 대 한 자세한 내용은 방법: 이중 계약을 사용 하 여 서비스에 액세스 합니다.For more information about duplex clients, see How to: Access Services with a Duplex Contract.

다음 계약에서는 SampleDuplexHelloCallback형식의 콜백 계약을 지정합니다.The following contract specifies a callback contract of type SampleDuplexHelloCallback.

[System.ServiceModel.ServiceContractAttribute(
  Namespace="http://microsoft.wcf.documentation", 
  ConfigurationName="SampleDuplexHello", 
  CallbackContract=typeof(SampleDuplexHelloCallback), 
  SessionMode=System.ServiceModel.SessionMode.Required
)]
public interface SampleDuplexHello
{
  [System.ServiceModel.OperationContractAttribute(
      IsOneWay=true, 
      Action="http://microsoft.wcf.documentation/SampleDuplexHello/Hello"
    )]
    void Hello(string greeting);
  }
    <System.ServiceModel.OperationContractAttribute(IsOneWay:=True, _
        Action:="http://microsoft.wcf.documentation/SampleDuplexHello/Hello")> _
    Sub Hello(ByVal greeting As String)
End Interface 'SampleDuplexHello

해당 콜백 계약을 검색하면 클라이언트 애플리케이션이 구현해야 하는 다음 인터페이스를 찾습니다.Searching for that callback contract locates the following interface that the client application must implement.

  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface SampleDuplexHelloCallback
{
  [System.ServiceModel.OperationContractAttribute(
      IsOneWay=true, 
      Action="http://microsoft.wcf.documentation/SampleDuplexHello/Reply"
    )]
    void Reply(string responseToGreeting);
  }
<System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")>  _
Public Interface SampleDuplexHelloCallback
    <System.ServiceModel.OperationContractAttribute( _
        IsOneWay:=True, _
        Action:="http://microsoft.wcf.documentation/SampleDuplexHello/Reply")> _
    Sub Reply(ByVal responseToGreeting As String)
End Interface 'SampleDuplexHelloCallback

서비스 계약 채널 인터페이스 찾기Finding Service Contract Channel Interfaces

ChannelFactory 클래스를 서비스 계약 인터페이스와 함께 사용하면 채널을 명시적으로 열고, 닫고, 중단할 수 있도록 System.ServiceModel.IClientChannel 인터페이스로 캐스팅해야 합니다.When using the ChannelFactory class with a service contract interface, you must cast to the System.ServiceModel.IClientChannel interface to explicitly open, close, or abort the channel. 더 편리하게 작업할 수 있도록 Svcutil.exe 도구에서는 서비스 계약 인터페이스와 IClientChannel 을 모두 구현하는 도우미 인터페이스도 생성되므로 캐스팅하지 않고도 클라이언트 채널 인프라와 상호 작용할 수 있습니다.To make it easier to work with, the Svcutil.exe tool also generates a helper interface that implements both the service contract interface and IClientChannel to enable you to interact with the client channel infrastructure without having to cast. 다음 코드에서는 이전의 서비스 계약을 구현하는 도우미 클라이언트 채널에 대한 정의를 보여 줍니다.The following code shows the definition of a helper client channel that implements the preceding service contract.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}

참고자료See also