다음을 통해 공유


WCF 클라이언트 개요

이 섹션에서는 클라이언트 애플리케이션이 수행하는 작업, WCF(Windows Communication Foundation) 클라이언트를 구성, 생성 및 사용하는 방법 및 클라이언트 애플리케이션을 보호하는 방법을 설명합니다.

WCF 클라이언트 개체 사용

클라이언트 애플리케이션은 WCF 클라이언트를 사용하여 다른 애플리케이션과 통신하는 관리되는 애플리케이션입니다. WCF 서비스에 대한 클라이언트 애플리케이션을 만들려면 다음 단계가 필요합니다.

  1. 서비스 엔드포인트에 대한 서비스 계약, 바인딩 및 주소 정보를 가져옵니다.

  2. 해당 정보를 사용하여 WCF 클라이언트를 만듭니다.

  3. 호출 작업.

  4. WCF 클라이언트 개체를 닫습니다.

다음 섹션에서는 이러한 단계에 대해 설명하고 다음 문제에 대한 간략한 소개를 제공합니다.

  • 오류 처리.

  • 클라이언트 구성 및 보안

  • 듀플렉스 서비스에 대한 콜백 객체 만들기

  • 서비스를 비동기적으로 호출합니다.

  • 클라이언트 채널을 사용하여 서비스 호출

서비스 계약, 바인딩 및 주소 가져오기

WCF에서 서비스 및 클라이언트는 관리되는 특성, 인터페이스 및 메서드를 사용하여 계약을 모델링합니다. 클라이언트 애플리케이션의 서비스에 연결하려면 서비스 계약에 대한 형식 정보를 가져와야 합니다. 일반적으로 ServiceModel 메타데이터 유틸리티 도구(Svcutil.exe)를 사용하여 서비스 계약에 대한 형식 정보를 가져옵니다. 유틸리티는 서비스에서 메타데이터를 다운로드하고, 선택한 언어로 관리되는 소스 코드 파일로 변환하고, WCF 클라이언트 개체를 구성하는 데 사용할 수 있는 클라이언트 애플리케이션 구성 파일을 만듭니다. 예를 들어, MyCalculatorService를 호출하기 위한 WCF 클라이언트 객체를 생성하려고 하며, 해당 서비스에 대한 메타데이터가 http://computerName/MyCalculatorService/Service.svc?wsdl에 게시되어 있다는 것을 알고 있는 경우, 다음 코드 예제는 Svcutil.exe을 사용하여 관리 코드 형식으로 서비스 계약이 포함된 ClientCode.vb 파일을 얻는 방법을 보여줍니다.

svcutil /language:vb /out:ClientCode.vb /config:app.config http://computerName/MyCalculatorService/Service.svc?wsdl  

이 계약 코드를 클라이언트 애플리케이션 또는 클라이언트 애플리케이션이 WCF 클라이언트 개체를 만드는 데 사용할 수 있는 다른 어셈블리로 컴파일할 수 있습니다. 구성 파일을 사용하여 서비스에 제대로 연결하도록 클라이언트 개체를 구성할 수 있습니다.

이 프로세스의 예제는 방법: 클라이언트 만들기를 참조하세요. 계약에 대한 자세한 내용은 계약을 참조하세요.

WCF 클라이언트 개체 만들기

WCF 클라이언트는 클라이언트가 원격 서비스와 통신하는 데 사용할 수 있는 형식의 WCF 서비스를 나타내는 로컬 개체입니다. WCF 클라이언트 유형은 대상 서비스 계약을 구현하므로 계약을 만들고 구성할 때 클라이언트 개체를 직접 사용하여 서비스 작업을 호출할 수 있습니다. WCF 런타임은 메서드 호출을 메시지로 변환하고, 서비스로 보내고, 회신을 수신 대기하고, 해당 값을 반환 값 또는 outref 매개 변수로 WCF 클라이언트 개체에 반환합니다.

WCF 클라이언트 채널 개체를 사용하여 서비스에 연결하고 사용할 수도 있습니다. 자세한 내용은 WCF 클라이언트 아키텍처를 참조하세요.

새 WCF 개체 만들기

클래스의 ClientBase<TChannel> 사용을 설명하기 위해 서비스 애플리케이션에서 다음과 같은 간단한 서비스 계약이 생성되었다고 가정합니다.

비고

Visual Studio를 사용하여 WCF 클라이언트를 만드는 경우 프로젝트에 서비스 참조를 추가할 때 개체가 개체 브라우저에 자동으로 로드됩니다.

[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);
}

Visual Studio를 사용하지 않는 경우 생성된 계약 코드를 검사하여 확장 ClientBase<TChannel> 되는 형식과 서비스 계약 인터페이스 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);
    }
}

이 클래스는 생성자 중 하나를 사용하여 로컬 개체로 만들고 구성한 다음 형식의 서비스에 연결하는 데 사용할 수 있습니다 ISampleService.

먼저 WCF 클라이언트 개체를 만든 다음, 이 개체를 사용하여 단일 try/catch 블록 내에서 닫는 것이 좋습니다. using문(Using는 Visual Basic에서)을 사용하지 마세요. 특정 오류 모드에서 예외를 숨길 수 있습니다. 자세한 내용은 다음 섹션뿐만 아니라 닫기 및 중단을 사용하여 WCF 클라이언트 리소스를 해제를 참조하십시오.

계약, 바인딩 및 주소

WCF 클라이언트 개체를 만들려면 먼저 클라이언트 개체를 구성해야 합니다. 특히 사용할 서비스 엔드포인트 가 있어야 합니다. 엔드포인트는 서비스 계약, 바인딩 및 주소의 조합입니다. (엔드포인트에 대한 자세한 내용은 엔드포인트: 주소, 바인딩 및 계약을 참조하세요.) 일반적으로 이 정보는 Svcutil.exe 도구에서 <생성하는 것과 같은 클라이언트 애플리케이션 구성 파일의 엔드포인트> 요소에 있으며 클라이언트 개체를 만들 때 자동으로 로드됩니다. 또한 두 WCF 클라이언트 형식에는 프로그래밍 방식으로 이 정보를 지정할 수 있는 오버로드가 있습니다.

예를 들어, 이전의 예제에서 사용된 ISampleService 에 대한 생성된 구성 파일에는 다음과 같은 엔드포인트 정보가 포함되어 있습니다.

<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_ISampleService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:01:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Message">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" establishSecurityContext="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8080/SampleService" binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_ISampleService" contract="ISampleService"
                name="WSHttpBinding_ISampleService">
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

이 구성 파일은 요소의 대상 엔드포인트를 <client> 지정합니다. 여러 대상 엔드포인트를 사용하는 방법에 대한 자세한 내용은 ClientBase<TChannel> 생성자 또는 ChannelFactory<TChannel> 생성자를 참조하세요.

호출 작업

클라이언트 개체를 만들고 구성한 후에는 try/catch 블록을 만들고, 개체가 로컬인 경우와 동일한 방식으로 작업을 호출하고, WCF 클라이언트 개체를 닫습니다. 클라이언트 애플리케이션이 첫 번째 작업을 호출하면 WCF가 자동으로 기본 채널을 열고 개체를 재활용할 때 기본 채널이 닫힙니다. (또는 다른 작업을 호출하기 전이나 이후에 채널을 명시적으로 열고 닫을 수도 있습니다.)

예를 들어 다음 서비스 계약이 있는 경우:

namespace Microsoft.ServiceModel.Samples  
{  
    using System;  
    using System.ServiceModel;  
  
    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]  
    public interface ICalculator  
   {  
        [OperationContract]  
        double Add(double n1, double n2);  
        [OperationContract]  
        double Subtract(double n1, double n2);  
        [OperationContract]  
        double Multiply(double n1, double n2);  
        [OperationContract]  
        double Divide(double n1, double n2);  
    }  
}  
Namespace Microsoft.ServiceModel.Samples  
  
    Imports System  
    Imports System.ServiceModel  
  
    <ServiceContract(Namespace:= _  
    "http://Microsoft.ServiceModel.Samples")> _
   Public Interface ICalculator  
        <OperationContract> _
        Function Add(n1 As Double, n2 As Double) As Double  
        <OperationContract> _
        Function Subtract(n1 As Double, n2 As Double) As Double  
        <OperationContract> _
        Function Multiply(n1 As Double, n2 As Double) As Double  
        <OperationContract> _
     Function Divide(n1 As Double, n2 As Double) As Double  
End Interface  

다음 코드 예제와 같이 WCF 클라이언트 개체를 만들고 해당 메서드를 호출하여 작업을 호출할 수 있습니다. WCF 클라이언트 개체의 열기, 호출 및 닫는 작업은 단일 try/catch 블록 내에서 발생합니다. 자세한 내용은 WCF 클라이언트를 사용하여 서비스에 액세스 하고 닫기 및 중단을 사용하여 WCF 클라이언트 리소스를 해제하는 방법을 참조하세요.

CalculatorClient wcfClient = new CalculatorClient();
try
{
    Console.WriteLine(wcfClient.Add(4, 6));
    wcfClient.Close();
}
catch (TimeoutException timeout)
{
    // Handle the timeout exception.
    wcfClient.Abort();
}
catch (CommunicationException commException)
{
    // Handle the communication exception.
    wcfClient.Abort();
}

오류 처리

클라이언트 애플리케이션에서 기본 클라이언트 채널을 열 때(작업을 명시적으로 또는 자동으로 호출하여) 클라이언트 또는 채널 개체를 사용하여 작업을 호출하거나 기본 클라이언트 채널을 닫을 때 예외가 발생할 수 있습니다. 최소한 애플리케이션은 작업에서 반환된 SOAP 오류의 결과로 throw된 개체 System.TimeoutException 외에도 가능한 System.ServiceModel.CommunicationException 예외와 System.ServiceModel.FaultException 예외를 처리해야 하는 것이 좋습니다. 작업 계약에 지정된 SOAP 오류는 클라이언트 애플리케이션에 System.ServiceModel.FaultException<TDetail>로 전달되며, 여기서 형식 매개변수는 SOAP 오류의 세부 유형입니다. 클라이언트 애플리케이션의 오류 조건 처리에 대한 자세한 내용은 오류 보내기 및 받기를 참조하세요. 전체 샘플은 클라이언트에서 오류를 처리하는 방법을 보여 줍니다. 예상 예외를 참조하세요.

클라이언트 구성 및 보안

클라이언트 구성은 클라이언트 생성자 및 속성을 사용하여 프로그래밍 방식으로 이 정보를 로드할 수도 있지만 일반적으로 구성 파일에서 클라이언트 또는 채널 개체에 대한 대상 엔드포인트 정보의 필수 로드로 시작합니다. 그러나 특정 클라이언트 동작 및 많은 보안 시나리오를 사용하도록 설정하려면 추가 구성 단계가 필요합니다.

예를 들어 서비스 계약에 대한 보안 요구 사항은 서비스 계약 인터페이스에서 선언되며, Svcutil.exe 구성 파일을 만든 경우 해당 파일에는 일반적으로 서비스의 보안 요구 사항을 지원할 수 있는 바인딩이 포함됩니다. 그러나 클라이언트 자격 증명 구성과 같은 더 많은 보안 구성이 필요한 경우도 있습니다. WCF 클라이언트에 대한 보안 구성에 대한 자세한 내용은 클라이언트 보안을 참조하세요.

또한 클라이언트 애플리케이션에서 사용자 지정 런타임 동작과 같은 일부 사용자 지정 수정을 사용하도록 설정할 수 있습니다. 사용자 지정 클라이언트 동작을 구성하는 방법에 대한 자세한 내용은 클라이언트 동작 구성을 참조하세요.

Duplex Services에 대한 콜백 개체 만들기

이중 서비스는 계약의 요구 사항에 따라 호출할 서비스에 대한 콜백 개체를 제공하기 위해 클라이언트 애플리케이션이 구현해야 하는 콜백 계약을 지정합니다. 콜백 개체는 전체 서비스가 아니지만(예: 콜백 개체를 사용하여 채널을 시작할 수 없음) 구현 및 구성을 위해 일종의 서비스로 간주할 수 있습니다.

이중 서비스의 클라이언트는 다음을 수행해야 합니다.

  • 콜백 계약 클래스를 구현합니다.

  • 콜백 계약 구현 클래스의 인스턴스를 생성하고, 이를 사용하여 WCF 클라이언트 생성자에 전달할 System.ServiceModel.InstanceContext 개체를 만드십시오.

  • 작업을 호출하고 작업 콜백을 처리합니다.

이중 WCF 클라이언트 개체는 콜백 서비스의 구성을 포함하여 콜백을 지원하는 데 필요한 기능을 노출한다는 점을 제외하고 비듀플렉스 개체처럼 작동합니다.

예를 들어, 콜백 클래스에서 System.ServiceModel.CallbackBehaviorAttribute 특성의 속성을 사용하여 콜백 객체의 런타임 동작의 다양한 측면을 제어할 수 있습니다. 또 다른 예는 콜백 개체를 호출하는 서비스에 예외 정보를 반환할 수 있도록 클래스를 사용하는 System.ServiceModel.Description.CallbackDebugBehavior 것입니다. 자세한 내용은 Duplex Services를 참조하세요. 전체 샘플은 Duplex를 참조하십시오.

IIS(인터넷 정보 서비스) 5.1을 실행하는 Windows XP 컴퓨터에서 이중 클라이언트는 클래스를 사용하여 System.ServiceModel.WSDualHttpBinding 클라이언트 기본 주소를 지정해야 합니다. 그렇지 않으면 예외가 throw됩니다. 다음 코드 예제에서는 코드에서 이 작업을 수행하는 방법을 보여줍니다.

WSDualHttpBinding dualBinding = new WSDualHttpBinding();
EndpointAddress endptadr = new EndpointAddress("http://localhost:12000/DuplexTestUsingCode/Server");
dualBinding.ClientBaseAddress = new Uri("http://localhost:8000/DuplexTestUsingCode/Client/");

Dim dualBinding As New WSDualHttpBinding()
Dim endptadr As New EndpointAddress("http://localhost:12000/DuplexTestUsingCode/Server")
dualBinding.ClientBaseAddress = New Uri("http://localhost:8000/DuplexTestUsingCode/Client/")

다음 코드는 구성 파일에서 이 작업을 수행하는 방법을 보여줍니다.

<client>
  <endpoint
    name ="ServerEndpoint"
    address="http://localhost:12000/DuplexUsingConfig/Server"
    bindingConfiguration="WSDualHttpBinding_IDuplex"
    binding="wsDualHttpBinding"
    contract="IDuplex"
/>
</client>
<bindings>
  <wsDualHttpBinding>
    <binding
      name="WSDualHttpBinding_IDuplex"
      clientBaseAddress="http://localhost:8000/myClient/"
    />
  </wsDualHttpBinding>
</bindings>

비동기적으로 서비스 호출

작업을 호출하는 방법은 전적으로 클라이언트 개발자에게 달려 있습니다. 이는 관리 코드로 표현될 때 작업을 구성하는 메시지를 동기 또는 비동기 메서드에 매핑할 수 있기 때문입니다. 따라서 작업을 비동기적으로 호출하는 클라이언트를 빌드하려는 경우 Svcutil.exe 사용하여 옵션을 사용하여 /async 비동기 클라이언트 코드를 생성할 수 있습니다. 자세한 내용은 방법: 비동기적으로 서비스 작업 호출을 참조하세요.

WCF 클라이언트 채널을 사용하여 서비스 호출

WCF 클라이언트 형식은 기본 채널 시스템을 노출하기 위해 ClientBase<TChannel> 인터페이스에서 파생된 System.ServiceModel.IClientChannel를 확장합니다. System.ServiceModel.ChannelFactory<TChannel> 클래스를 사용하여 대상 서비스 계약으로 서비스를 호출할 수 있습니다. 자세한 내용은 WCF 클라이언트 아키텍처를 참조하세요.

참고하십시오