Aracılığıyla paylaş


İstemci Kanal Düzeyi Programlama

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 . Hizmet Kanalı Düzeyinde 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 oluşturmak System.ServiceModel.Channels.IChannelListeneryerine, bu kez tür parametresinin System.ServiceModel.Channels.IRequestChannelolduğu bağlamayı çağırarak ChannelFactory.CreateFactory bir System.ServiceModel.ChannelFactory<TChannel> 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 IRequestChanneloluşturmak için öğesini çağırırızChannelFactory<TChannel>.CreateChannel. 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 için Açık olarak çağırırı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ürdüğünde, uç noktanın yanıtının ne olduğunu öğrenmek için okuyabildiğimiz bir yanıt iletimiz olur.

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: {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