Saya memiliki layanan WCF dan saya ingin mengeksposnya sebagai layanan RESTfull dan sebagai layanan SOAP. Adakah yang pernah melakukan hal seperti ini sebelumnya?
Anda dapat mengekspos layanan dalam dua titik akhir yang berbeda. satu SOAP dapat menggunakan pengikatan yang mendukung SOAP misalnya basicHttpBinding, yang SISA dapat menggunakan webHttpBinding. Saya berasumsi layanan REST Anda akan berada di JSON, dalam hal ini, Anda perlu mengonfigurasi dua titik akhir dengan konfigurasi perilaku berikut
Cara lain untuk melakukannya adalah mengekspos dua kontrak layanan yang berbeda dan masing-masing dengan konfigurasi spesifik. Ini dapat menghasilkan beberapa duplikat di tingkat kode, namun pada akhirnya, Anda ingin membuatnya berfungsi.
Bagaimana ini terlihat ketika saya memiliki .svc di-host di IIS di beberapa direktori virtual seperti someserver / myvirtualdir / service.svc ? Bagaimana saya harus mengaksesnya?
Sunny Milenov
Saya ingin mengambil langkah ini lebih jauh dan menambahkan ikatan ke HTTPS untuk alamat JSON. Bagaimana aku melakukan itu? stackoverflow.com/questions/18213472/…
Steve
Dikatakan bahwa kontrak IEvents saya tidak valid ketika saya mencoba mereferensikan Antarmuka Layanan saya: <service name = "Events"> <endpoint address = "json" binding = "webHttpBinding" behaviorConfiguration = "jsonBehavior" contract = "IEvents" />. IEvents saya memiliki atribut [ServiceContract] pada antarmuka jadi tidak yakin mengapa. </service>
PositiveGuy
Saya bisa mendapatkan localhost: 44652 / MyResource / json untuk bekerja tetapi saya tidak bisa mendapatkan id untuk bekerja localhost: 44652 / MyResource / 98 / json . Saya sudah mencoba menambahkan UriTemplate "/ {id}", juga mencoba "events / {id} tetapi tidak menemukannya ketika saya mencoba mengakses layanan. Hanya yang pertama berfungsi, tidak yakin bagaimana cara mendapatkan yang terakhir untuk bekerja
PositiveGuy
2
Bagaimana cara kerjanya tanpa file fisik di sana? Saya sepertinya mendapatkan 404 kesalahan, pasti melewatkan sesuatu
RoboJ1M
39
Posting ini sudah memiliki jawaban yang sangat bagus oleh "Komunitas wiki" dan saya juga merekomendasikan untuk melihat Blog Web Rick Strahl, ada banyak posting bagus tentang WCF Istirahat seperti ini .
Saya menggunakan keduanya untuk mendapatkan layanan MyService semacam ini ... Kemudian saya bisa menggunakan antarmuka-REST dari jQuery atau SOAP dari Java.
Sebenarnya saya hanya menggunakan Json atau Xml tetapi keduanya ada di sini untuk tujuan demo. Itu adalah GET-permintaan untuk mendapatkan data. Untuk memasukkan data, saya akan menggunakan metode dengan atribut:
Ini untuk tujuan pengujian. Hanya untuk melihat apakah titik akhir Anda berfungsi. Sudahkah Anda melihat SoapUI? soapui.org
Darrel Miller
@ TuomasHietanen - Saya tidak mendapatkan respons tipe JSON dengan menggunakan perilaku webHttp namun menggunakan enableWebScript saya mendapatkan respons tipe JSON. Saya memang menaruh ResponseFormat sebagai WebMessageFormat.Json. Di sisi lain saya tidak bisa menggunakan URItemplate jika saya menggunakan perilaku enableWebScript. Ada ide?
smile.al.d.way
1
@CoffeeAddict - Mengapa Anda harus menggunakan inteface? Hanya untuk memiliki antarmuka? Anda tidak akan menggunakan kembali antarmuka ini. Ini lebih sederhana.
Tuomas Hietanen
25
Jika Anda hanya ingin mengembangkan satu layanan web dan memilikinya di-host pada banyak titik akhir yang berbeda (yaitu SOAP + REST, dengan XML, JSON, CSV, output HTML). Anda juga harus mempertimbangkan menggunakan ServiceStack yang telah saya buat untuk tujuan persis ini di mana setiap layanan yang Anda kembangkan tersedia secara otomatis pada SOAP dan REST endpoint out-of-the-box tanpa konfigurasi apa pun yang diperlukan.
Contoh Hello World menunjukkan cara membuat layanan sederhana dengan adil (tidak perlu konfigurasi):
Itu juga datang built-in dengan output HTML yang bersahabat (ketika dipanggil dengan klien HTTP yang memiliki Terima: teks / html misalnya browser) sehingga Anda dapat memvisualisasikan output layanan Anda dengan lebih baik.
Menangani berbagai kata kerja REST juga sepele, berikut adalah aplikasi CRUD layanan-REST lengkap dalam 1 halaman C # (kurang dari yang dibutuhkan untuk mengonfigurasi WCF;):
Secara default, Windows Communication Foundation (WCF) membuat titik akhir hanya tersedia untuk klien SOAP. Dalam Cara: Membuat Layanan HTTP Web WCF Dasar, titik akhir dibuat tersedia untuk klien non-SOAP. Mungkin ada saat-saat ketika Anda ingin membuat kontrak yang sama tersedia dua arah, sebagai titik akhir Web dan sebagai titik akhir SOAP. Topik ini menunjukkan contoh cara melakukan ini.
Akhirnya kita harus mendefinisikan 2 titik akhir dalam definisi layanan. Perhatian untuk alamat = "" titik akhir, di mana untuk layanan REST tidak diperlukan apa-apa.
Inilah yang saya lakukan untuk membuatnya bekerja. Pastikan Anda memasukkan webHttp automaticFormatSelectionEnabled = "true" di dalam perilaku endpoint.
[ServiceContract]publicinterfaceITestService{[WebGet(BodyStyle=WebMessageBodyStyle.Bare,UriTemplate="/product",ResponseFormat=WebMessageFormat.Json)]stringGetData();}publicclassTestService:ITestService{publicstringGetJsonData(){return"I am good...";}}
<endpointBehaviors><behaviorname="jsonBehavior"><webHttpautomaticFormatSelectionEnabled="true"/><!-- use JSON serialization --></behavior></endpointBehaviors>
Jawaban:
Anda dapat mengekspos layanan dalam dua titik akhir yang berbeda. satu SOAP dapat menggunakan pengikatan yang mendukung SOAP misalnya basicHttpBinding, yang SISA dapat menggunakan webHttpBinding. Saya berasumsi layanan REST Anda akan berada di JSON, dalam hal ini, Anda perlu mengonfigurasi dua titik akhir dengan konfigurasi perilaku berikut
Contoh konfigurasi titik akhir dalam skenario Anda adalah
jadi, layanan akan tersedia di
Terapkan [WebGet] ke kontrak operasi untuk membuatnya TENANG. misalnya
Catatan, jika layanan REST tidak dalam JSON, parameter operasi tidak dapat berisi tipe kompleks.
Membalas posting untuk SOAP dan RESTful POX (XML)
Untuk XML tua biasa sebagai format pengembalian, ini adalah contoh yang akan bekerja untuk SOAP dan XML.
Perilaku POX untuk REST Plain Old XML
Titik akhir
Layanan akan tersedia di
Permintaan REST mencobanya di browser,
SOAP meminta konfigurasi titik akhir klien untuk layanan SOAP setelah menambahkan referensi layanan,
dalam C #
Cara lain untuk melakukannya adalah mengekspos dua kontrak layanan yang berbeda dan masing-masing dengan konfigurasi spesifik. Ini dapat menghasilkan beberapa duplikat di tingkat kode, namun pada akhirnya, Anda ingin membuatnya berfungsi.
sumber
Posting ini sudah memiliki jawaban yang sangat bagus oleh "Komunitas wiki" dan saya juga merekomendasikan untuk melihat Blog Web Rick Strahl, ada banyak posting bagus tentang WCF Istirahat seperti ini .
Saya menggunakan keduanya untuk mendapatkan layanan MyService semacam ini ... Kemudian saya bisa menggunakan antarmuka-REST dari jQuery atau SOAP dari Java.
Ini dari Web saya. Konfigurasi:
Dan ini adalah kelas layanan saya (.svc-codebehind, tidak diperlukan antarmuka):
Sebenarnya saya hanya menggunakan Json atau Xml tetapi keduanya ada di sini untuk tujuan demo. Itu adalah GET-permintaan untuk mendapatkan data. Untuk memasukkan data, saya akan menggunakan metode dengan atribut:
sumber
Jika Anda hanya ingin mengembangkan satu layanan web dan memilikinya di-host pada banyak titik akhir yang berbeda (yaitu SOAP + REST, dengan XML, JSON, CSV, output HTML). Anda juga harus mempertimbangkan menggunakan ServiceStack yang telah saya buat untuk tujuan persis ini di mana setiap layanan yang Anda kembangkan tersedia secara otomatis pada SOAP dan REST endpoint out-of-the-box tanpa konfigurasi apa pun yang diperlukan.
Contoh Hello World menunjukkan cara membuat layanan sederhana dengan adil (tidak perlu konfigurasi):
Tidak diperlukan konfigurasi lain, dan layanan ini segera tersedia dengan REST di:
Itu juga datang built-in dengan output HTML yang bersahabat (ketika dipanggil dengan klien HTTP yang memiliki Terima: teks / html misalnya browser) sehingga Anda dapat memvisualisasikan output layanan Anda dengan lebih baik.
Menangani berbagai kata kerja REST juga sepele, berikut adalah aplikasi CRUD layanan-REST lengkap dalam 1 halaman C # (kurang dari yang dibutuhkan untuk mengonfigurasi WCF;):
sumber
MSDN tampaknya memiliki artikel untuk ini sekarang:
https://msdn.microsoft.com/en-us/library/bb412196(v=vs.110).aspx
Pengantar:
sumber
Kita harus mendefinisikan konfigurasi perilaku ke titik akhir REST
dan juga ke layanan
Setelah perilaku, langkah selanjutnya adalah binding. Misalnya basicHttpBinding ke SOAP endpoint dan webHttpBinding ke REST .
Akhirnya kita harus mendefinisikan 2 titik akhir dalam definisi layanan. Perhatian untuk alamat = "" titik akhir, di mana untuk layanan REST tidak diperlukan apa-apa.
Dalam Antarmuka layanan, kami mendefinisikan operasi dengan atributnya.
Bergabung dengan semua pihak, ini akan menjadi definisi system.serviceModel WCF kami.
Untuk menguji kedua titik akhir, kita dapat menggunakan WCFClient untuk SOAP dan PostMan untuk REST .
sumber
Inilah yang saya lakukan untuk membuatnya bekerja. Pastikan Anda memasukkan
webHttp automaticFormatSelectionEnabled = "true" di dalam perilaku endpoint.
Model layanan di dalam
Perilaku EndPoint
sumber