ContractFilter tidak cocok pada pengecualian EndpointDispatcher

116

Saya memiliki skenario berikut yang saya coba uji:

  1. WSDL umum
  2. Titik akhir WCF yang mengimplementasikan objek berdasarkan WSDL dan di-host di IIS.
  3. 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?

laconicdev.dll
sumber

Jawaban:

75

"Ketidakcocokan ContractFilter di EndpointDispatcher" berarti penerima tidak dapat memproses pesan karena tidak cocok dengan kontrak apa pun yang telah dikonfigurasi penerima untuk titik akhir yang menerima pesan.

Ini bisa jadi karena:

  • Anda memiliki kontrak yang berbeda antara klien dan pengirim.
  • Anda menggunakan pengikatan yang berbeda antara klien dan pengirim.
  • Pengaturan keamanan pesan tidak konsisten antara klien dan pengirim.

Lihat EndpointDispatcherkelas untuk informasi lebih lanjut tentang subjek.

Begitu:

Pastikan kontrak klien dan server Anda cocok.

  • Jika Anda telah membuat klien dari WSDL, apakah WSDL sudah diperbarui?
  • Jika Anda baru-baru ini membuat perubahan pada kontrak, apakah Anda telah menerapkan versi yang benar dari klien dan server?
  • Jika Anda telah membuat kelas kontrak klien Anda sendiri, pastikan namespace, nama elemen, dan nama tindakan sesuai dengan yang diharapkan oleh server.

Periksa apakah pengikatan sama antara klien dan server.

  • Jika Anda menggunakan file .config untuk mengelola titik akhir Anda, pastikan elemen pengikat cocok.

Periksa pengaturan keamanan yang sama antara klien dan server.

  • Jika Anda menggunakan file .config untuk mengelola titik akhir Anda, pastikan elemen keamanan cocok.
Paul Turner
sumber
3
juga pastikan atribut layanan sudah benar di file .svc. Lihat jawaban saya di bawah.
AntonK
Hanya ingin menambahkan solusi di atas (untuk pendatang baru) karena saya telah mengalami masalah yang sama tetapi solusi di atas tidak berhasil untuk saya. Jika Anda telah mencoba solusi di atas dan masih mendapatkan kesalahan yang sama, coba perbarui konfigurasi Anda dengan mengetik ulang titik akhir sederhana yang terlibat meskipun itu sudah benar di server dan klien.
devpro101
74

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.

adam
sumber
12
+1 - Hal yang sama terjadi pada saya, kecuali dalam kasus saya yang menjadi "seseorang" adalah saya. Saya lupa untuk berkomitmen & menerapkan kode sisi server.
Jesse Webb
2
Yup, nama SOAP Action saya salah. Ia menginginkan tempuri.org/ICodeGenService/RenderApp , tetapi untuk beberapa alasan kode yang mengurai WSDL hanya berpikir tempuri.org/RenderApp .
pengguna435779
Saya juga. Saya memiliki metode di .SVC.CS saya, tetapi tidak ada OperationContract yang sesuai di antarmuka saya.
PahJoker
Saya juga :) Saya menyegarkan WSDL di SoapUI menggunakan layanan lokal yang sedang dikembangkan, dan ketika saya membuat permintaan terhadap metode baru dalam layanan tersebut, SoapUI menggunakan lingkungan pengembangan kami. Jadi, metode bekerja dengan baik, saya hanya menanyakan URL yang salah.
Larsbj
2
Terima kasih! Saya tidak menghabiskan berjam-jam debugging, sebaliknya setelah membaca ini saya segera menyadari bahwa saya mengirim permintaan ke lingkungan yang salah.
Jan Matousek
20

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.

Brady Moritz
sumber
3
Ini adalah kesalahan konyol untuk memastikannya, tetapi jawaban yang sangat berguna di sini. Karena itu adalah sesuatu yang jelas, hal itu mudah diabaikan.
mungflesh
URL salah memberikan - kesalahan 'tidak ada titik akhir mendengarkan'
AriesConnolly
19

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 ...

Return New Service1DataClient(binding, New EndpointAddress(My.Settings.WCFServiceURL & "/Service1Data.svc"))

untuk...

Return New Service2DataClient(binding, New EndpointAddress(My.Settings.WCFServiceURL & "/Service2Data.svc"))

Itu adalah kesalahan kode sederhana, tetapi hampir tidak mungkin untuk di-debug. Saya harap ini menghemat waktu seseorang.

rampok
sumber
Itu juga kasus saya.
Vasyl Boroviak
Terima kasih, saya punya masalah yang sama!
Dieterg
10

Untuk klien Java yang memanggil titik akhir .net. Hal ini disebabkan oleh ketidakcocokan header Soap Action.

Content-Type: application/soap+xml;charset=UTF-8;action="http://example.org/ExampleWS/exampleMethod"

Header HTTP di atas atau tag XML berikut harus cocok dengan tindakan / metode yang Anda coba panggil.

   <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/" xmlns:gen="http://schemas.datacontract.org/2004/07/GenesysOnline.WCFServices">
   <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
      <wsa:To>https://example.org/v1/Service.svc</wsa:To>
      <wsa:Action>http://example.org/ExampleWS/exampleMethod</wsa:Action>
   </soap:Header>
   <soap:Body>
    ...
   </soap:Body>
</soap:Envelope>
chinto
sumber
9

Saya menyelesaikan ini dengan menambahkan yang berikut ke implementasi kontrak saya:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

Sebagai contoh:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
public class MyUploadService : IMyUploadService
{

}
ben
sumber
Ini memecahkan masalah saya dengan port yang diteruskan. Terima kasih.
Mathias Müller
Bukan Saya mendapat kesalahan baru, saya benci IIS - CommunicationException: Server tidak memberikan balasan yang berarti; ini mungkin disebabkan oleh ketidakcocokan kontrak, penghentian sesi prematur atau kesalahan server internal.
AriesConnolly
8

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.

saya tidak tahu apa apa
sumber
5

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.

<wsdl:operation name="MethodName">
<wsdl:input wsaw:Action="http://tempuri.org/IInterface/MethodName" message="tns:IInterface_MethodName_InputMessage"/>
<wsdl:output wsaw:Action="http://tempuri.org/IInterface/MethodNameResponse" message="tns:IInterface_MethodName_OutputMessage"/>
</wsdl:operation>
Carson Evans
sumber
setelah berhari-hari googling dan menguji dan menjadi gila - jawaban ini membantu saya. Terima kasih.
babboon
dalam skenario khusus saya, saya membuat panggilan ke WebService dari kelas java saya menggunakan Apache HttpClient. Untuk menyetel header tindakan Soap, saya memanggil metode HttpPost SetHeader tepat setelah saya memanggil metode setHeader ke setContent Type.
vofili
3

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.

 <%@ ServiceHost Language="C#" Debug="true" Service="SME.WCF.ApplicationServices.ReportRenderer" CodeBehind="ReportRenderer.svc.cs" %>
AntonK
sumber
2

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.

Shiraz Bhaiji
sumber
2

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

Mahesh Kurup
sumber
1

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.

**Kesalahan**

Pastikan file dan referensi diterapkan dengan benar.

Atul K.
sumber
1

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 dikirim Http://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)

KSNSACC
sumber
2
Baik. Solusi Anda adalah membuat layanan berperilaku seperti yang diharapkan beberapa klien. Tapi itu bisa sama baiknya (atau dalam banyak kasus, lebih disukai) diselesaikan dengan meminta klien benar-benar sesuai dengan kontrak server! Bagaimanapun, server adalah penerbit kontrak.
The Dag
1

Ini bisa jadi karena 2 alasan untuk ini:

  1. referensi layanan sudah usang, klik kanan layanan ref dan perbarui.

  2. kontrak yang telah Anda terapkan mungkin berbeda dengan kontrak yang dimiliki klien. Bandingkan kedua layanan n kontrak klien n perbaiki ketidakcocokan kontrak.

Abdul sami
sumber
1

Jika Anda memanggil metode WCF, Anda harus menyertakan antarmuka di Header.

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Url);
if (Url.Contains(".svc"))
{
    isWCFService = true;
    req.Headers.Add("SOAPAction", "http://tempuri.org/WCF_INterface/GetAPIKeys");
}
else 
{
    req.Headers.Add("SOAPAction", "\"http://tempuri.org/" + asmxMethodName+ "\"");
}
Ahmet Arslan
sumber
1

Juga mungkin berguna bagi mereka yang melakukan ini dengan coding. Anda perlu menambahkan WebHttpBehavior () ke titik akhir layanan yang Anda tambahkan. Sesuatu seperti:

restHost.AddServiceEndpoint(typeof(IRestInterface), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior()); 

Lihat di: https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/calling-a-rest-style-service-from-a-wcf-service

Amir Dashti
sumber
Ini membantu saya menghemat waktu saya, Terima kasih :)
Sely Lychee
0

Konyol, tetapi saya lupa menambahkan [OperationContract]ke antarmuka layanan saya (yang ditandai dengan [ServiceContract]) dan kemudian Anda juga mendapatkan kesalahan ini.

Peter
sumber
0

Klien Anda tidak diperbarui. Jadi, Perbarui layanan Anda dari layanan Web dan kemudian buat kembali proyek Anda

Masoud Bahrami
sumber
0

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.

Crono
sumber
0

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!

MikeTeeVee
sumber
0

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.

psfinaki.dll
sumber
0

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.

toddmo
sumber
0

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

contract="Service.WCF.Contracts.IBusiness1" 
baseAddress="net.tcp://local:5244/ServiceBusiness" 

Layanan 2

contract="Service.WCF.Contracts.IBusiness2"
baseAddress="net.tcp://local:5243/ServiceBusiness"

Selain itu , saya mengalami situasi ini dengan menggunakan port yang berbeda untuk alamat yang sama antara layanan dan konsumen.

DanielV
sumber
0

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.

Helpha
sumber
0

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.

Johann
sumber
0

Bagi mereka yang menggunakan NodeJS dengan axios untuk membuat permintaan SOAP, Anda harus menyertakan file SOAPAction header. Lihat contoh di bawah ini:

axios.post('https://wscredhomosocinalparceria.facilinformatica.com.br/WCF/Soap/Emprestimo.svc?wsdl',
           xmls,
  {headers:
  {
    'Content-Type': 'text/xml',
    SOAPAction: 'http://schemas.facilinformatica.com.br/Facil.Credito.WsCred/IEmprestimo/CalcularPrevisaoDeParcelas'}
  }).then(res => {
    console.log(res)
  }).catch(err => {
    console.log(err.response.data)
  })
Christian Saiki
sumber