다음을 통해 공유


방법: Windows Communication Foundation 클라이언트 만들기

이 작업은 기본 WCF(Windows Communication Foundation) 서비스와 이 서비스를 호출할 수 있는 클라이언트를 만드는 데 필요한 6가지 작업 중 네 번째입니다. 6가지 작업의 개요를 모두 보려면 초보자를 위한 자습서 항목을 참조하십시오.

이 항목에서는 WCF 서비스에서 메타데이터를 검색하고 이를 사용하여 서비스에 액세스할 수 있는 WCF 프록시를 만드는 방법에 대해 설명합니다. 이 작업은 WCF에서 제공하는 ServiceModel Metadata 유틸리티 도구(Svcutil.exe)를 사용하여 수행합니다. 이 도구는 서비스로부터 메타데이터를 가져와 사용자가 선택한 언어를 사용하여 프록시에 대한 관리되는 소스 코드 파일을 생성합니다. 클라이언트 프록시를 만드는 것 이외에 해당 도구는 클라이언트에 대한 구성 파일도 만듭니다. 이 구성 파일을 사용하여 클라이언트 응용 프로그램에서 해당 끝점 중 하나의 서비스에 연결할 수 있습니다.

ms733133.note(ko-kr,VS.100).gif참고:
ServiceModel Metadata 유틸리티 도구(Svcutil.exe)를 사용하는 대신 Visual Studio 2010 내에 클라이언트 프로젝트에 대한 서비스 참조를 추가하여 클라이언트 프록시를 만들 수 있습니다.

ms733133.Warning(ko-kr,VS.100).gif 주의:
Visual Studio 2010에서 클래스 라이브러리 프로젝트의 WCF 서비스를 호출할 경우 서비스 참조 추가 기능을 사용하면 프록시 및 연결된 구성 파일을 자동으로 생성할 수 있습니다. 이 구성 파일은 클래스 라이브러리 프로젝트에서는 사용되지 않습니다. 클래스 라이브러리를 호출하는 실행 파일이 들어 있는 디렉터리에 구성 파일을 복사해야 합니다.

클라이언트 응용 프로그램은 생성된 프록시를 사용하여 WCF 클라이언트 개체를 만듭니다. 이 절차에 대해서는 방법: Windows Communication Foundation 클라이언트 사용에서 설명합니다.

이 작업에서 생성된 클라이언트 코드는 절차 다음의 예제에서 제공됩니다.

Windows Communication Foundation 클라이언트를 만들려면

  1. Visual Studio 2010에서 다음 단계를 수행하여 클라이언트의 현재 솔루션에서 새 프로젝트를 만듭니다.

    1. 서비스가 포함된 동일한 솔루션 내의 오른쪽 위에 있는 솔루션 탐색기에서 프로젝트가 아니라 현재 솔루션을 마우스 오른쪽 단추로 클릭하고 추가를 선택한 다음 새 프로젝트를 선택합니다.

    2. 새 프로젝트 추가 대화 상자에서 Visual Basic 또는 **Visual C#**을 선택하고 콘솔 응용 프로그램 템플릿을 선택한 다음 이름을 Client로 지정합니다. 기본 위치를 사용합니다.

    3. 확인을 클릭합니다.

  2. 다음과 같이 System.ServiceModel.dll에 대한 참조를 프로젝트에 추가합니다.

    1. 솔루션 탐색기클라이언트 프로젝트 아래에서 참조 폴더를 마우스 오른쪽 단추로 클릭하고 참조 추가를 선택합니다.

    2. .NET 탭을 선택하고 목록 상자에서 System.ServiceModel.dll(버전 4.0.0.0)을 선택한 다음 확인을 클릭합니다.

    ms733133.note(ko-kr,VS.100).gif참고:
    Csc.exe 또는 Vbc.exe와 같은 명령줄 컴파일러를 사용하는 경우 어셈블리의 경로도 제공해야 합니다. 기본적으로 예를 들어 Windows Vista를 실행하는 컴퓨터에서 경로는 Windows\Microsoft.NET\Framework\v4.0입니다.

  3. 생성된 Program.cs 또는 Program.vb 파일에 있는 System.ServiceModel 네임스페이스에 using 문(Visual Basic에서는 Imports)을 추가합니다.

    Imports System.ServiceModel
    
    using System.ServiceModel;
    
  4. Visual Studio에서 F5 키를 눌러 이전 항목에서 만든 서비스를 시작합니다. 자세한 내용은 다음 항목을 참조하십시오. 방법: 기본 Windows Communication Foundation 서비스 호스트 및 실행.

  5. 적절한 스위치로 ServiceModel Metadata 유틸리티 도구(Svcutil.exe)를 실행하고 다음 단계를 수행하여 클라이언트 코드 및 구성 파일을 만듭니다.

    1. 시작 메뉴에서 모든 프로그램을 클릭한 다음 Visual Studio 2010을 클릭합니다. Visual Studio Tools, Visual Studio 2010 명령 프롬프트를 차례로 클릭합니다.

    2. 클라이언트 노드를 배치할 디렉터리로 이동합니다. 기본값을 사용하여 클라이언트 프로젝트를 만든 경우 디렉터리는 C:\Users\<user name>\My Documents\Visual Studio 10\Projects\Service\Client입니다.

    3. 적절한 스위치로 명령줄 도구 ServiceModel Metadata 유틸리티 도구(Svcutil.exe)를 사용하여 클라이언트 코드를 만듭니다. 다음 예제에서는 서비스에 대해 코드 파일 및 구성 파일을 생성합니다.

      svcutil.exe /language:vb /out:generatedProxy.vb /config:app.config https://localhost:8000/ServiceModelSamples/service
      
      svcutil.exe /language:cs /out:generatedProxy.cs /config:app.config https://localhost:8000/ServiceModelSamples/service
      

      기본적으로 클라이언트 프록시 코드는 서비스에 따라 해당 이름이 지정되는 파일에 생성됩니다. 예를 들어 이 경우에는 CalculatorService.cs 또는 CalculatorService.vb가 되며, 여기서 확장명은 프로그래밍 언어에 해당합니다( .vb는 Visual Basic, .cs는 C#). /out 스위치는 클라이언트 프록시 파일의 이름을 GeneratedProxy.cs로 변경하고 /config 스위치는 클라이언트 구성 파일의 이름을 기본 Output.config에서 App.config로 변경합니다. 이 두 파일은 C:\Users\<사용자 이름>\My Documents\Visual Studio 10\Projects\Service\Client 디렉터리에 생성됩니다.

  6. 생성된 프록시를 Visual Studio의 클라이언트 프로젝트에 추가하려면 솔루션 탐색기에서 클라이언트 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가를 선택한 다음 기존 항목을 선택합니다. 이전 단계에서 생성된 generatedProxy 파일을 선택합니다.

예제

이 예제에서는 ServiceModel Metadata 유틸리티 도구(Svcutil.exe)로 생성되는 클라이언트 코드를 보여 줍니다.

'------------------------------------------------------------------------------
' <auto-generated>
'     This code was generated by a tool.
'     Runtime Version:2.0.50727.1366
'
'     Changes to this file may cause incorrect behavior and will be lost if
'     the code is regenerated.
' </auto-generated>
'------------------------------------------------------------------------------

Option Strict Off
Option Explicit On



<System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0"),  _
 System.ServiceModel.ServiceContractAttribute([Namespace]:="http://Microsoft.ServiceModel.Samples", ConfigurationName:="ICalculator")>  _
Public Interface ICalculator
    
    <System.ServiceModel.OperationContractAttribute(Action:="http://Microsoft.ServiceModel.Samples/ICalculator/Add", ReplyAction:="http://Microsoft.ServiceModel.Samples/ICalculator/AddResponse")>  _
    Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
    
    <System.ServiceModel.OperationContractAttribute(Action:="http://Microsoft.ServiceModel.Samples/ICalculator/Subtract", ReplyAction:="http://Microsoft.ServiceModel.Samples/ICalculator/SubtractResponse")>  _
    Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double
    
    <System.ServiceModel.OperationContractAttribute(Action:="http://Microsoft.ServiceModel.Samples/ICalculator/Multiply", ReplyAction:="http://Microsoft.ServiceModel.Samples/ICalculator/MultiplyResponse")>  _
    Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double
    
    <System.ServiceModel.OperationContractAttribute(Action:="http://Microsoft.ServiceModel.Samples/ICalculator/Divide", ReplyAction:="http://Microsoft.ServiceModel.Samples/ICalculator/DivideResponse")>  _
    Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double
End Interface

<System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")>  _
Public Interface ICalculatorChannel
    Inherits ICalculator, System.ServiceModel.IClientChannel
End Interface

<System.Diagnostics.DebuggerStepThroughAttribute(),  _
 System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")>  _
Partial Public Class CalculatorClient
    Inherits System.ServiceModel.ClientBase(Of ICalculator)
    Implements ICalculator
    
    Public Sub New()
        MyBase.New
    End Sub
    
    Public Sub New(ByVal endpointConfigurationName As String)
        MyBase.New(endpointConfigurationName)
    End Sub
    
    Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As String)
        MyBase.New(endpointConfigurationName, remoteAddress)
    End Sub
    
    Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As System.ServiceModel.EndpointAddress)
        MyBase.New(endpointConfigurationName, remoteAddress)
    End Sub
    
    Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding, ByVal remoteAddress As System.ServiceModel.EndpointAddress)
        MyBase.New(binding, remoteAddress)
    End Sub
    
    Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add
        Return MyBase.Channel.Add(n1, n2)
    End Function
    
    Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract
        Return MyBase.Channel.Subtract(n1, n2)
    End Function
    
    Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply
        Return MyBase.Channel.Multiply(n1, n2)
    End Function
    
    Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide
        Return MyBase.Channel.Divide(n1, n2)
    End Function
End Class
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:2.0.50727.1366
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------



[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://Microsoft.ServiceModel.Samples", ConfigurationName="ICalculator")]
public interface ICalculator
{
    
    [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Add", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/AddResponse")]
    double Add(double n1, double n2);
    
    [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Subtract", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/SubtractResponse")]
    double Subtract(double n1, double n2);
    
    [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Multiply", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/MultiplyResponse")]
    double Multiply(double n1, double n2);
    
    [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Divide", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/DivideResponse")]
    double Divide(double n1, double n2);
}

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

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class CalculatorClient : System.ServiceModel.ClientBase<ICalculator>, ICalculator
{
    
    public CalculatorClient()
    {
    }
    
    public CalculatorClient(string endpointConfigurationName) : 
            base(endpointConfigurationName)
    {
    }
    
    public CalculatorClient(string endpointConfigurationName, string remoteAddress) : 
            base(endpointConfigurationName, remoteAddress)
    {
    }
    
    public CalculatorClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(endpointConfigurationName, remoteAddress)
    {
    }
    
    public CalculatorClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(binding, remoteAddress)
    {
    }
    
    public double Add(double n1, double n2)
    {
        return base.Channel.Add(n1, n2);
    }
    
    public double Subtract(double n1, double n2)
    {
        return base.Channel.Subtract(n1, n2);
    }
    
    public double Multiply(double n1, double n2)
    {
        return base.Channel.Multiply(n1, n2);
    }
    
    public double Divide(double n1, double n2)
    {
        return base.Channel.Divide(n1, n2);
    }
}

WCF(Windows Communication Foundation) 클라이언트를 만들었습니다. 클라이언트를 구성하는 절차인 방법: 기본 Windows Communication Foundation 클라이언트 구성을 진행합니다. 문제 해결 정보에 대한 자세한 내용은 초보자를 위한 자습서 문제 해결을 참조하십시오.

참고 항목

작업

Getting Started 샘플
Self-Host
방법: 구성 파일을 사용하여 서비스의 메타데이터 게시
방법: Svcutil.exe를 사용하여 메타데이터 문서 다운로드

개념

ServiceModel Metadata 유틸리티 도구(Svcutil.exe)