다음을 통해 공유


클라이언트 채널 수준 프로그래밍

이 항목에서는 System.ServiceModel.ClientBase<TChannel> 클래스 및 관련 개체 모델을 사용하지 않고 WCF(Windows Communication Foundation) 클라이언트 애플리케이션을 작성하는 방법에 대해 설명합니다.

메시지 보내기

메시지를 보낸 다음 회신을 받고 처리할 준비를 하려면 다음 단계가 필요합니다.

  1. 바인딩을 만듭니다.

  2. 채널 팩터리를 빌드합니다.

  3. 채널을 만듭니다.

  4. 요청을 보내고 회신을 읽습니다.

  5. 모든 채널 개체를 닫습니다.

바인딩 만들기

수신하는 경우(서비스 채널 수준 프로그래밍 참조)와 유사하며 바인딩을 만들어 메시지 보내기를 시작합니다. 이 예제에서는 새 System.ServiceModel.Channels.CustomBinding을 만들고 System.ServiceModel.Channels.HttpTransportBindingElement를 요소 컬렉션에 추가합니다.

ChannelFactory 빌드

이번에는 System.ServiceModel.Channels.IChannelListener를 만드는 대신 형식 매개 변수가 System.ServiceModel.ChannelFactory<TChannel>인 바인딩에서 ChannelFactory.CreateFactory를 호출하여 System.ServiceModel.Channels.IRequestChannel를 만듭니다. 채널 수신기는 들어오는 메시지를 기다리는 측에서 사용하는 반면에 채널 팩터리는 채널을 만들기 위해 통신을 시작하는 측에서 사용합니다. 채널 수신기에서처럼 채널 팩터리를 사용하기 전에 먼저 열어야 합니다.

채널 만들기

ChannelFactory<TChannel>.CreateChannel을 호출하여 IRequestChannel을 만듭니다. 이 호출을 통해 만들려는 새 채널을 사용하여 통신할 엔드포인트의 주소를 가져옵니다. 채널이 있는 경우 채널에서 열기를 호출하여 통신 준비 상태로 설정합니다. 전송 특성에 따라 이 열기 호출을 통해 대상 엔드포인트와 연결을 시작하거나 네트워크 상에서 아무것도 수행하지 않을 수 있습니다.

요청 보내기 및 회신 읽기

채널이 열린 상태이면 메시지를 만들고 채널 요청 메서드를 사용하여 해당 요청을 보낸 다음 수신할 회신을 기다릴 수 있습니다. 이 메서드가 반환되면 엔드포인트의 회신이 무엇인지 찾기 위해 읽을 수 있는 회신 메시지를 제공 받습니다.

개체 닫기

리소스 누수를 방지하기 위해 통신에서 사용되는 개체가 더 이상 필요 없는 경우 닫습니다.

다음 코드 예제에서는 메시지를 보내고 회신을 읽기 위해 채널 팩터리를 사용하는 기본 클라이언트를 보여 줍니다.

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Configuration;
namespace ProgrammingChannels
{
class Client
{

    static void RunClient()
    {
        //Step1: Create a binding with just HTTP.
        BindingElement[] bindingElements = new BindingElement[2];
        bindingElements[0] = new TextMessageEncodingBindingElement();
        bindingElements[1] = new HttpTransportBindingElement();
        CustomBinding binding = new CustomBinding(bindingElements);

        //Step2: Use the binding to build the channel factory.
        IChannelFactory<IRequestChannel> factory =
        binding.BuildChannelFactory<IRequestChannel>(
                         new BindingParameterCollection());
        //Open the channel factory.
        factory.Open();

        //Step3: Use the channel factory to create a channel.
        IRequestChannel channel = factory.CreateChannel(
           new EndpointAddress("http://localhost:8080/channelapp"));
        channel.Open();

        //Step4: Create a message.
        Message requestmessage = Message.CreateMessage(
            binding.MessageVersion,
            "http://contoso.com/someaction",
             "This is the body data");
        //Send message.
        Message replymessage = channel.Request(requestmessage);
        Console.WriteLine("Reply message received");
        Console.WriteLine("Reply action: {0}",
                              replymessage.Headers.Action);
        string data = replymessage.GetBody<string>();
        Console.WriteLine("Reply content: {0}", data);

        //Step5: Do not forget to close the message.
        replymessage.Close();
        //Do not forget to close the channel.
        channel.Close();
        //Do not forget to close the factory.
        factory.Close();
    }
    public static void Main()
    {
        Console.WriteLine("Press [ENTER] when service is ready");
        Console.ReadLine();
        RunClient();
        Console.WriteLine("Press [ENTER] to exit");
        Console.ReadLine();
    }
}
}

Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports System.ServiceModel.Configuration

Namespace ProgrammingChannels
    Friend Class Client

        Private Shared Sub RunClient()
            'Step1: Create a binding with just HTTP.
            Dim bindingElements(1) As BindingElement = {New TextMessageEncodingBindingElement(), _
                                                        New HttpTransportBindingElement()}
            Dim binding As New CustomBinding(bindingElements)

            'Step2: Use the binding to build the channel factory.
            Dim factory = binding.BuildChannelFactory(Of IRequestChannel)(New BindingParameterCollection())
            'Open the channel factory.
            factory.Open()

            'Step3: Use the channel factory to create a channel.
            Dim channel = factory.CreateChannel(New EndpointAddress("http://localhost:8080/channelapp"))
            channel.Open()

            'Step4: Create a message.
            Dim requestmessage = Message.CreateMessage(binding.MessageVersion, _
                                                       "http://contoso.com/someaction", _
                                                       "This is the body data")
            'Send message.
            Dim replymessage = channel.Request(requestmessage)
            Console.WriteLine("Reply message received")
            Console.WriteLine("Reply action: {0}", replymessage.Headers.Action)
            Dim data = replymessage.GetBody(Of String)()
            Console.WriteLine("Reply content: {0}", data)

            'Step5: Do not forget to close the message.
            replymessage.Close()
            'Do not forget to close the channel.
            channel.Close()
            'Do not forget to close the factory.
            factory.Close()
        End Sub

        Public Shared Sub Main()

            Console.WriteLine("Press [ENTER] when service is ready")
            Console.ReadLine()
            RunClient()
            Console.WriteLine("Press [ENTER] to exit")
            Console.ReadLine()

        End Sub
    End Class
End Namespace