Bagikan melalui


Transportasi: UDP

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:

  1. 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.

  2. Buat pabrik saluran dan pendengar yang mendukung Pola Pertukaran Pesan Anda.

  3. Pastikan bahwa setiap pengecualian khusus jaringan dinormalisasi ke kelas turunan yang sesuai dari CommunicationException.

  4. <Tambahkan elemen pengikatan> yang menambahkan transportasi kustom ke tumpukan saluran. Untuk informasi selengkapnya, lihat Menambahkan Elemen Pengikatan.

  5. Tambahkan bagian ekstensi elemen pengikatan untuk mengekspos elemen pengikatan baru ke sistem konfigurasi.

  6. Tambahkan ekstensi metadata untuk mengomunikasikan kemampuan ke titik akhir lainnya.

  7. Tambahkan pengikatan yang mengonfigurasi sebelumnya seperangkat elemen pengikatan sesuai dengan profil yang sudah terdefinisi dengan baik. Untuk informasi selengkapnya, lihat Menambahkan Pengikatan Standar.

  8. 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.

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 UdpChannelListenersoket . 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:

  1. Arahkan Svcutil.exe ke file konfigurasi kami menggunakan /SvcutilConfig:<file>.

  2. 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:

  1. Arahkan Svcutil.exe ke file konfigurasi kami menggunakan /SvcutilConfig:<file>.

  2. 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, , NetTcpBindingdan WsHttpBinding. 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 CompositeDuplexBindingElementdan 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

  1. Untuk membangun solusi, ikuti instruksi dalam Membangun Sampel Windows Communication Foundation.

  2. Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi di Menjalankan Sampel Windows Communication Foundation.

  3. Lihat bagian "Layanan Uji UDP dan Klien" sebelumnya.