Bagikan melalui


Pemrograman Tingkat Saluran Klien

Topik ini menjelaskan cara menulis aplikasi klien Windows Communication Foundation (WCF) tanpa menggunakan kelas System.ServiceModel.ClientBase<TChannel> dan model objek terkaitnya.

Mengirim Pesan

Agar siap mengirim pesan dan menerima serta memproses balasan, langkah-langkah berikut diperlukan:

  1. Membuat pengikatan.

  2. Membangun pabrik saluran.

  3. Membuat saluran.

  4. Mengirim permintaan dan membaca balasan.

  5. Menutup semua objek saluran.

Membuat Pengikatan

Mirip dengan kasus penerimaan (lihat Pemrograman Tingkat Saluran Layanan), mengirim pesan dimulai dengan membuat pengikatan. Contoh ini membuat System.ServiceModel.Channels.CustomBinding baru dan menambahkan System.ServiceModel.Channels.HttpTransportBindingElement ke koleksi Elemen-nya.

Membangun ChannelFactory

Sebagai ganti membuat System.ServiceModel.Channels.IChannelListener, kali ini kita membuat System.ServiceModel.ChannelFactory<TChannel> dengan memanggil ChannelFactory.CreateFactory pada pengikatan yang parameter jenisnya adalah System.ServiceModel.Channels.IRequestChannel. Sementara pendengar saluran digunakan oleh sisi yang menunggu pesan masuk, pabrik saluran digunakan oleh sisi yang memulai komunikasi untuk membuat saluran. Sama seperti pendengar saluran, pabrik saluran harus dibuka terlebih dahulu sebelum bisa digunakan.

Membuat Saluran

Kita kemudian memanggil ChannelFactory<TChannel>.CreateChannel untuk membuat IRequestChannel. Panggilan ini mengambil alamat titik akhir yang ingin kita komunikasikan menggunakan saluran baru yang sedang dibuat. Setelah memiliki saluran, kita memanggil Buka di atasnya untuk memasukkannya ke dalam keadaan siap untuk komunikasi. Bergantung pada sifat transportasi, panggilan ke Buka ini dapat memulai koneksi dengan titik akhir target atau mungkin tidak melakukan apa pun di jaringan.

Mengirim Permintaan dan Membaca Balasan

Setelah memiliki saluran yang dibuka, kami dapat membuat pesan dan menggunakan metode Permintaan saluran untuk mengirim permintaan dan menunggu balasan kembali. Saat metode ini tampil, kita memiliki pesan balasan yang dapat dibaca untuk mengetahui balasan titik akhir.

Menutup Objek

Untuk menghindari kebocoran sumber daya, kita menutup objek yang digunakan dalam komunikasi jika tidak lagi diperlukan.

Contoh kode berikut menunjukkan klien dasar menggunakan pabrik saluran untuk mengirim pesan dan membaca balasannya.

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