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 membahas cara membuat encoder kustom.
Di Windows Communication Foundation (WCF), Anda menggunakan pengikatan untuk menentukan cara mentransfer data di seluruh jaringan antar titik akhir. Pengikatan terdiri dari urutan elemen pengikatan. Pengikatan mencakup elemen pengikatan protokol opsional seperti keamanan, elemen pengikatan Encoder Pesan yang diperlukan, dan elemen pengikatan transportasi yang diperlukan. Encoder pesan diwakili oleh elemen pengikatan pengodean pesan. Tiga encoder pesan disertakan dalam WCF: Biner, Message Transmission Optimization Mechanism (MTOM), dan Text.
Elemen pengodean pesan menserialisasikan pesan keluar Message dan meneruskannya ke media transport, atau menerima bentuk berseri dari sebuah pesan dari media transport dan meneruskannya ke lapisan protokol jika ada, atau ke aplikasi jika tidak ada.
Encoder pesan mentransformasi instans Message ke dan dari representasi kabel. Meskipun encoder digambarkan berada di atas lapisan transportasi di tumpukan saluran, sebenarnya mereka berada di dalam lapisan transportasi. Transportasi (misalnya HTTP) memformat pesan sesuai dengan persyaratan standar transportasi. Encoder (misalnya Text Xml) hanya mengodekan pesan.
Saat menyambungkan ke klien atau server yang sudah ada sebelumnya, Anda mungkin tidak memiliki pilihan tentang menggunakan pengodean pesan tertentu. Namun, layanan WCF dapat diakses melalui beberapa titik akhir, masing-masing dengan encoder pesan yang berbeda. Saat satu encoder tidak mencakup seluruh audiens untuk layanan Anda, pertimbangkan untuk mengekspos layanan Anda melalui beberapa titik akhir. Aplikasi klien kemudian dapat memilih titik akhir yang terbaik untuk mereka. Menggunakan beberapa titik akhir memungkinkan Anda menggabungkan keuntungan dari encoder pesan yang berbeda dengan elemen pengikatan lainnya.
Pengode System-Provided
WCF menyediakan beberapa pengikatan yang disediakan sistem yang dirancang untuk mencakup skenario aplikasi yang paling umum. Masing-masing pengikatan ini menggabungkan transportasi, encoder pesan, dan opsi lainnya (misalnya keamanan). Topik ini menjelaskan cara memperluas encoder pesan Text, Binary, dan MTOM yang disertakan dalam WCF, atau membuat encoder kustom Anda sendiri. Encoder pesan teks mendukung pengodean XML biasa serta pengodean SOAP. Mode pengodean XML biasa dari encoder pesan teks disebut encoder POX ("PLAIN Old XML") untuk membedakannya dari pengodean SOAP berbasis teks.
Untuk informasi selengkapnya tentang kombinasi elemen pengikatan yang disediakan oleh pengikatan yang disediakan sistem, lihat bagian yang sesuai di Memilih Transportasi.
Cara Bekerja dengan Encoder System-Provided
Suatu pengodean ditambahkan pada ikatan menggunakan kelas yang berasal dari MessageEncodingBindingElement.
WCF menyediakan jenis elemen pengikatan berikut yang berasal dari MessageEncodingBindingElement kelas yang dapat menyediakan pengodean teks, biner, dan Message Transmission Optimization Mechanism (MTOM):
TextMessageEncodingBindingElement: Encoder yang paling interoperable, tetapi paling tidak efisien untuk pesan XML. Layanan Web atau klien layanan Web umumnya dapat memahami XML tekstual. Namun, mengirimkan blok besar data biner sebagai teks tidak efisien.
BinaryMessageEncodingBindingElement: Mewakili elemen pengikatan yang menentukan pengodean karakter dan penerapan versi pesan yang digunakan untuk pesan XML berbasis biner. Ini adalah pilihan pengodean yang paling efisien, tetapi paling kurang dapat dioperasikan, karena hanya didukung oleh titik akhir WCF.
MtomMessageEncodingBindingElement: Mewakili elemen pengikatan yang menentukan pengodean karakter dan versi pesan yang digunakan untuk pesan dengan pengodean Mekanisme Optimalisasi Transmisi Pesan (MTOM). MTOM adalah teknologi yang efisien untuk mengirimkan data biner dalam pesan WCF. Encoder MTOM mencoba menyeimbangkan antara efisiensi dan interoperabilitas. Pengodean MTOM mengirimkan sebagian besar XML dalam bentuk tekstual, tetapi mengoptimalkan blok besar data biner dengan mengirimkannya as-is, tanpa konversi ke teks.
Elemen pengikatan membuat biner, MTOM, atau teks MessageEncoderFactory. Pabrik membuat biner, MTOM, atau instans teks MessageEncoderFactory . Biasanya, hanya ada satu instance. Namun jika sesi digunakan, encoder yang berbeda dapat disediakan untuk setiap sesi. Encoder Biner menggunakan ini untuk mengoordinasikan kamus dinamis (lihat Infrastruktur XML).
Metode ReadMessage dan WriteMessage adalah inti dari encoder. Metode menyediakan cara untuk membaca pesan dari stream atau dari larik Byte. Array byte digunakan saat transportasi beroperasi dalam mode buffer. Pesan selalu ditulis ke dalam saluran. Jika transportasi harus menyangga pesan, transportasi menyediakan aliran yang melakukan buffering.
Anggota lainnya bekerja dengan konten pendukung, jenis media, dan MessageVersion. Transportasi memanggil metode encoder ini untuk menguji apakah pesan masuk dapat didekodekan olehnya, atau untuk menentukan apakah pesan keluar valid untuk encoder ini.
Masing-masing dari tiga implementasi encoder menambahkan properti yang relevan dengan pengodean tertentu dan dapat dikonfigurasi sepenuhnya. Encoder juga mengekspos kuota pembaca yang memiliki default aman. Lihat Infrastruktur XML untuk diskusi kuota.
Fitur Encoder System-Provided
Ada sejumlah fitur yang disediakan oleh encoder yang disediakan sistem.
Penggabungan
Masing-masing implementasi encoder mencoba mengumpulkan sebanyak mungkin. Mengurangi alokasi adalah cara utama untuk meningkatkan performa kode terkelola. Untuk melakukan pengumpulan ini, implementasi menggunakan kelas SynchronizedPool. File C# berisi deskripsi pengoptimalan tambahan yang digunakan oleh kelas ini.
XmlDictionaryReader dan XmlDictionaryWriter instance dipool dan diinisialisasi ulang untuk mencegah alokasi instance baru untuk setiap pesan. Untuk para pembaca, OnClose callback akan mengembalikan kontrol kepada pembaca saat Close() dipanggil. Encoder juga mendaur ulang beberapa objek status pesan yang digunakan saat membuat pesan. Ukuran kumpulan ini dapat dikonfigurasi oleh properti MaxReadPoolSize dan MaxWritePoolSize pada masing-masing dari tiga kelas yang berasal dari MessageEncodingBindingElement.
Pengodean Biner
Saat pengodean biner menggunakan sesi, string kamus dinamis harus dikomunikasikan ke penerima pesan. Ini dilakukan dengan menambahkan string kamus dinamis sebagai awalan pesan. Penerima menghapus string, menambahkannya ke sesi, dan memproses pesan. Meneruskan string kamus dengan benar mengharuskan pengiriman data perlu di-buffer.
String ditambahkan ke pesan dengan metode internal AddSessionInformationToMessage . Ini menambahkan string sebagai UTF-8 di depan pesan yang diawali dengan panjangnya. Seluruh header kamus kemudian diawali dengan panjang datanya. Operasi pembalikan dilakukan dengan metode internal ExtractSessionInformationFromMessage.
Selain memproses kunci kamus dinamis, pesan sesi yang di-buffer diterima dengan cara yang unik. Alih-alih membuat pembaca atas dokumen dan memprosesnya, encoder biner menggunakan kelas internal MessagePatterns untuk mendekonstruksi aliran biner. Idenya adalah bahwa sebagian besar pesan memiliki sekumpulan header tertentu yang muncul dalam urutan tertentu saat dihasilkan oleh WCF. Sistem pola memisahkan pesan berdasarkan apa yang diharapkan. Jika berhasil, ini menginisialisasi MessageHeaders objek tanpa mengurai XML. Jika tidak, ia kembali ke metode standar.
Pengodean MTOM
Kelas MtomMessageEncodingBindingElement memiliki properti konfigurasi tambahan yang disebut MaxBufferSize. Ini menempatkan batas atas pada berapa banyak data yang diizinkan untuk buffer selama proses membaca pesan. Set Informasi XML (Infoset), atau bagian MIME lainnya, mungkin perlu di-buffer untuk menyusun ulang semua bagian MIME ke dalam satu pesan.
Untuk berfungsi dengan baik dengan HTTP, kelas encoder pesan MTOM internal menyediakan beberapa API internal untuk GetContentType (yang juga bersifat internal) dan WriteMessage, yang bersifat publik dan dapat diganti. Komunikasi lainnya harus terjadi untuk memastikan nilai di header HTTP setuju dengan nilai di header MIME.
Secara internal, encoder pesan MTOM menggunakan pembaca teks WCF, dan mirip dengan encoder Teks. Perbedaan utamanya adalah bahwa ia mengoptimalkan potongan besar biner, atau "Objek Besar Biner" (BLOB), dengan tidak mengonversinya ke dalam pengodean Base-64 sebelum menyematkannya ke dalam byte pesan. Sebaliknya, BLOB ini tetap diekstraksi, dan direferensikan sebagai lampiran MIME.
Menulis Encoder Anda sendiri
Untuk mengimplementasikan encoder pesan kustom Anda sendiri, Anda harus menyediakan implementasi kustom dari kelas dasar abstrak berikut:
Mengonversi dari representasi dalam memori sebuah pesan ke representasi yang dapat ditulis ke aliran dienkapsulasi dalam kelas MessageEncoder, yang berfungsi sebagai penyedia untuk pembaca XML dan penulis XML yang mendukung jenis pengodean XML tertentu.
Metode utama kelas ini yang harus Anda ambil alih adalah:
WriteMessage yang mengambil MessageEncodingBindingElement objek dan menulisnya ke dalam Stream objek.
ReadMessage yang menerima objek Stream serta ukuran header maksimum dan mengembalikan objek Message.
Ini adalah kode yang Anda tulis di metode-metode ini yang menangani konversi antara protokol transportasi standar, dan pengodean Anda yang disesuaikan.
Selanjutnya Anda perlu membuat kode kelas pabrik yang membuat encoder kustom Anda. Ambil alih Encoder untuk mengembalikan instance kustom MessageEncoder Anda.
Kemudian hubungkan MessageEncoderFactory khusus Anda ke tumpukan elemen pengikatan yang digunakan untuk mengonfigurasi layanan atau klien dengan mengganti metode CreateMessageEncoderFactory untuk mengembalikan instans pabrik ini.
Ada dua sampel yang disediakan dengan WCF yang mengilustrasikan proses ini dengan kode sampel: Encoder Pesan Kustom: Encoder Teks Kustom dan Encoder Pesan Kustom: Encoder Pemadatan.