Aracılığıyla paylaş


İstemci Programlama Channel-Level

Bu konuda, sınıfı ve ilişkili nesne modelini kullanmadan bir Windows Communication Foundation (WCF) istemci uygulamasının System.ServiceModel.ClientBase<TChannel> nasıl yazıldığı açıklanmaktadır.

İleti Gönderme

İleti göndermeye, yanıtları almaya ve işlemeye hazır olmak için aşağıdaki adımlar gereklidir:

  1. Bağlama oluşturun.

  2. Kanal fabrikası oluşturun.

  3. Bir kanal oluşturun.

  4. bir istek gönderin ve yanıtı okuyun.

  5. Tüm kanal nesnelerini kapatın.

Bağlama Oluşturma

Alıcı duruma benzer şekilde (bkz . Service Channel-Level Programlama), ileti gönderme işlemi bir bağlama oluşturarak başlar. Bu örnek yeni System.ServiceModel.Channels.CustomBinding bir oluşturur ve Elements koleksiyonuna bir System.ServiceModel.Channels.HttpTransportBindingElement ekler.

ChannelFactory Oluşturma

Bir System.ServiceModel.Channels.IChannelListener oluşturmak yerine, tür parametresinin System.ServiceModel.ChannelFactory<TChannel> olduğu bağlamada ChannelFactory.CreateFactory çağrısı yaparak bir System.ServiceModel.Channels.IRequestChannel oluştururuz. Kanal dinleyicileri gelen iletileri bekleyen taraf tarafından kullanılırken, kanal fabrikaları kanalı oluşturmak için iletişimi başlatan taraf tarafından kullanılır. Kanal dinleyicileri gibi kanal fabrikalarının da kullanılabilmesi için önce açılması gerekir.

Kanal Oluşturma

Ardından bir ChannelFactory<TChannel>.CreateChannel oluşturmak için IRequestChannel öğesini çağırırız. Bu çağrı, oluşturulan yeni kanalı kullanarak iletişim kurmak istediğimiz uç noktanın adresini alır. Bir kanalımız olduğunda, iletişim için hazır duruma getirmek üzere üzerinde Open çağrısını yaparız. Taşımanın yapısına bağlı olarak, Open çağrısı hedef uç noktayla bir bağlantı başlatabilir veya ağda hiçbir şey yapamaz.

İstek Gönderme ve Yanıtı Okuma

Açık bir kanalımız olduğunda bir ileti oluşturabilir ve isteği göndermek ve yanıtın geri gelmesini beklemek için kanalın İstek yöntemini kullanabiliriz. Bu yöntem döndüğünde, okuyarak uç noktanın yanıtının ne olduğunu öğrenebileceğimiz bir yanıt iletisine sahip oluruz.

Nesneleri Kapatma

Kaynakların sızmasını önlemek için, iletişimlerde kullanılan nesneleri artık gerekli olmadığında kapatırız.

Aşağıdaki kod örneği, ileti göndermek ve yanıtı okumak için kanal fabrikasını kullanan temel bir istemciyi gösterir.

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: {replymessage.Headers.Action}");
        string data = replymessage.GetBody<string>();
        Console.WriteLine($"Reply content: {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