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.
Sampel Transport UDP menunjukkan cara menerapkan unicast dan multicast UDP sebagai transport kustom untuk Windows Communication Foundation (WCF). Sampel menjelaskan prosedur yang direkomendasikan untuk membuat transportasi kustom di WCF, dengan menggunakan kerangka kerja saluran dan mengikuti praktik terbaik WCF. Langkah-langkah untuk membuat transportasi kustom adalah sebagai berikut:
Tentukan Pola Pertukaran Pesan saluran mana (IOutputChannel, IInputChannel, IDuplexChannel, IRequestChannel, atau IReplyChannel) yang akan didukung ChannelFactory dan ChannelListener Anda. Kemudian putuskan apakah Anda akan mendukung variasi sesi antarmuka ini.
Buat pabrik saluran dan pendengar yang mendukung Pola Pertukaran Pesan Anda.
Pastikan bahwa setiap pengecualian khusus jaringan dinormalisasi ke kelas turunan yang sesuai dari CommunicationException.
<Tambahkan elemen pengikatan> yang menambahkan transportasi kustom ke tumpukan saluran. Untuk informasi selengkapnya, lihat Menambahkan Elemen Pengikatan.
Tambahkan bagian ekstensi elemen pengikatan untuk mengekspos elemen pengikatan baru ke sistem konfigurasi.
Tambahkan ekstensi metadata untuk mengomunikasikan kemampuan ke titik akhir lainnya.
Tambahkan pengikatan yang mengonfigurasi sebelumnya seperangkat elemen pengikatan sesuai dengan profil yang sudah terdefinisi dengan baik. Untuk informasi selengkapnya, lihat Menambahkan Pengikatan Standar.
Tambahkan bagian pengikatan dan elemen konfigurasi pengikatan untuk mengekspos pengikatan ke sistem konfigurasi. Untuk informasi selengkapnya, lihat Menambahkan Dukungan Konfigurasi.
Pola Pertukaran Pesan
Langkah pertama dalam menulis transportasi kustom adalah memutuskan Pola Pertukaran Pesan (MEP) mana yang diperlukan untuk transportasi. Ada tiga MEP yang dapat dipilih:
Datagram (IInputChannel/IOutputChannel)
Saat menggunakan suatu MEP datagram, klien mengirim pesan menggunakan pertukaran "sekali kirim, langsung lupakan". Pertukaran sekali kirim, langsung selesai adalah pertukaran yang membutuhkan konfirmasi di luar jalur untuk pengiriman yang berhasil. Pesan mungkin hilang saat transit dan tidak pernah mencapai layanan. Jika operasi pengiriman berhasil diselesaikan di akhir klien, itu tidak menjamin bahwa titik akhir jarak jauh telah menerima pesan. Datagram adalah blok penyusun mendasar untuk olahpesan, karena Anda dapat membangun protokol Anda sendiri di atasnya—termasuk protokol yang andal dan protokol yang aman. Saluran datagram klien mengimplementasikan IOutputChannel antarmuka dan saluran datagram layanan mengimplementasikan IInputChannel antarmuka.
Request-Response (IRequestChannel/IReplyChannel)
Dalam MEP ini, pesan dikirim, dan balasan diterima. Pola ini terdiri dari pasangan permintaan-respons. Contoh panggilan permintaan-penjawaban adalah panggilan prosedur jarak jauh (RPC) dan permintaan GET dari browser. Pola ini juga dikenal sebagai Half-Duplex. Dalam MEP ini, saluran klien menerapkan IRequestChannel dan saluran layanan mengimplementasikan IReplyChannel.
Dupleks (IDuplexChannel)
MEP dupleks memungkinkan sejumlah pesan secara sewenang-wenang dikirim oleh klien dan diterima dalam urutan yang tidak ditentukan. MEP dupleks mirip dengan percakapan telepon, di mana setiap kata yang diucapkan adalah sebuah pesan. Karena kedua belah pihak dapat mengirim dan menerima dalam MEP ini, antarmuka yang diterapkan oleh klien dan saluran layanan adalah IDuplexChannel.
Masing-masing MEP ini juga dapat mendukung sesi. Fungsionalitas tambahan yang disediakan oleh saluran sadar sesi adalah menghubungkan semua pesan yang dikirim dan diterima di saluran. Pola Request-Response adalah sesi dua pesan yang berdiri sendiri, karena permintaan dan balasan berkorelasi. Sebaliknya, pola Request-Response yang mendukung sesi menyiratkan bahwa semua pasangan permintaan/respons pada saluran tersebut berkorelasi satu sama lain. Ini memberikan Anda total enam jenis MEP—Datagram, Permintaan-Respon, Duplex, Datagram dengan sesi, Request-Response dengan sesi, dan Duplex dengan sesi—untuk dipilih.
Nota
Untuk transportasi UDP, satu-satunya MEP yang didukung adalah Datagram, karena UDP secara inheren merupakan protokol "fire and forget".
Siklus hidup objek ICommunicationObject dan WCF
WCF memiliki komputer status umum yang digunakan untuk mengelola siklus hidup objek seperti IChannel, IChannelFactory, dan IChannelListener yang digunakan untuk komunikasi. Ada lima status di mana objek komunikasi ini dapat ada. Status-status ini diwakili oleh CommunicationState enumerasi, dan sebagai berikut:
Dibuat: Ini adalah status ICommunicationObject saat pertama kali dibuat. Tidak ada input/output (I/O) yang terjadi dalam status ini.
Pembukaan: Transisi objek ke status ini ketika Open dipanggil. Pada titik ini properti dibuat tidak dapat diubah, dan input/output dapat dimulai. Transisi ini hanya valid dari status Dibuat.
Dibuka: Transisi objek ke status ini ketika proses terbuka selesai. Transisi ini hanya berlaku dari status Pembukaan. Pada titik ini, objek sepenuhnya dapat digunakan untuk ditransfer.
Penutupan: Objek beralih ke status ini ketika Close dipanggil untuk mematikan secara lembut. Transisi ini hanya berlaku dari status Dibuka.
Dalam Status Tertutup: Dalam status ini, objek tidak lagi dapat digunakan. Secara umum, sebagian besar konfigurasi masih dapat diakses untuk inspeksi, tetapi tidak ada komunikasi yang dapat terjadi. Status ini setara dengan yang dibuang.
Rusak: Dalam status Rusak, objek dapat diakses oleh inspeksi tetapi tidak lagi dapat digunakan. Ketika kesalahan yang tidak dapat dipulihkan terjadi, objek beralih ke status ini. Satu-satunya transisi yang valid dari status ini adalah ke dalam status
Closed
.
Ada peristiwa yang dipicu untuk setiap perubahan status. Metode ini Abort dapat dipanggil kapan saja, dan menyebabkan objek segera beralih dari statusnya saat ini ke status Tertutup. Panggilan Abort mengakhiri pekerjaan yang belum selesai.
Channel Factory dan Channel Listener
Langkah selanjutnya dalam menulis transportasi kustom adalah membuat implementasi IChannelFactory untuk saluran klien dan IChannelListener untuk saluran layanan. Lapisan saluran menggunakan pola pabrik untuk membangun saluran. WCF menyediakan pembantu kelas dasar untuk proses ini.
Kelas CommunicationObject mengimplementasikan ICommunicationObject dan memberlakukan komputer status yang dijelaskan sebelumnya di Langkah 2.
Kelas ChannelManagerBase mengimplementasikan CommunicationObject dan menyediakan kelas dasar terpadu untuk ChannelFactoryBase dan ChannelListenerBase. Kelas ChannelManagerBase ini bekerja bersama dengan ChannelBase, yang merupakan kelas dasar yang mengimplementasikan IChannel.
Kelas ChannelFactoryBase mengimplementasikan ChannelManagerBase dan IChannelFactory dan mengonsolidasikan kelebihan beban
CreateChannel
menjadi satu metode abstrakOnCreateChannel
.Kelas ChannelListenerBase mengimplementasikan IChannelListener. Ini mengurus manajemen keadaan dasar.
Dalam sampel ini, implementasi pabrik terkandung dalam UdpChannelFactory.cs dan implementasi pendengar terkandung dalam UdpChannelListener.cs. Implementasi IChannel terdapat dalam UdpOutputChannel.cs dan UdpInputChannel.cs.
The UDP Channel Factory
Berasal UdpChannelFactory
dari ChannelFactoryBase. Sampel mengambil alih GetProperty untuk menyediakan akses ke versi pengkode pesan dari encoder pesan. Sampel juga menggantikan OnClose sehingga kita dapat menghentikan instans kita ketika transisi mesin status BufferManager terjadi.
Saluran Output UDP
UdpOutputChannel
mengimplementasikan IOutputChannel. Konstruktor memvalidasi argumen dan membangun objek tujuan EndPoint berdasarkan EndpointAddress yang diteruskan.
this.socket = new Socket(this.remoteEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
Saluran dapat ditutup dengan anggun atau tidak anggun. Jika saluran komunikasi ditutup secara normal, soket ditutup dan pemanggilan dilakukan ke metode kelas dasar OnClose
. Jika ini memunculkan pengecualian, infrastruktur akan memanggil Abort
untuk memastikan saluran dibersihkan.
this.socket.Close(0);
Kami kemudian mengimplementasikan Send()
dan BeginSend()
/EndSend()
. Ini dibagi menjadi dua bagian utama. Pertama, kita membuat serial pesan ke dalam array byte.
ArraySegment<byte> messageBuffer = EncodeMessage(message);
Kemudian kita mengirim data yang dihasilkan pada kawat.
this.socket.SendTo(messageBuffer.Array, messageBuffer.Offset, messageBuffer.Count, SocketFlags.None, this.remoteEndPoint);
The UdpChannelListener
UdpChannelListener
yang diterapkan oleh sampel berasal dari kelas ChannelListenerBase. Ini menggunakan soket UDP tunggal untuk menerima datagram. Metode ini OnOpen
menerima data menggunakan soket UDP dalam perulangan asinkron. Data kemudian dikonversi menjadi pesan menggunakan Kerangka Kerja Pengodean Pesan.
message = MessageEncoderFactory.Encoder.ReadMessage(new ArraySegment<byte>(buffer, 0, count), bufferManager);
Karena saluran datagram yang sama mewakili pesan yang berasal dari sejumlah sumber, UdpChannelListener
adalah pendengar tunggal. Pada satu waktu, ada paling banyak satu IChannel aktif yang terkait dengan pendengar ini. Sampel menghasilkan satu lagi hanya jika saluran yang dikembalikan oleh AcceptChannel
metode kemudian dibuang. Ketika pesan diterima, pesan diantrekan ke saluran singleton ini.
UdpInputChannel
Kelas UdpInputChannel
mengimplementasikan IInputChannel
. Ini terdiri dari antrean pesan masuk yang diisi oleh UdpChannelListener
soket . Pesan-pesan ini dihapus dari antrean oleh metode IInputChannel.Receive
.
Menambahkan Elemen Pengikatan
Sekarang setelah pabrik dan saluran dibangun, kita harus mengeksposnya ke runtime ServiceModel melalui pengikatan. Pengikatan adalah kumpulan elemen pengikatan yang mewakili tumpukan komunikasi yang terkait dengan alamat layanan. Setiap elemen dalam tumpukan diwakili oleh <elemen pengikatan> .
Dalam sampel, elemen pengikatan adalah UdpTransportBindingElement
, yang berasal dari TransportBindingElement. Ini menggantikan metode berikut untuk membangun pabrik yang terkait dengan pengikatan kami.
public IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
{
return (IChannelFactory<TChannel>)(object)new UdpChannelFactory(this, context);
}
public IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
{
return (IChannelListener<TChannel>)(object)new UdpChannelListener(this, context);
}
Ini juga berisi anggota untuk mengkloning BindingElement
dan mengembalikan skema kami (soap.udp).
Menambahkan Dukungan Metadata untuk Elemen Pengikatan Transportasi
Untuk mengintegrasikan transportasi kami ke dalam sistem metadata, kami harus mendukung impor dan ekspor kebijakan. Ini memungkinkan kami untuk menghasilkan klien dari pengikatan kami melalui Alat Utilitas Metadata ServiceModel (Svcutil.exe).
Menambahkan Dukungan WSDL
Elemen pengikatan transport dalam sebuah binding bertanggung jawab untuk mengekspor dan mengimpor informasi alamat ke dalam metadata. Saat menggunakan pengikatan SOAP, elemen pengikatan transportasi juga harus mengekspor URI transportasi yang benar dalam metadata.
Ekspor WSDL
Untuk mengekspor informasi alamat, UdpTransportBindingElement
mengimplementasikan IWsdlExportExtension
antarmuka. Metode ExportEndpoint
menambahkan informasi pengalamatan yang benar ke port WSDL.
if (context.WsdlPort != null)
{
AddAddressToWsdlPort(context.WsdlPort, context.Endpoint.Address, encodingBindingElement.MessageVersion.Addressing);
}
Implementasi metode UdpTransportBindingElement
ini juga mengekspor URI transportasi ketika titik akhir menggunakan pengikatan SOAP.
WsdlNS.SoapBinding soapBinding = GetSoapBinding(context, exporter);
if (soapBinding != null)
{
soapBinding.Transport = UdpPolicyStrings.UdpNamespace;
}
Impor WSDL
Untuk memperluas sistem impor WSDL untuk menangani impor alamat, kita harus menambahkan konfigurasi berikut ke file konfigurasi untuk Svcutil.exe seperti yang ditunjukkan dalam file Svcutil.exe.config.
<configuration>
<system.serviceModel>
<client>
<metadata>
<policyImporters>
<extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />
</policyImporters>
</metadata>
</client>
</system.serviceModel>
</configuration>
Saat menjalankan Svcutil.exe, ada dua opsi agar Svcutil.exe memuat ekstensi imporan WSDL:
Arahkan Svcutil.exe ke file konfigurasi kami menggunakan /SvcutilConfig:<file>.
Tambahkan bagian konfigurasi ke Svcutil.exe.config di direktori yang sama dengan Svcutil.exe.
Tipe UdpBindingElementImporter
mengimplementasikan antarmuka IWsdlImportExtension
. Metode ImportEndpoint
mengimpor alamat dari port WSDL.
BindingElementCollection bindingElements = context.Endpoint.Binding.CreateBindingElements();
TransportBindingElement transportBindingElement = bindingElements.Find<TransportBindingElement>();
if (transportBindingElement is UdpTransportBindingElement)
{
ImportAddress(context);
}
Menambahkan Dukungan Kebijakan
Elemen pengikatan kustom dapat mengekspor pernyataan kebijakan dalam pengikatan WSDL untuk titik akhir layanan untuk mengekspresikan kemampuan elemen pengikatan tersebut.
Ekspor Kebijakan
UdpTransportBindingElement
tipe menerapkan IPolicyExportExtension
untuk mendukung pengeksporan kebijakan. Akibatnya, System.ServiceModel.MetadataExporter
termasuk UdpTransportBindingElement
dalam pembuatan kebijakan untuk pengikatan apa pun yang mencakupnya.
Dalam IPolicyExportExtension.ExportPolicy
, kami menambahkan pernyataan untuk UDP dan pernyataan lain jika kami berada dalam mode multicast. Ini disebabkan oleh mode multicast yang memengaruhi cara penyusunan tumpukan komunikasi, dan oleh karena itu harus dikoordinasikan antara kedua belah pihak.
ICollection<XmlElement> bindingAssertions = context.GetBindingAssertions();
XmlDocument xmlDocument = new XmlDocument();
bindingAssertions.Add(xmlDocument.CreateElement(
UdpPolicyStrings.Prefix, UdpPolicyStrings.TransportAssertion, UdpPolicyStrings.UdpNamespace));
if (Multicast)
{
bindingAssertions.Add(xmlDocument.CreateElement(
UdpPolicyStrings.Prefix,
UdpPolicyStrings.MulticastAssertion,
UdpPolicyStrings.UdpNamespace));
}
Karena elemen pengikatan transportasi kustom bertanggung jawab untuk menangani, implementasi IPolicyExportExtension
pada UdpTransportBindingElement
juga harus mengekspor pernyataan kebijakan WS-Addressing yang sesuai untuk menunjukkan versi WS-Addressing yang digunakan.
AddWSAddressingAssertion(context, encodingBindingElement.MessageVersion.Addressing);
Impor Kebijakan
Untuk memperluas sistem Impor Kebijakan, kita harus menambahkan konfigurasi berikut ke file konfigurasi untuk Svcutil.exe seperti yang ditunjukkan dalam file Svcutil.exe.config.
<configuration>
<system.serviceModel>
<client>
<metadata>
<policyImporters>
<extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />
</policyImporters>
</metadata>
</client>
</system.serviceModel>
</configuration>
Kemudian kami menerapkan IPolicyImporterExtension
dari kelas terdaftar kami (UdpBindingElementImporter
). Dalam ImportPolicy()
, kita meninjau pernyataan dalam namespace kami, lalu memproses yang diperlukan untuk menghasilkan transport dan memeriksa apakah itu multicast. Kita juga harus menghapus pernyataan yang kita tangani dari daftar pernyataan yang mengikat. Sekali lagi, saat menjalankan Svcutil.exe, ada dua opsi untuk integrasi:
Arahkan Svcutil.exe ke file konfigurasi kami menggunakan /SvcutilConfig:<file>.
Tambahkan bagian konfigurasi ke Svcutil.exe.config di direktori yang sama dengan Svcutil.exe.
Menambahkan Pengikatan Standar
Elemen pengikatan kami dapat digunakan dengan dua cara berikut:
Melalui pengikatan kustom: Pengikatan kustom memungkinkan pengguna untuk membuat pengikatan mereka sendiri berdasarkan serangkaian elemen pengikatan arbitrer.
Dengan menggunakan pengikatan yang disediakan sistem yang mengandung elemen pengikatan kami. WCF menyediakan sejumlah pengikatan yang ditentukan sistem ini, seperti
BasicHttpBinding
, ,NetTcpBinding
danWsHttpBinding
. Masing-masing pengikatan ini dikaitkan dengan profil yang terdefinisi dengan baik.
Sampel mengimplementasikan pengikatan profil di SampleProfileUdpBinding
, yang berasal dari Binding.
SampleProfileUdpBinding
berisi hingga empat elemen pengikatan di dalamnya: UdpTransportBindingElement
, , TextMessageEncodingBindingElement CompositeDuplexBindingElement
dan ReliableSessionBindingElement
.
public override BindingElementCollection CreateBindingElements()
{
BindingElementCollection bindingElements = new BindingElementCollection();
if (ReliableSessionEnabled)
{
bindingElements.Add(session);
bindingElements.Add(compositeDuplex);
}
bindingElements.Add(encoding);
bindingElements.Add(transport);
return bindingElements.Clone();
}
Menambahkan Importer Pengikatan Standar Kustom
Svcutil.exe dan jenisnya WsdlImporter
, secara default, mengenali dan mengimpor pengikatan yang ditentukan sistem. Jika tidak, pengikatan akan diimpor sebagai instance CustomBinding
. Untuk mengaktifkan Svcutil.exe dan WsdlImporter
mengimpor SampleProfileUdpBinding
, UdpBindingElementImporter
juga bertindak sebagai pengimpor pengikatan standar kustom.
Pengikat standar kustom mengimplementasikan ImportEndpoint
metode pada IWsdlImportExtension
antarmuka untuk memeriksa CustomBinding
instans yang diimpor dari metadata untuk melihat apakah itu dapat dihasilkan oleh pengikatan standar tertentu.
if (context.Endpoint.Binding is CustomBinding)
{
Binding binding;
if (transportBindingElement is UdpTransportBindingElement)
{
//if TryCreate is true, the CustomBinding will be replace by a SampleProfileUdpBinding in the
//generated config file for better typed generation.
if (SampleProfileUdpBinding.TryCreate(bindingElements, out binding))
{
binding.Name = context.Endpoint.Binding.Name;
binding.Namespace = context.Endpoint.Binding.Namespace;
context.Endpoint.Binding = binding;
}
}
}
Umumnya, menerapkan importir pengikatan standar kustom melibatkan pemeriksaan properti elemen pengikatan yang diimpor untuk memverifikasi bahwa hanya properti yang dapat ditetapkan oleh pengikatan standar yang telah berubah dan semua properti lainnya adalah defaultnya. Strategi dasar untuk menerapkan pengimpor pengikatan standar adalah dengan membuat instans pengikatan standar, memindahkan properti dari elemen pengikatan ke instans pengikatan standar yang didukung, serta membandingkan elemen pengikatan dari pengikatan standar dengan elemen pengikatan yang diimpor.
Menambahkan Dukungan Konfigurasi
Untuk mengekspos transportasi kami melalui konfigurasi, kita harus menerapkan dua bagian konfigurasi. Yang pertama adalah BindingElementExtensionElement
untuk UdpTransportBindingElement
. Hal ini agar CustomBinding
implementasi dapat mereferensikan elemen pengikatan kami. Yang kedua adalah Configuration
untuk kita SampleProfileUdpBinding
.
Elemen Ekstensi Elemen Pengikatan
Bagian UdpTransportElement
ini adalah BindingElementExtensionElement
yang mengekspos UdpTransportBindingElement
ke sistem konfigurasi. Dengan beberapa penimpaan dasar, kami menentukan nama bagian konfigurasi kami, jenis elemen pengikatan kami, dan cara membuat elemen pengikatan kami. Kami kemudian dapat mendaftarkan bagian ekstensi kami dalam file konfigurasi seperti yang ditunjukkan dalam kode berikut.
<configuration>
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="udpTransport" type="Microsoft.ServiceModel.Samples.UdpTransportElement, UdpTransport" />
</bindingElementExtensions>
</extensions>
</system.serviceModel>
</configuration>
Ekstensi dapat digunakan dalam pengikatan kustom untuk menggunakan UDP sebagai protokol transportasi.
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding configurationName="UdpCustomBinding">
<udpTransport/>
</binding>
</customBinding>
</bindings>
</system.serviceModel>
</configuration>
Bagian Pengikatan
Bagian SampleProfileUdpBindingCollectionElement
ini adalah StandardBindingCollectionElement
yang mengekspos SampleProfileUdpBinding
ke sistem konfigurasi. Sebagian besar implementasi didelegasikan ke SampleProfileUdpBindingConfigurationElement
, yang berasal dari StandardBindingElement
.
SampleProfileUdpBindingConfigurationElement
memiliki properti yang sesuai dengan properti pada SampleProfileUdpBinding
, dan fungsi untuk memetakan dari pengikatan ConfigurationElement
. Terakhir, override metode OnApplyConfiguration
di SampleProfileUdpBinding
kami, seperti yang ditunjukkan dalam kode sampel berikut.
protected override void OnApplyConfiguration(string configurationName)
{
if (binding == null)
throw new ArgumentNullException("binding");
if (binding.GetType() != typeof(SampleProfileUdpBinding))
{
throw new ArgumentException(string.Format(CultureInfo.CurrentCulture,
"Invalid type for binding. Expected type: {0}. Type passed in: {1}.",
typeof(SampleProfileUdpBinding).AssemblyQualifiedName,
binding.GetType().AssemblyQualifiedName));
}
SampleProfileUdpBinding udpBinding = (SampleProfileUdpBinding)binding;
udpBinding.OrderedSession = this.OrderedSession;
udpBinding.ReliableSessionEnabled = this.ReliableSessionEnabled;
udpBinding.SessionInactivityTimeout = this.SessionInactivityTimeout;
if (this.ClientBaseAddress != null)
udpBinding.ClientBaseAddress = ClientBaseAddress;
}
Untuk mendaftarkan handler ini dengan sistem konfigurasi, kami menambahkan bagian berikut ke file konfigurasi yang relevan.
<configuration>
<configSections>
<sectionGroup name="system.serviceModel">
<sectionGroup name="bindings">
<section name="sampleProfileUdpBinding" type="Microsoft.ServiceModel.Samples.SampleProfileUdpBindingCollectionElement, UdpTransport" />
</sectionGroup>
</sectionGroup>
</configSections>
</configuration>
Kemudian dapat direferensikan dari bagian konfigurasi serviceModel.
<configuration>
<system.serviceModel>
<client>
<endpoint configurationName="calculator"
address="soap.udp://localhost:8001/"
bindingConfiguration="CalculatorServer"
binding="sampleProfileUdpBinding"
contract= "Microsoft.ServiceModel.Samples.ICalculatorContract">
</endpoint>
</client>
</system.serviceModel>
</configuration>
Layanan Uji UDP dan Klien
Kode pengujian untuk menggunakan transportasi sampel ini tersedia di direktori UdpTestService dan UdpTestClient. Kode layanan terdiri dari dua pengujian—satu pengujian menyiapkan pengikatan dan titik akhir dari kode dan yang lain melakukannya melalui konfigurasi. Kedua pengujian menggunakan dua titik akhir. Satu titik akhir menggunakan SampleUdpProfileBinding
dengan <reliableSession> diatur ke true
. Titik akhir lainnya menggunakan pengikatan kustom dengan UdpTransportBindingElement
. Ini setara dengan penggunaan SampleUdpProfileBinding
dengan <reliableSession> diatur ke false
. Kedua pengujian membuat layanan, menambahkan titik akhir untuk setiap pengikatan, membuka layanan lalu menunggu pengguna menekan ENTER sebelum menutup layanan.
Saat memulai aplikasi pengujian layanan, Anda akan melihat output berikut.
Testing Udp From Code.
Service is started from code...
Press <ENTER> to terminate the service and start service from config...
Anda kemudian dapat menjalankan aplikasi klien pengujian terhadap titik akhir yang diterbitkan. Aplikasi pengujian klien membuat klien untuk setiap titik akhir dan mengirim lima pesan ke setiap titik akhir. Output berikut ada di klien.
Testing Udp From Imported Files Generated By SvcUtil.
0
3
6
9
12
Press <ENTER> to complete test.
Berikut ini adalah output lengkap pada layanan.
Service is started from code...
Press <ENTER> to terminate the service and start service from config...
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
adding 0 + 0
adding 1 + 2
adding 2 + 4
adding 3 + 6
adding 4 + 8
Untuk menjalankan aplikasi klien terhadap titik akhir yang diterbitkan menggunakan konfigurasi, tekan ENTER pada layanan lalu jalankan klien pengujian lagi. Anda akan melihat output berikut pada layanan.
Testing Udp From Config.
Service is started from config...
Press <ENTER> to terminate the service and exit...
Saat klien dijalankan kembali, hasilnya sama seperti sebelumnya.
Untuk meregenerasi kode dan konfigurasi klien menggunakan Svcutil.exe, mulai aplikasi layanan lalu jalankan Svcutil.exe berikut dari direktori akar sampel.
svcutil http://localhost:8000/udpsample/ /reference:UdpTransport\bin\UdpTransport.dll /svcutilConfig:svcutil.exe.config
Perhatikan bahwa Svcutil.exe tidak menghasilkan konfigurasi ekstensi pengikatan untuk SampleProfileUdpBinding
, sehingga Anda harus menambahkannya secara manual.
<configuration>
<system.serviceModel>
<extensions>
<!-- This was added manually because svcutil.exe does not add this extension to the file -->
<bindingExtensions>
<add name="sampleProfileUdpBinding" type="Microsoft.ServiceModel.Samples.SampleProfileUdpBindingCollectionElement, UdpTransport" />
</bindingExtensions>
</extensions>
</system.serviceModel>
</configuration>
Untuk menyiapkan, mengompilasi, dan menjalankan sampel
Untuk membangun solusi, ikuti instruksi dalam Membangun Sampel Windows Communication Foundation.
Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi di Menjalankan Sampel Windows Communication Foundation.
Lihat bagian "Layanan Uji UDP dan Klien" sebelumnya.