Saya memiliki skenario berikut yang saya coba uji:
- WSDL umum
- Titik akhir WCF yang mengimplementasikan objek berdasarkan WSDL dan di-host di IIS.
- Aplikasi klien yang menggunakan proxy yang berbasis WSDL untuk membuat permintaan.
Ketika saya melakukan panggilan layanan web dari klien ke titik akhir layanan, saya mendapatkan pengecualian berikut:
{"Pesan dengan Action ' http: // IMyService / CreateContainer ' tidak dapat diproses di penerima, karena ketidakcocokan ContractFilter di EndpointDispatcher. Ini mungkin karena ketidakcocokan kontrak (Tindakan yang tidak cocok antara pengirim dan penerima) atau pengikatan / keamanan tidak cocok antara pengirim dan penerima. Periksa apakah pengirim dan penerima memiliki kontrak yang sama dan pengikatan yang sama (termasuk persyaratan keamanan, mis. Pesan, Transport, Tidak Ada). "}
Saya mulai menggunakan MS Service Trace Viewer, tetapi tidak yakin ke mana mencarinya. Saat melihat kelas di klien dan titik akhir, mereka tampak identik.
Bagaimana seseorang mulai men-debug masalah ini?
Apa sajakah kemungkinan penyebab pengecualian ini?
Saya mengalami kesalahan ini dan itu disebabkan oleh kontrak penerima tidak menerapkan metode yang dipanggil. Pada dasarnya, seseorang belum menerapkan versi terbaru dari layanan WCF ke server host.
sumber
Anda juga akan mendapatkan ini jika Anda mencoba menyambung ke URL yang salah ;)
Saya memiliki dua titik akhir dan layanan yang ditentukan dalam sistem saya, dengan nama yang mirip.
Mendapat kesalahan persis ini saat URL ditukar pada klien saya di beberapa titik. Benar-benar menggaruk-garuk kepala sampai akhirnya menemukan kesalahan bodoh ini.
sumber
Saya mengalami masalah ini dan menemukan bahwa di generator proxy saya, yang saya salin dari layanan lain, saya lupa mengganti nama layanan.
Saya mengubah ini ...
untuk...
Itu adalah kesalahan kode sederhana, tetapi hampir tidak mungkin untuk di-debug. Saya harap ini menghemat waktu seseorang.
sumber
Untuk klien Java yang memanggil titik akhir .net. Hal ini disebabkan oleh ketidakcocokan header Soap Action.
Header HTTP di atas atau tag XML berikut harus cocok dengan tindakan / metode yang Anda coba panggil.
sumber
Saya menyelesaikan ini dengan menambahkan yang berikut ke implementasi kontrak saya:
[
ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
Sebagai contoh:
sumber
Saya mendapatkan ini setelah saya menyalin file SVC dan mengganti namanya. Meskipun nama file dan file svc.cs telah diubah namanya dengan benar, markup masih merujuk ke file aslinya.
Untuk memperbaikinya, klik kanan pada file svc yang disalin dan pilih Lihat Markup dan ubah referensi layanan.
sumber
Seperti yang disebutkan dalam jawaban lain, seperti @chinto, ini terjadi ketika SOAP: elemen header Tindakan tidak cocok dengan Endpoint.
Anda dapat menemukan URI yang benar untuk digunakan dengan melihat WSDL server. Anda akan melihat elemen operasi dengan anak masukan yang memiliki atribut "Tindakan". Itulah SOAP Anda: Tindakan harus berdasarkan permintaan klien.
sumber
Saya memiliki masalah yang sama. Masalahnya adalah saya menyalin kode dari layanan lain sebagai titik awal dan tidak mengubah kelas layanan dalam file .svc
Buka file .svc dan pastikan bahwa atribut Layanan sudah benar.
sumber
Kesalahan mengatakan bahwa ada ketidakcocokan, dengan asumsi Anda memiliki kontrak yang sama berdasarkan WSDL yang sama, maka ketidakcocokan ada dalam konfigurasi.
Misalnya klien menggunakan nettcpip dan server diatur untuk menggunakan http dasar.
sumber
Saya mengalami kesalahan serupa. Ini mungkin karena Anda akan mengubah beberapa pengaturan kontrak pada file konfigurasi Anda setelah direferensikan ke dalam proyek Anda. solusi - Perbarui referensi layanan web pada proyek VSstudio Anda atau buat proxy baru menggunakan svcutil.exe
sumber
Kesalahan ini biasanya muncul jika kode tidak diterapkan dengan benar.
Dalam kasus saya, saya memiliki dua layanan ServiceA dan ServiceB. Saya menemukan masalah bahwa file ServiceB tidak diterapkan dengan benar. Karena itu ketika ServiceA memanggil ServiceB secara internal, itu memberikan kesalahan di bawah ini.
Pastikan file dan referensi diterapkan dengan benar.
sumber
Saya menghabiskan waktu berhari-hari mencari jawabannya dan saya menemukannya, tetapi tidak di utas ini. Saya sangat baru mengenal WCF dan C #, jadi bagi beberapa orang jawabannya mungkin sudah jelas.
Dalam situasi saya, saya memiliki alat klien yang awalnya dikembangkan untuk layanan ASMX, dan bagi saya alat itu mengembalikan pesan kesalahan yang sama.
Setelah mencoba segala macam rekomendasi, saya menemukan situs ini:
http://myshittycode.com/2013/10/01/the-message-with-action-cannot-be-processed-at-the-receiver-due-to-a-contractfilter-mismatch-at-the-endpointdispatcher/
Itu menempatkan saya di jalan yang benar. Khususnya "soap: operation" - WCF telah menambahkan ServiceName ke Namespace:
klien diharapkan
Http://TEST.COM/Login
, tetapi WCF dikirimHttp://TEST.COM/IService1/Login
. Solusinya adalah menambahkan pengaturan[OperationContract]
seperti ini:[OperationContract(Action = "http://TEST.COM/Login", ReplyAction = "http://TEST.COM/Login")]
(Abaikan spasi kosong di Http)sumber
Ini bisa jadi karena 2 alasan untuk ini:
referensi layanan sudah usang, klik kanan layanan ref dan perbarui.
kontrak yang telah Anda terapkan mungkin berbeda dengan kontrak yang dimiliki klien. Bandingkan kedua layanan n kontrak klien n perbaiki ketidakcocokan kontrak.
sumber
Jika Anda memanggil metode WCF, Anda harus menyertakan antarmuka di Header.
sumber
Juga mungkin berguna bagi mereka yang melakukan ini dengan coding. Anda perlu menambahkan WebHttpBehavior () ke titik akhir layanan yang Anda tambahkan. Sesuatu seperti:
Lihat di: https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/calling-a-rest-style-service-from-a-wcf-service
sumber
Konyol, tetapi saya lupa menambahkan
[OperationContract]
ke antarmuka layanan saya (yang ditandai dengan[ServiceContract]
) dan kemudian Anda juga mendapatkan kesalahan ini.sumber
Klien Anda tidak diperbarui. Jadi, Perbarui layanan Anda dari layanan Web dan kemudian buat kembali proyek Anda
sumber
Saya punya masalah ini juga. Ternyata itu disebabkan oleh pembuat kontrak di ujung server. Itu tidak dapat mengembalikan objek kontrak data saya karena beberapa anggota datanya adalah properti hanya-baca .
Pastikan objek Anda memiliki penyetel untuk properti yang dimaksudkan untuk diserialisasi.
sumber
Anehnya kami mengatasi kesalahan ini dengan menggunakan casing yang sama dengan nama Path dan OperationContract yang digunakan. Rupanya peka huruf besar / kecil. Jika ada yang tahu kenapa, tolong beri komentar. Terima kasih!
sumber
Jadi, kasus saya adalah sebagai berikut. Saya tidak menggunakan proxy untuk interaksi klien-server, saya menggunakan ChannelFactory (jadi semua saran untuk meningkatkan ke referensi layanan tidak ada artinya bagi saya).
Layanan di-host di IIS dan karena alasan tertentu itu memiliki referensi yang salah di folder bin di sana. Kompilasi ulang proyek tidak mengarah ke dll baru di folder itu.
Jadi saya baru saja menghapus semua barang dari sana dan menambahkan referensi ke layanan dalam solusi yang sama, lalu mengkompilasi ulang dan sekarang semuanya berfungsi.
sumber
Masalah saya ternyata adalah sesuatu yang langka, tetapi saya akan tetap menyebutkannya.
Saya mengalami masalah saat menerapkan ke lingkungan pengembangan kami. Di mesin itu, orang pembuat kami telah membuat dua folder (menggunakan dua aplikasi). Versi lama dan versi baru saat ini. Jadi jika Anda tidak memiliki dua versi aplikasi Anda di server web, ini tidak berlaku untuk Anda.
Lokasi baru yang dia buat memiliki nama non-standar sebagai bagian pertama url setelah host:
net.tcp://dev.umbrellacorp.com/
DifferentFolderName
/MyProvider
Di komputer lokal saya, klien saya menunjuk ke nama folder standar seperti yang diatur di semua lingkungan (kecuali pengembangan), termasuk lingkungan lokal saya.
net.tcp://dev.umbrellacorp.com/
AppServices
/MyProvider
Ketika saya meniup dan mengganti web.config pada pengembangan dengan salinan lokal saya, bagian dari url yang perlu khusus dihilangkan dengan bagian standar, sehingga klien di dev menunjuk ke aplikasi lama.
Aplikasi lama memiliki kontrak lama dan tidak memahami permintaan tersebut dan melakukan kesalahan ini.
sumber
Saya mengalami kesalahan yang sama pada layanan WCF yang disebarkan, masalahnya terkait dengan layanan lain yang digunakan dengan kontrak lain dengan port yang sama.
Larutan
Saya menggunakan port yang berbeda di web.config dan masalahnya hilang.
Layanan 1
Layanan 2
Selain itu , saya mengalami situasi ini dengan menggunakan port yang berbeda untuk alamat yang sama antara layanan dan konsumen.
sumber
Saya mengalami kesalahan ini karena saya memiliki versi lama DLL di GAC server saya. Jadi pastikan semuanya direferensikan dengan benar dan bahwa assembly / GAC up to date dengan dll yang baik.
sumber
Saya mengalami masalah ini pada server pengujian saya, karena saya menjalankan dua salinan dari wcf yang sama di pool aplikasi yang sama. Apa yang memecahkan bagi saya adalah membuat kolam terpisah untuk setiap versi di wcf saya dan mulai ulang IIS setelah ini.
sumber
Bagi mereka yang menggunakan NodeJS dengan axios untuk membuat permintaan SOAP, Anda harus menyertakan file
SOAPAction header
. Lihat contoh di bawah ini:sumber