Saya memiliki layanan WCF yang di-host di Layanan Windows. Klien yang menggunakan layanan ini harus melewati pengidentifikasi setiap kali mereka memanggil metode layanan (karena pengenal itu penting untuk apa yang harus dilakukan metode yang dipanggil). Saya pikir itu ide yang baik untuk meletakkan pengidentifikasi ini ke informasi header WCF.
Jika itu ide yang bagus, bagaimana saya bisa menambahkan pengenal secara otomatis ke informasi header. Dengan kata lain, setiap kali pengguna memanggil metode WCF, pengidentifikasi harus ditambahkan secara otomatis ke header.
UPDATE: Klien yang menggunakan layanan WCF adalah aplikasi Windows dan aplikasi Windows Mobile (menggunakan Compact Framework).
Jawaban:
Keuntungannya adalah ini diterapkan untuk setiap panggilan.
Buat kelas yang mengimplementasikan IClientMessageInspector . Dalam metode BeforeSendRequest, tambahkan tajuk khusus Anda ke pesan keluar. Mungkin terlihat seperti ini:
Kemudian buat perilaku titik akhir yang menerapkan inspektur pesan ke runtime klien. Anda bisa menerapkan perilaku melalui atribut atau melalui konfigurasi menggunakan elemen ekstensi perilaku.
Berikut adalah contoh yang bagus tentang cara menambahkan header agen-pengguna HTTP ke semua pesan permintaan. Saya menggunakan ini di beberapa klien saya. Anda juga dapat melakukan hal yang sama di sisi layanan dengan menerapkan IDispatchMessageInspector .
Apakah ini yang ada dalam pikiran Anda?
Pembaruan: Saya menemukan daftar fitur WCF yang didukung oleh kerangka kerja yang ringkas. Saya percaya inspektur pesan diklasifikasikan sebagai 'Channel Perluasan' yang menurut posting ini, yang didukung oleh kerangka kompak.
sumber
OutgoingMessageProperties
adalah apa yang Anda perlukan untuk mengakses HTTP Header - bukanOutgoingMessageHeaders
header SOAP.Anda menambahkannya ke panggilan menggunakan:
Dan kemudian, sisi server Anda ambil menggunakan:
sumber
OperationContextScope
(danOperationContext
) adalahThreadStatic
- Jawaban Mark Good akan bekerja tanpa bergantung padaThreadStatic
item.Jika Anda hanya ingin menambahkan tajuk yang sama ke semua permintaan ke layanan, Anda dapat melakukannya tanpa kode apa pun!
Cukup tambahkan node header dengan header yang diperlukan di bawah node titik akhir di file konfigurasi klien Anda
sumber
MessageHeader
) - bukan HTTP Header.Berikut ini adalah solusi lain yang bermanfaat untuk menambahkan Header HTTP khusus ke permintaan WCF klien Anda menggunakan
ChannelFactory
sebagai proxy. Ini harus dilakukan untuk setiap permintaan, tetapi cukup sebagai demo sederhana jika Anda hanya perlu menguji unit proxy Anda dalam persiapan untuk platform non-.NET.sumber
Ini mirip dengan jawaban NimsDotNet tetapi menunjukkan cara melakukannya secara terprogram.
Cukup tambahkan header ke penjilidan
sumber
sumber
Inilah yang berhasil bagi saya, diadaptasi dari Menambahkan HTTP Header ke Panggilan WCF
Setelah mendeklarasikan kelas-kelas ini, Anda dapat menambahkan perilaku baru ke klien WCF Anda seperti ini:
sumber
Ini bekerja untuk saya
sumber
Binding konteks di .NET 3.5 mungkin hanya apa yang Anda cari. Ada tiga dari kotak: BasicHttpContextBinding, NetTcpContextBinding, dan WSHttpContextBinding. Protokol konteks pada dasarnya melewati pasangan nilai kunci di header pesan. Lihat artikel Mengelola Status Layanan Tahan Lama di majalah MSDN.
sumber
Jika saya memahami kebutuhan Anda dengan benar, jawaban sederhana adalah: Anda tidak bisa.
Itu karena klien layanan WCF dapat dihasilkan oleh pihak ketiga mana pun yang menggunakan layanan Anda.
JIKA Anda memiliki kendali atas klien layanan Anda, Anda bisa membuat kelas klien dasar yang menambahkan header yang diinginkan dan mewarisi perilaku di kelas pekerja.
sumber
Anda dapat menentukan header khusus di MessageContract .
Anda juga dapat menggunakan tajuk <endpoint> yang disimpan dalam file konfigurasi dan akan disalin di tajuk semua pesan yang dikirim oleh klien / layanan. Ini berguna untuk menambahkan beberapa tajuk statis dengan mudah.
sumber
MessageHeader
) - bukan HTTP Header.Jika Anda ingin menambahkan header HTTP khusus ke setiap panggilan WCF dengan cara yang berorientasi objek, tidak perlu mencari lagi.
Sama seperti dalam jawaban Mark Good dan paulwhit, kita perlu subkelas
IClientMessageInspector
untuk menyuntikkan header HTTP khusus ke dalam permintaan WCF. Namun, mari buat inspektur lebih umum dengan menerima kamus yang berisi tajuk yang ingin kita tambahkan:Sama seperti dalam jawaban Mark Good dan paulwhit, kita perlu subkelas
IEndpointBehavior
untuk menyuntikkanHttpHeaderMessageInspector
klien kami ke WCF kami.Bagian terakhir yang diperlukan untuk menyelesaikan pendekatan berorientasi objek kami, adalah membuat subkelas dari klien yang dibuat secara otomatis WCF kami (saya menggunakan Panduan Referensi Layanan Web WCF Microsoft untuk menghasilkan klien WCF).
Dalam kasus saya, saya perlu melampirkan kunci API ke
x-api-key
header HTML.Subclass melakukan hal berikut:
EndpointConfiguration
enum dihasilkan untuk masuk ke konstruktor - mungkin implementasi Anda tidak akan memiliki ini)AddHttpHeaderMessageEndpointBehavior
klienEndpoint
Akhirnya, gunakan klien Anda!
Permintaan HTTP yang dihasilkan harus berisi tajuk HTTP Anda dan terlihat seperti ini:
sumber
Agak terlambat ke pesta tetapi Juval Lowy membahas skenario yang tepat ini dalam bukunya dan perpustakaan ServiceModelEx terkait .
Pada dasarnya ia mendefinisikan spesialisasi ClientBase dan ChannelFactory yang memungkinkan menentukan nilai header jenis-aman. Saya suggesst mengunduh sumber dan melihat kelas HeaderClientBase dan HeaderChannelFactory.
John
sumber