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:
Membuat pengikatan.
Membangun pabrik saluran.
Membuat saluran.
Mengirim permintaan dan membaca balasan.
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