Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Topik ini menjelaskan cara menulis aplikasi klien Windows Communication Foundation (WCF) tanpa menggunakan System.ServiceModel.ClientBase<TChannel> kelas dan model objek terkait.
Mengirim Pesan
Agar siap mengirim pesan dan menerima serta memproses balasan, langkah-langkah berikut diperlukan:
Buat pengikatan.
Membangun pabrik saluran.
Buat saluran.
Kirim permintaan dan baca balasannya.
Tutup semua objek saluran.
Membuat Pengikatan
Mirip dengan kasus penerimaan (lihat Pemrograman Channel-Level Layanan), mengirim pesan dimulai dengan membuat pengikatan. Contoh ini membuat baru System.ServiceModel.Channels.CustomBinding dan menambahkan System.ServiceModel.Channels.HttpTransportBindingElement ke koleksi Elements-nya.
Membangun ChannelFactory
Alih-alih membuat System.ServiceModel.Channels.IChannelListener, kali ini kita membuat System.ServiceModel.ChannelFactory<TChannel> dengan memanggil ChannelFactory.CreateFactory pada pengikatan di mana parameter jenis 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 dapat digunakan.
Membuat Saluran
Kami 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 kita memiliki saluran, kita menggunakan Open pada saluran tersebut untuk menempatkannya dalam keadaan siap untuk komunikasi. Tergantung pada sifat transpor, pemanggilan fungsi "Open" ini dapat memulai koneksi dengan titik akhir target atau mungkin tidak melakukan tindakan apa pun di jaringan.
Mengirim Permintaan dan Membaca Balasan
Setelah kami memiliki saluran yang dibuka, kami dapat membuat pesan dan menggunakan metode Permintaan saluran untuk mengirim permintaan dan menunggu balasan kembali. Ketika metode ini kembali, kita memiliki pesan balasan yang dapat kita baca untuk mengetahui apa balasan titik akhir itu.
Penutupan Objek
Untuk menghindari kebocoran sumber daya, kami menutup objek yang digunakan dalam komunikasi ketika tidak lagi diperlukan.
Contoh kode berikut menunjukkan klien dasar yang menggunakan fabrik saluran untuk mengirim pesan dan membaca balasan.
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