다음을 통해 공유


클라이언트를 사용하여 서비스에 액세스

클라이언트 애플리케이션은 WCF 클라이언트 또는 채널 개체를 만들고 구성하고 사용하여 서비스와 통신해야 합니다. WCF 클라이언트 개요 항목에서는 기본 클라이언트 및 채널 개체를 만들고 사용하는 데 관련된 개체 및 단계에 대한 개요를 제공합니다.

이 항목에서는 시나리오에 따라 유용할 수 있는 클라이언트 애플리케이션 및 클라이언트 및 채널 개체와 관련된 몇 가지 문제에 대한 자세한 정보를 제공합니다.

개요

이 항목에서는 다음과 관련된 동작 및 문제에 대해 설명합니다.

  • 채널 및 세션 수명.

  • 예외 처리

  • 차단 문제를 이해합니다.

  • 대화형으로 채널 초기화

채널 및 세션 수명

WCF(Windows Communication Foundation) 애플리케이션에는 데이터그램과 세션 채널의 두 가지 범주가 포함되어 있습니다.

데이터그램 채널은 모든 메시지가 상호 관련되지 않는 채널입니다. 데이터그램 채널을 사용하면 입력 또는 출력 작업이 실패하는 경우 다음 작업은 일반적으로 영향을 받지 않으며 동일한 채널을 다시 사용할 수 있습니다. 이 때문에 데이터그램 채널은 일반적으로 오류가 없습니다.

그러나 세션 채널은 다른 엔드포인트에 연결된 채널입니다. 한쪽 세션의 메시지는 항상 다른 쪽의 동일한 세션과 상호 연결됩니다. 또한 세션의 두 참가자는 해당 세션이 성공으로 간주되기 위해 대화 요구 사항이 충족되었다는 데 동의해야 합니다. 동의할 수 없는 경우 세션 채널에 오류가 발생할 수 있습니다.

첫 번째 작업을 호출하여 명시적으로 또는 암시적으로 클라이언트를 엽니다.

비고

알림을 받을 때 세션 구현에 따라 달라지므로 오류가 발생한 세션 채널을 명시적으로 검색하는 것은 일반적으로 유용하지 않습니다. 예를 들어, System.ServiceModel.NetTcpBinding (신뢰할 수 있는 세션이 사용되지 않을 때) TCP 연결의 세션이 노출되므로 서비스 또는 클라이언트에서 ICommunicationObject.Faulted 이벤트를 수신 대기하면 네트워크 장애가 발생할 경우 빠르게 알림을 받을 가능성이 높습니다. 그러나 신뢰할 수 있는 세션(활성화된 System.ServiceModel.Channels.ReliableSessionBindingElement 바인딩에 의해 설정됨)은 작은 네트워크 오류로부터 서비스를 격리하도록 설계되었습니다. 적절한 기간 내에 세션을 다시 설정할 수 있는 경우 신뢰할 수 있는 세션에 대해 구성된 동일한 바인딩은 중단이 더 긴 기간 동안 계속될 때까지 오류가 발생하지 않을 수 있습니다.

대부분의 시스템 제공 바인딩(애플리케이션 계층에 채널을 노출)은 기본적으로 세션을 사용하지만 System.ServiceModel.BasicHttpBinding 그렇지 않습니다. 자세한 내용은 세션 사용을 참조하세요.

적절한 세션 사용

세션은 전체 메시지 교환이 완료되었는지와 양측이 성공한 것으로 간주했는지를 알 수 있는 방법을 제공합니다. 호출 애플리케이션이 채널을 열고, 사용하고, 하나의 try 블록 내에서 채널을 닫는 것이 좋습니다. 세션 채널이 열려 있고 메서드가 ICommunicationObject.Close 한 번 호출되고 해당 호출이 성공적으로 반환되면 세션이 성공했습니다. 이 경우의 성공은 지정된 바인딩의 모든 배달 보장이 충족되고, 다른 쪽이 ICommunicationObject.Abort를 호출하기 전에 채널에서 Close를 호출하지 않았음을 의미합니다.

다음 섹션에서는 이 클라이언트 접근 방식의 예를 제공합니다.

예외 처리

클라이언트 애플리케이션에서 예외를 처리하는 것은 간단합니다. try 블록 내부에서 채널을 열고 사용하고 닫는 작업이 이루어진 경우, 예외가 발생하지 않으면 작업이 성공합니다. 일반적으로 예외가 발생하면 대화가 중단됩니다.

비고

Visual Basic에서는 using 문(Using 문)을 사용하는 것이 권장되지 않습니다. 구문 끝 using 는 알아야 할 다른 예외를 숨길 수 있는 예외를 발생시킬 수 있기 때문입니다. 자세한 내용은 닫기 및 중단을 사용하여 WCF 클라이언트 리소스를 해제하는 방법을 참조하세요.

다음 코드 예제에서는 using 문을 사용하지 않고 try/catch 블록을 사용하는 권장 클라이언트 패턴을 보여줍니다.

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using Microsoft.WCF.Documentation;

public class Client
{
  public static void Main()
  {
    // Picks up configuration from the config file.
    SampleServiceClient wcfClient = new SampleServiceClient();
    try
    {
      // Making calls.
      Console.WriteLine("Enter the greeting to send: ");
      string greeting = Console.ReadLine();
      Console.WriteLine("The service responded: " + wcfClient.SampleMethod(greeting));

      Console.WriteLine("Press ENTER to exit:");
      Console.ReadLine();

      // Done with service.
      wcfClient.Close();
      Console.WriteLine("Done!");
    }
    catch (TimeoutException timeProblem)
    {
      Console.WriteLine("The service operation timed out. " + timeProblem.Message);
      Console.ReadLine();
      wcfClient.Abort();
    }
    catch (FaultException<GreetingFault> greetingFault)
    {
      Console.WriteLine(greetingFault.Detail.Message);
      Console.ReadLine();
      wcfClient.Abort();
    }
    catch (FaultException unknownFault)
    {
      Console.WriteLine("An unknown exception was received. " + unknownFault.Message);
      Console.ReadLine();
      wcfClient.Abort();
    }
    catch (CommunicationException commProblem)
    {
      Console.WriteLine("There was a communication problem. " + commProblem.Message + commProblem.StackTrace);
      Console.ReadLine();
      wcfClient.Abort();
    }
  }
}

Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports Microsoft.WCF.Documentation

Public Class Client
    Public Shared Sub Main()
        ' Picks up configuration from the config file.
        Dim wcfClient As New SampleServiceClient()
        Try
            ' Making calls.
            Console.WriteLine("Enter the greeting to send: ")
            Dim greeting As String = Console.ReadLine()
            Console.WriteLine("The service responded: " & wcfClient.SampleMethod(greeting))

            Console.WriteLine("Press ENTER to exit:")
            Console.ReadLine()

            ' Done with service. 
            wcfClient.Close()
            Console.WriteLine("Done!")
        Catch timeProblem As TimeoutException
            Console.WriteLine("The service operation timed out. " & timeProblem.Message)
            Console.ReadLine()
            wcfClient.Abort()
        Catch greetingFault As FaultException(Of GreetingFault)
            Console.WriteLine(greetingFault.Detail.Message)
            Console.ReadLine()
            wcfClient.Abort()
        Catch unknownFault As FaultException
            Console.WriteLine("An unknown exception was received. " & unknownFault.Message)
            Console.ReadLine()
            wcfClient.Abort()
        Catch commProblem As CommunicationException
            Console.WriteLine("There was a communication problem. " & commProblem.Message + commProblem.StackTrace)
            Console.ReadLine()
            wcfClient.Abort()
        End Try
    End Sub
End Class

비고

속성의 ICommunicationObject.State 값을 확인하는 것은 경합 상태이며 채널을 다시 사용하거나 닫을지 여부를 결정하는 것은 권장되지 않습니다.

데이터그램 채널은 닫혀 있을 때 예외가 발생하더라도 오류가 발생하지 않습니다. 또한 보안 대화를 사용하여 인증하지 못하는 비듀플렉스 클라이언트는 일반적으로 System.ServiceModel.Security.MessageSecurityException을(를) 던집니다. 그러나 보안 대화를 사용하는 이중 클라이언트가 인증에 실패하면 클라이언트는 System.TimeoutException를 받게 됩니다.

애플리케이션 수준에서 오류 정보를 사용하는 방법에 대한 자세한 내용은 계약 및 서비스에서 오류 지정 및 처리를 참조하세요. 예상 예외는 예상되는 예외를 설명하고 이를 처리하는 방법을 보여 줍니다. 채널을 개발할 때 오류를 처리하는 방법에 대한 자세한 내용은 예외 및 오류 처리를 참조하세요.

클라이언트 차단 및 성능

애플리케이션이 요청-응답 작업을 동기적으로 호출하면 반환 값이 수신되거나 예외(System.TimeoutException와 같은 예외)가 throw될 때까지 클라이언트가 차단됩니다. 이 동작은 로컬 동작과 유사합니다. 애플리케이션이 WCF 클라이언트 개체 또는 채널에서 작업을 동기적으로 호출하는 경우 채널 계층이 데이터를 네트워크에 쓸 때까지 또는 예외가 throw될 때까지 클라이언트가 반환되지 않습니다. 단방향 메시지 교환 패턴(작업을 OperationContractAttribute.IsOneWay 설정 true으로 표시하여 지정됨)은 일부 클라이언트의 응답성을 높일 수 있지만 바인딩 및 이미 전송된 메시지에 따라 단방향 작업도 차단할 수 있습니다. 단방향 작업은 메시지 교환에만 해당합니다. 자세한 내용은 One-Way Services를 참조하세요.

큰 데이터 청크는 메시지 교환 패턴에 관계없이 클라이언트 처리 속도를 늦출 수 있습니다. 이러한 문제를 처리하는 방법을 이해하려면 큰 데이터 및 스트리밍을 참조하세요.

작업이 완료되는 동안 애플리케이션이 더 많은 작업을 수행해야 하는 경우 WCF 클라이언트가 구현하는 서비스 계약 인터페이스에 비동기 메서드 쌍을 만들어야 합니다. 이 작업을 수행하는 가장 쉬운 방법은 /async에서 스위치를 사용하는 것입니다. 예를 들어 방법 : 비동기적으로 서비스 작업 호출을 참조하세요.

클라이언트 성능 향상에 대한 자세한 내용은 Middle-Tier 클라이언트 애플리케이션을 참조하세요.

사용자가 동적으로 자격 증명을 선택할 수 있도록 설정

IInteractiveChannelInitializer 인터페이스를 사용하면 애플리케이션에서 시간 제한 타이머가 시작되기 전에 채널이 만들어지는 자격 증명을 선택할 수 있는 사용자 인터페이스를 표시할 수 있습니다.

애플리케이션 개발자는 두 가지 방법으로 삽입된 IInteractiveChannelInitializer 항목을 사용할 수 있습니다. 클라이언트 애플리케이션은 채널을 열기 전에 ClientBase<TChannel>.DisplayInitializationUI 또는 IClientChannel.DisplayInitializationUI (또는 비동기 버전)을 호출할 수 있습니다(명시적 접근 방식) 또는 첫 번째 작업을 호출할 수 있습니다(암시적 접근 방식).

암시적 접근 방식을 사용하는 경우 애플리케이션은 ClientBase<TChannel> 또는 IClientChannel 확장에서 첫 번째 작업을 호출해야 합니다. 첫 번째 작업이 아닌 다른 작업을 호출하면 예외가 발생합니다.

명시적 접근 방식을 사용하는 경우 애플리케이션은 다음 단계를 순서대로 수행해야 합니다.

  1. ClientBase<TChannel>.DisplayInitializationUI 또는 IClientChannel.DisplayInitializationUI (또는 비동기 버전)을 호출하십시오.

  2. 이니셜라이저가 반환되면, Open 개체의 메서드 IClientChannel를 호출하거나, IClientChannel 속성에서 반환된 ClientBase<TChannel>.InnerChannel 개체의 메서드 IClientChannel를 호출하십시오.

  3. 호출 작업.

프로덕션 품질 애플리케이션은 명시적 접근 방식을 채택하여 사용자 인터페이스 프로세스를 제어하는 것이 좋습니다.

암시적 접근 방식을 사용하는 애플리케이션은 사용자 인터페이스 이니셜라이저를 호출하지만 애플리케이션 사용자가 바인딩의 송신 시간 제한 기간 내에 응답하지 못하면 사용자 인터페이스가 반환되면 예외가 throw됩니다.

참고하십시오