Transportasi: UDP
Sampel UDP Transport menunjukkan cara menerapkan unicast UDP dan multicast sebagai transportasi Windows Communication Foundation (WCF) kustom. 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 saluran mana yang merupakan Pola Pertukaran Pesan (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 mengkomunikasikan kemampuan ke titik akhir lainnya.
Tambahkan pengikatan yang telah mengonfigurasi tumpukan elemen pengikatan sesuai dengan profil yang ditentukan 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 Exchange 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 MEP datagram, klien mengirim pesan menggunakan pertukaran "aktifkan dan lupakan". Pertukaran fire and forget adalah pertukaran yang memerlukan konfirmasi out-of-band atas keberhasilan pengiriman. Pesan mungkin hilang saat transit dan tidak pernah mencapai layanan. Jika operasi pengiriman berhasil diselesaikan di pihak klien, operasi ini tidak menjamin bahwa titik akhir jarak jauh telah menerima pesan. Datagram adalah blok bangunan mendasar untuk olahpesan, karena Anda dapat membangun protokol Anda sendiri di blok tersebut—termasuk protokol yang andal dan protokol yang aman. Saluran datagram klien mengimplementasikan antarmuka IOutputChannel dan saluran datagram layanan mengimplementasikan antarmuka IInputChannel.
Request-Response (IRequestChannel/IReplyChannel)
Dalam MEP ini, pesan dikirim, dan balasan diterima. Pola terdiri dari pasangan permintaan-respons. Contoh panggilan respons permintaan adalah panggilan prosedur jarak jauh (RPC) dan ET browser. Pola ini juga dikenal sebagai Half-Duplex. Dalam MEP ini, saluran klien menerapkan IRequestChannel dan saluran layanan menerapkan IReplyChannel.
Dupleks (IDuplexChannel)
MEP dupleks memungkinkan jumlah pesan arbitrer untuk dikirim oleh klien dan diterima dalam urutan apa pun. MEP dupleks seperti percakapan telepon, tempat setiap kata yang diucapkan adalah 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. Pola ini memberi Anda total enam MEP—Datagram, Respons Permintaan, Dupleks, Datagram dengan sesi, Request-Response dengan sesi, dan Dupleks dengan sesi—untuk dipilih.
Catatan
Untuk transportasi UDP, satu-satunya MEP yang didukung adalah Datagram, karena UDP secara inheren adalah protokol "aktifkan dan lupakan".
Siklus hidup objek ICommunicationObject dan WCF
WCF memiliki mesin 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 hadir. Status-status ini diwakili oleh enumerasi CommunicationState, dan sebagai berikut:
Dibuat: Ini adalah status ICommunicationObject ketika pertama kali dibuat. Tidak ada input/output (I/O) yang terjadi dalam status ini.
Pembukaan: Objek beralih ke status ini ketika Open dipanggil. Pada titik ini properti dibuat tidak dapat diubah, dan input/output dapat dimulai. Transisi ini hanya berlaku dari status Dibuat.
Dibuka: Transisi objek ke status ini ketika proses terbuka selesai. Transisi ini hanya valid dari status Pembukaan. Pada titik ini, objek sepenuhnya dapat digunakan untuk ditransfer.
Penutupan: Objek beralih ke status ini ketika Close dipanggil untuk mematikan dengan baik. Transisi ini hanya valid dari status Dibuka.
Ditutup: Di objek status Ditutup 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 diaktifkan untuk setiap transisi status. Metode Abort dapat dipanggil kapan saja, dan menyebabkan objek segera beralih dari statusnya saat ini ke status Tertutup. Panggilan Abort mengakhiri pekerjaan yang belum selesai.
Saluran Pabrik dan Saluran Pendengar
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 sebelumnya dijelaskan pada Langkah 2.
Kelas ChannelManagerBase mengimplementasikan CommunicationObject dan menyediakan kelas dasar terpadu untuk ChannelFactoryBase dan ChannelListenerBase. Kelas ChannelManagerBase bekerja bersama dengan ChannelBase, yang merupakan kelas dasar yang mengimplementasikan IChannel.
Kelas ChannelFactoryBase mengimplementasikan ChannelManagerBase dan IChannelFactory dan menggabungkan kelebihan
CreateChannel
menjadi satu metode abstrakOnCreateChannel
.Kelas ChannelListenerBase mengimplementasikan IChannelListener. Kelas ini mengurus manajemen status dasar.
Dalam sampel ini, implementasi pabrik terkandung dalam UdpChannelFactory.cs dan implementasi pendengar terkandung dalam UdpChannelListener.cs. Implementasi IChannel ada di UdpOutputChannel.cs dan UdpInputChannel.cs.
UDP Channel Factory
UdpChannelFactory
berasal dari ChannelFactoryBase. Contoh mengambil alih GetProperty untuk memberikan akses ke versi pesan dari pembuat encoder pesan. Sampel juga mengambil alih OnClose sehingga kita dapat menghapus instans BufferManager kita ketika mesin status bertransisi.
Saluran Output UDP
UdpOutputChannel
mengimplementasikan IOutputChannel. Konstruktor memvalidasi argumen dan membuat objek EndPoint tujuan berdasarkan EndpointAddress yang diteruskan.
this.socket = new Socket(this.remoteEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
Saluran ini dapat ditutup dengan lancar atau tidak lancar. Jika saluran ditutup dengan baik, soket ditutup dan panggilan dilakukan ke metode OnClose
kelas dasar. Jika ini menampilkan pengecualian, infrastruktur akan memanggil Abort
untuk memastikan saluran dibersihkan.
this.socket.Close(0);
Kami kemudian mengimplementasikan Send()
dan BeginSend()
/EndSend()
. Ini diuraikan 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 sampel berasal dari kelas ChannelListenerBase. Kelas menggunakan soket UDP tunggal untuk menerima datagram. Metode 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 database tunggal. Ada, paling banyak, satu IChannel aktif yang terkait dengan pendengar ini pada satu waktu. Sampel membuat yang lain hanya jika saluran yang dikembalikan dengan metode AcceptChannel
selanjutnya dibuang. Ketika pesan diterima, pesan diantrekan ke saluran database tunggal ini.
UdpInputChannel
Kelas UdpInputChannel
mengimplementasikan IInputChannel
. Kelas ini terdiri dari antrean pesan masuk yang diisi oleh soket UdpChannelListener
. Pesan-pesan ini dihapus dari antrean oleh metode IInputChannel.Receive
.
Menambahkan Elemen Pengikatan
Sekarang setelah pabrik dan saluran dibangun, kita harus mengeksposnya ke runtime bahasa umum 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 mengambil alih 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 pengikatan kami melalui Alat Utilitas Metadata ServiceModel (Svcutil.exe).
Menambahkan Dukungan WSDL
Elemen pengikatan transportasi dalam pengikatan bertanggung jawab untuk mengekspor dan mengimpor informasi alamat 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 antarmuka IWsdlExportExtension
. Metode ExportEndpoint
menambahkan informasi alamat yang benar ke port WSDL.
if (context.WsdlPort != null)
{
AddAddressToWsdlPort(context.WsdlPort, context.Endpoint.Address, encodingBindingElement.MessageVersion.Addressing);
}
Implementasi UdpTransportBindingElement
dari metode ExportEndpoint
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 untuk mendapatkan Svcutil.exe memuat ekstensi impor 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.
Jenis UdpBindingElementImporter
menerapkan 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 penegasan kebijakan dalam pengikatan WSDL untuk titik akhir layanan untuk mengekspresikan kemampuan elemen pengikatan tersebut.
Ekspor Kebijakan
Jenis UdpTransportBindingElement
mengimplementasikan IPolicyExportExtension
untuk menambahkan dukungan untuk mengekspor kebijakan. Akibatnya, System.ServiceModel.MetadataExporter
termasuk UdpTransportBindingElement
dalam pembuatan kebijakan untuk setiap pengikatan yang mencakupnya.
Dalam IPolicyExportExtension.ExportPolicy
, kami menambahkan pernyataan untuk UDP dan pernyataan lain jika kami berada dalam mode multicast. Ini karena mode multicast memengaruhi bagaimana tumpukan komunikasi dibangun, dan dengan demikian harus dikoordinasikan di antara kedua sisi.
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 penanganan, IPolicyExportExtension
mengeimplementasikan pada UdpTransportBindingElement
juga harus menangani ekspor pernyataan kebijakan WS-Addressing yang sesuai untuk menunjukkan versi WS-Addressing 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>
Lalu kita menerapkan IPolicyImporterExtension
dari kelas terdaftar (UdpBindingElementImporter
). Dalam ImportPolicy()
, kita melihat melalui pernyataan di namespace layanan kami, dan memproses perilaku untuk menghasilkan transportasi dan memeriksa apakah perilaku tersebut multicast. Kita juga harus menghapus pernyataan yang kita tangani dari daftar pernyataan pengikatan. 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 pengikatannya sendiri berdasarkan serangkaian elemen pengikatan arbitrer.
Dengan menggunakan pengikatan yang disediakan sistem yang mencakup 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 Pengimpor Pengikatan Standar Kustom
Svcutil.exe dan jenisnya WsdlImporter
, secara default, mengenali dan mengimpor pengikatan yang ditentukan sistem. Jika tidak, pengikatan akan diimpor sebagai instans CustomBinding
. Untuk mengaktifkan Svcutil.exe dan WsdlImporter
untuk mengimpor SampleProfileUdpBinding
UdpBindingElementImporter
juga bertindak sebagai pengimpor pengikatan standar kustom.
Pengimpor pengikat standar kustom mengimplementasikan metode ImportEndpoint
pada antarmuka IWsdlImportExtension
untuk memeriksa instans CustomBinding
yang diimpor dari metadata untuk melihat apakah itu bisa 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 pengimpor pengikatan standar kustom melibatkan pemeriksaan properti elemen pengikatan yang diimpor untuk memverifikasi bahwa hanya properti yang dapat diatur oleh pengikatan standar yang telah berubah dan semua properti lainnya adalah defaultnya. Strategi dasar untuk menerapkan importir pengikatan standar adalah membuat instans pengikatan standar, menyebarluaskan properti dari elemen pengikatan ke instans pengikatan standar yang didukung pengikatan standar, dan membandingkan elemen pengikatan dari pengikatan standar dengan elemen pengikatan yang diimpor.
Menambahkan Dukungan Konfigurasi
Untuk mengekspos transportasi melalui konfigurasi, kita harus menerapkan dua bagian konfigurasi. Yang pertama adalah BindingElementExtensionElement
untuk UdpTransportBindingElement
. Hal ini agar implementasi CustomBinding
dapat mereferensikan elemen pengikatan kami. Yang kedua adalah Configuration
untuk SampleProfileUdpBinding
kami.
Elemen Ekstensi Elemen Pengikatan
Bagian UdpTransportElement
adalah BindingElementExtensionElement
yang mengekspos UdpTransportBindingElement
ke sistem konfigurasi. Dengan beberapa ambil alih 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 dirujuk dari pengikatan kustom untuk menggunakan UDP sebagai transportasi.
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding configurationName="UdpCustomBinding">
<udpTransport/>
</binding>
</customBinding>
</bindings>
</system.serviceModel>
</configuration>
Bagian Pengikatan
Bagian SampleProfileUdpBindingCollectionElement
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 pengikatanConfigurationElement
. Terakhir, ambil alih 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 penanganan 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 Pengujian 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> yang 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 uji layanan aplikasi 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 pada 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...
Menjalankan klien lagi menghasilkan hasil yang sama dengan hasil 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, membangun, 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 pada Menjalankan Sampel WCF.
Lihat bagian "Layanan Pengujian UDP dan Klien" sebelumnya.