Bagikan melalui


Interoperabilitas dengan aplikasi POX

Aplikasi "Plain Old XML" (POX) berkomunikasi dengan bertukar pesan HTTP mentah yang hanya berisi data aplikasi XML yang tidak disertakan dalam amplop SOAP. Windows Communication Foundation (WCF) dapat menyediakan layanan dan klien yang menggunakan pesan POX. Pada layanan ini, WCF dapat digunakan untuk mengimplementasikan layanan yang mengekspos titik akhir ke klien seperti browser Web dan bahasa skrip yang mengirim dan menerima pesan POX. Pada klien, model pemrograman WCF dapat digunakan untuk mengimplementasikan klien yang berkomunikasi dengan layanan berbasis POX.

Catatan

Dokumen ini awalnya ditulis untuk .NET Framework 3.0. .NET Framework 3.5 memiliki dukungan bawaan untuk bekerja dengan aplikasi POX. Untuk informasi selengkapnya tentang lihat Model Pemrograman HTTP Web WCF.

Pemrograman POX dengan WCF

Layanan WCF yang berkomunikasi melalui HTTP menggunakan pesan POX menggunakan <customBinding>.

<customBinding>
   <binding name="poxServerBinding">
       <textMessageEncoding messageVersion="None" />
       <httpTransport />
   </binding>
</customBinding>

Pengikatan kustom ini berisi dua elemen:

Encoder Pesan Teks WCF standar dikonfigurasikan secara khusus untuk menggunakan nilai None, yang memungkinkannya memproses muatan pesan XML yang tidak tiba dibungkus dalam amplop SOAP.

Klien WCF yang berkomunikasi melalui HTTP menggunakan pesan POX menggunakan pengikatan serupa (ditunjukkan dalam kode imperatif berikut).

private static Binding CreatePoxBinding()
{
    TextMessageEncodingBindingElement encoder =
        new TextMessageEncodingBindingElement( MessageVersion.None, Encoding.UTF8 );
    HttpTransportBindingElement transport = new HttpTransportBindingElement();
    transport.ManualAddressing = true;
    return new CustomBinding( new BindingElement[] { encoder, transport } );
}

Karena klien POX harus secara eksplisit menentukan URI tujuan pengiriman pesan, klien biasanya harus mengonfigurasi HttpTransportBindingElement ke mode pengalamatan manual dengan mengatur properti ManualAddressing ke true pada elemen. Ini memungkinkan pesan ditangani secara eksplisit oleh kode aplikasi dan tidak perlu membuat ChannelFactory baru setiap kali aplikasi mengirim pesan ke URI HTTP yang berbeda.

Karena pesan POX tidak menggunakan header SOAP untuk menyampaikan informasi protokol penting, klien dan layanan POX sering kali harus memanipulasi bagian dari permintaan HTTP yang mendasari yang digunakan untuk mengirim atau menerima pesan. Informasi protokol khusus HTTP seperti header HTTP dan kode status muncul dalam model pemrograman WCF melalui dua kelas:

  • HttpRequestMessageProperty, yang berisi informasi tentang permintaan HTTP, seperti metode HTTP dan header permintaan.

  • HttpResponseMessageProperty, yang berisi informasi tentang respons HTTP, seperti kode status HTTP dan deskripsi status, serta header respons HTTP apa pun.

Contoh kode berikut menunjukkan cara membuat pesan permintaan HTTP GET yang dialamatkan ke http://localhost:8100/customers.

Message request = Message.CreateMessage( MessageVersion.None, String.Empty );
request.Headers.To = "http://localhost:8100/customers";

HttpRequestMessageProperty property = new HttpRequestMessageProperty();
property.Method = "GET";
property.SuppressEntityBody = true;
request.Properties.Add( HttpRequestMessageProperty.Name, property );

Pertama, permintaan Message kosong dibuat dengan memanggil CreateMessage(MessageVersion, String). Parameter None digunakan untuk menunjukkan bahwa amplop SOAP tidak diperlukan dan parameter Empty diteruskan sebagai Tindakan. Pesan permintaan kemudian dialamatkan dengan mengatur header To ke URI yang diinginkan. Selanjutnya, HttpRequestMessageProperty dibuat dan Method diatur ke metode GET kata kerja HTTP dan SuppressEntityBody diatur ke true untuk menunjukkan bahwa tidak ada data yang harus dikirim dalam isi pesan permintaan HTTP keluar. Terakhir, properti permintaan ditambahkan ke kumpulan Properties dari pesan permintaan sehingga dapat memengaruhi cara HTTP Transportasi mengirimkan permintaan. Pesan tersebut kemudian siap untuk dikirim melalui instans IRequestChannel yang sesuai.

Teknik serupa dapat digunakan pada layanan untuk mengekstrak HttpRequestMessageProperty dari pesan masuk dan menyusun respons.