EndpointDispatcher istisnasında ContractFilter uyuşmazlığı


116

Test etmeye çalıştığım şu senaryoya sahibim:

  1. Ortak bir WSDL
  2. WSDL'ye dayalı nesneleri uygulayan ve IIS'de barındırılan WCF uç noktası.
  3. İstek oluşturmak için WSDL tabanlı bir proxy kullanan bir istemci uygulaması.

İstemciden hizmet uç noktasına bir web hizmeti çağrısı yaptığımda, aşağıdaki istisnayı alıyorum:

{" EndpointDispatcher'daki ContractFilter uyuşmazlığı nedeniyle ' http: // IMyService / CreateContainer ' Eylemine sahip mesaj alıcıda işlenemiyor. Bunun nedeni, bir sözleşme uyuşmazlığı (gönderen ile alıcı arasındaki uyumsuz Eylemler) veya bir Gönderen ve alıcı arasındaki bağlanma / güvenlik uyuşmazlığı. Gönderen ve alıcının aynı sözleşmeye ve aynı bağlamaya sahip olup olmadığını kontrol edin (güvenlik gereksinimleri, ör. Mesaj, Taşıma, Yok dahil). "}

MS Service Trace Viewer'ı kullanmaya başladım, ancak nereye bakacağımı bilmiyorum. İstemcideki ve uç noktadaki sınıflara bakarken aynı görünüyorlar.

Bu sorun nasıl giderilmeye başlanır?

Bu istisnanın bazı olası nedenleri nelerdir?

Yanıtlar:


75

"EndpointDispatcher'daki ContractFilter uyuşmazlığı", alıcının mesajı alan son nokta için yapılandırdığı sözleşmelerin hiçbiriyle eşleşmediği için alıcının mesajı işleyemediği anlamına gelir.

Bunun nedeni şunlar olabilir:

  • Müşteri ve gönderen arasında farklı sözleşmeleriniz var.
  • Müşteri ve gönderen arasında farklı bir bağlantı kullanıyorsunuz.
  • Mesaj güvenlik ayarları, istemci ve gönderen arasında tutarlı değil.

EndpointDispatcherKonuyla ilgili daha fazla bilgi için sınıfa bakın.

Yani:

İstemci ve sunucu sözleşmelerinizin eşleştiğinden emin olun.

  • İstemcinizi bir WSDL'den oluşturduysanız, WSDL güncel mi?
  • Sözleşmede yakın zamanda bir değişiklik yaptıysanız, hem istemcinin hem de sunucunun doğru sürümünü kullandınız mı?
  • İstemci sözleşme sınıflarınızı elle oluşturduysanız, ad alanlarının, öğe adlarının ve eylem adlarının sunucu tarafından beklenenlerle eşleştiğinden emin olun.

İstemci ve sunucu arasındaki bağlantıların aynı olup olmadığını kontrol edin.

  • Uç noktalarınızı yönetmek için bir .config dosyası kullanıyorsanız, bağlama öğelerinin eşleştiğinden emin olun.

İstemci ve sunucu arasındaki güvenlik ayarlarının aynı olup olmadığını kontrol edin.

  • Uç noktalarınızı yönetmek için bir .config dosyası kullanıyorsanız, güvenlik öğelerinin eşleştiğinden emin olun.

3
ayrıca .svc dosyasında hizmet özniteliğinin doğru olduğundan emin olun. Aşağıdaki cevabıma bakın.
AntonK

Aynı sorunla karşılaştığım için (yeni gelenler için) yukarıdaki çözüme eklemek istedim, ancak yukarıdaki çözüm benim için işe yaramadı. Yukarıdaki geçici çözümleri zaten denediyseniz ve yine de aynı hatayı alıyorsanız, yapılandırmanızı, hem sunucuda hem de istemcide zaten doğru olsa bile, dahil edilen basit uç noktaları yeniden yazarak güncellemeyi deneyin.
devpro101

75

Bu hatayı aldım ve bu, çağrılan yöntemi uygulamayan alıcı sözleşmesinden kaynaklanıyordu. Temel olarak, birisi WCF hizmetinin en son sürümünü ana sunucuya dağıtmamıştı.


13
+1 - Aynı şey bana da oldu, benim durumumda "birisi" olmam dışında. Sunucu tarafı kodunu işlemeyi ve dağıtmayı unutmuştum.
Jesse Webb

2
Evet, SABUN Eyleminin adını yanlış anladım. Tempuri.org/ICodeGenService/RenderApp istiyordu , ancak nedense WSDL'yi ayrıştıran kod sadece tempuri.org/RenderApp'ı düşünüyordu .
user435779

Ben de. Yöntem .SVC.CS'imde vardı, ancak arayüzümde karşılık gelen OperationContract yok.
PahJoker

Ben de :) Geliştirilmekte olan yerel hizmeti kullanarak SoapUI'deki WSDL'yi yeniledim ve hizmetteki yeni yönteme karşı bir istek oluşturduğumda SoapUI geliştirme ortamımızı kullandı. Yani, yöntem güzel çalışıyordu, sadece yanlış URL'yi sorguladım.
Larsbj

2
Teşekkürler! Hata ayıklamak için saatler harcamadım, bunun yerine bunu okuduktan sonra istekleri yanlış bir ortama gönderdiğimi çabucak anladım.
Jan Matousek

20

Yanlış URL'ye bağlanmaya çalışırsanız da bunu alırsınız ;)

Sistemimde benzer adlarla tanımlanmış iki uç noktam ve hizmetim var.

Bir noktada istemcimde URL'ler değiştirildiğinde bu tam hatayı aldım. Bu aptalca hatayı nihayet çözene kadar gerçekten kafasını kaşıdı.


3
Emin olmak aptalca bir hata, ama burada çok faydalı bir cevap. Açıkça görülen bir şey olduğu için kolayca gözden kaçabilir.
mungflesh

Yanlış url - 'Son nokta dinleme yok' hatası
veriyor

20

Bu sorunu yaşadım ve başka bir servisten kopyaladığım proxy jeneratörümde servisin adını değiştirmeyi unuttuğumu fark ettim.

Bunu değiştirdim ...

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

için ...

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

Bu basit bir kod hatasıydı, ancak hata ayıklaması neredeyse imkansızdı. Umarım bu birisine zaman kazandırır.


Bu benim de davamdı.
Vasyl Boroviak

Teşekkürler, aynı sorunu yaşadım!
Dieterg

10

.Net uç noktasını çağıran bir Java istemcisi için. Bu, uyumsuz Soap Action başlığından kaynaklanıyordu.

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

Yukarıdaki HTTP başlığının veya aşağıdaki XML etiketinin, çağırmaya çalıştığınız eylem / yöntemle eşleşmesi gerekir.

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

9

Bunu, sözleşme uygulamama aşağıdakileri ekleyerek çözdüm:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

Örneğin:

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

}

Bu, iletilen bir bağlantı noktasıyla ilgili sorunumu çözdü. Teşekkür ederim.
Mathias Müller

Yeni bir hata almadım, IIS'den nefret ediyorum - CommunicationException: Sunucu anlamlı bir yanıt vermedi; bunun nedeni bir sözleşme uyuşmazlığı, oturumun erken kapanması veya dahili bir sunucu hatası olabilir.
AriesConnolly

8

Bunu svc dosyasını kopyalayıp yeniden adlandırdıktan sonra aldım. Dosya adı ve svc.cs dosyası doğru şekilde yeniden adlandırılmış olsa da, işaretleme yine de orijinal dosyaya referans veriyordu.

Bunu düzeltmek için, kopyalanan svc dosyasına sağ tıklayın ve İşaretlemeyi Görüntüle'yi seçin ve hizmet referansını değiştirin.


5

@Chinto gibi diğer yanıtlarda da belirtildiği gibi, bu, SOAP: Action başlık öğesi Uç Nokta ile eşleşmediğinde gerçekleşir.

Sunucunun WSDL'sine bakarak kullanılacak doğru URI'yi bulabilirsiniz. "Action" özniteliğine sahip bir input alt öğesine sahip bir işlem öğesi göreceksiniz. SABUNUNUZ budur: Eylem, müşterinin isteği üzerine olmalıdır.

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

günlerce googling, test etme ve delirmeden sonra - bu cevap bana yardımcı oldu. Teşekkürler.
babboon

benim özel senaryomda, Apache HttpClient kullanarak java sınıfımdan WebService'e çağrı yapıyordum. Soap eylem başlığını ayarlamak için setContent Type için setHeader yöntemini çağırdıktan hemen sonra HttpPost SetHeader yöntemini çağırdım.
vofili

3

Ben de aynı sorunu yaşadım. Sorun, kodu başka bir hizmetten başlangıç ​​noktası olarak kopyaladığım ve .svc dosyasındaki hizmet sınıfını değiştirmediğimdi.

.Svc dosyasını açın ve Hizmet özniteliğinin doğru olduğundan emin olun.

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

2

Hata, aynı WSDL'ye dayalı ortak bir sözleşmeniz olduğunu varsayarak bir uyumsuzluk olduğunu söylüyor, bu durumda uyumsuzluk yapılandırmada.

Örneğin, istemci nettcpip kullanıyor ve sunucu temel http kullanmak üzere ayarlanmış.


2

Benzer bir hatam vardı. Bunun nedeni, projenize yeniden uyarlandıktan sonra yapılandırma dosyanızdaki bazı sözleşme ayarlarını değiştirmiş olmanız olabilir. çözüm - VSstudio projenizdeki web hizmeti referansını güncelleyin veya svcutil.exe kullanarak yeni bir proxy oluşturun


1

Bu hata genellikle kod doğru şekilde dağıtılmadığında ortaya çıkar.

Benim durumumda, ServiceA ve ServiceB olmak üzere iki hizmetim var. ServiceB dosyalarının düzgün dağıtılmaması sorununu buldum. Bu nedenle ServiceA, ServiceB'yi dahili olarak aradığında aşağıdaki hata veriyordu.

**Hata**

Lütfen dosyaların ve referansların doğru bir şekilde dağıtıldığından emin olun.


1

Cevabı aramak için günler harcadım ve buldum, ama bu ileti dizisinde değil. WCF ve C # konusunda çok yeniyim, bu nedenle bazılarına cevap açık olabilir.

Benim durumumda, aslen ASMX servisi için geliştirilmiş bir istemci aracım vardı ve benim için aynı hata mesajını veriyordu.

Her türlü öneriyi denedikten sonra bu siteyi buldum:

http://myshittycode.com/2013/10/01/the-message-with-action-cannot-be-processed-at-the-receiver-due-to-a-contractfilter-mismatch-at-the-endpointdispatcher/

Beni doğru yola soktu. Özellikle "soap: operation" - WCF, HizmetAdı'nı Ad Alanına ekliyordu:

istemci bekleniyordu Http://TEST.COM/Login, ancak WCF gönderildi Http://TEST.COM/IService1/Login. Çözüm, [OperationContract]böyle bir ayar eklemektir :

[OperationContract(Action = "http://TEST.COM/Login", ReplyAction = "http://TEST.COM/Login")] (Http'deki boş alanları göz ardı edin)


2
İyi. Çözümünüz, hizmetin bazı müşterilerin beklediği gibi davranmasını sağlamaktır. Ancak, istemcinin sunucunun sözleşmesine gerçekten uymasını sağlayarak eşit derecede iyi (veya çoğu durumda, tercihen) çözülebilir! Sonuçta sunucu, sözleşmenin yayıncısıdır.
Dag

1

Bunun 2 nedeni olabilir:

  1. hizmet referansı eski, sağ tıklama servis ref n güncelleyin.

  2. Uyguladığınız sözleşme müşterinin sahip olduğundan farklı olabilir. Her iki hizmeti n müşteri sözleşmesini karşılaştırın n sözleşmelerin uyumsuzluğunu giderin.


1

WCF yöntemini arıyorsanız, Header'a arabirimi eklemelisiniz.

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+ "\"");
}


0

Aptalca, ancak [OperationContract]hizmet arayüzüme (ile işaretli olanı [ServiceContract]) eklemeyi unuttum ve sonra bu hatayı da alıyorsunuz.


0

İstemciniz güncellenmedi.Bu yüzden hizmetlerinizi Web hizmetinden güncelleyin ve ardından projenizi yeniden oluşturun


0

Ben de bu sorunu yaşadım. Bunun sunucu tarafındaki sözleşme serileştiricisinden kaynaklandığı ortaya çıktı. Veri sözleşmesi nesnemi döndüremedi çünkü veri üyelerinden bazıları salt okunur özelliklerdi .

Nesnelerinizin serileştirilmesi amaçlanan özellikler için ayarlayıcılara sahip olduğundan emin olun.


0

İşin garibi, kullanılan Path ve OperationContract adının aynısını kullanarak bu hatayı çözdük. Görünüşe göre büyük / küçük harfe duyarlıydı. Nedenini bilen varsa, lütfen yorum yapın. Teşekkür ederim!


0

Yani benim durumum şöyleydi. İstemci-sunucu etkileşimi için proxy kullanmadım, ChannelFactory kullandım (bu nedenle hizmet referansına yükseltmek için tüm tavsiyeler benim için anlamsızdı).

Hizmet IIS'de barındırılıyordu ve bazı nedenlerden dolayı oradaki bin klasöründe yanlış referanslar vardı. Proje yeniden derlemesi bu klasörde yeni dll'lere yol açmadı.

Bu yüzden oradaki tüm şeyleri sildim ve aynı çözümde hizmete referans ekledim, sonra yeniden derledim ve şimdi her şey çalışıyor.


0

Sorunum nadiren ortaya çıktı, ancak yine de bahsedeceğim.

Geliştirme ortamımıza dağıtım sorunuyla karşılaştım. Bu makinede, derleme görevlimiz iki klasör oluşturdu (iki uygulamayı konuşlandırdı). Eski bir sürüm ve yeni güncel sürüm. Dolayısıyla, uygulamanızın web sunucusunda iki sürümü yoksa, bu sizin için geçerli değildir.

Oluşturduğu yeni konum, ana bilgisayardan sonraki url'nin ilk parçası olarak standart olmayan bir ada sahipti:

net.tcp://dev.umbrellacorp.com/DifferentFolderName/MyProvider

Yerel makinemde, istemcim yerel ortamım da dahil olmak üzere tüm ortamlarda (geliştirme hariç) ayarlandığı şekliyle standart klasör adını gösteriyordu.

net.tcp://dev.umbrellacorp.com/AppServices/MyProvider

Gelişimdeki web.config dosyasını kendi yerel kopyamla değiştirdiğimde, url'nin özel olması gereken kısmı standart kısımla birlikte uçup gitti, dolayısıyla geliştirici üzerindeki istemci eski uygulamayı işaret etti.

Eski uygulamanın eski bir sözleşmesi vardı ve talebi anlamadı ve bu hatayı attı.


0

Dağıtılan bir WCF hizmetinde de aynı hatayı aldım, sorun aynı bağlantı noktasıyla başka bir sözleşmeyle dağıtılan başka bir hizmetle ilgiliydi.

Çözüm

Web.config dosyasında farklı bağlantı noktaları kullandım ve sorun ortadan kalktı.

Hizmet 1

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

Hizmet 2

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

Ayrıca hizmet ile tüketici arasında aynı adres için farklı port kullanarak bu durumla karşılaştım.


0

Bu hatayı aldım çünkü sunucumun GAC'sinde DLL'nin eski bir sürümü var. Bu nedenle, her şeyin doğru şekilde referans verildiğinden ve assembly / GAC'nin iyi dll ile güncel olduğundan emin olun.


0

Bu sorunu test sunucumda yaşadım çünkü aynı uygulama havuzunda aynı wcf'nin iki kopyasını çalıştırıyordum. Benim için çözülen şey, wcf'mdeki her sürüm için ayrı havuzlar oluşturmak ve bundan sonra IIS'yi yeniden başlatmaktı.


0

SOAP isteklerini yapmak için axios ile NodeJS kullananlar için bir SOAPAction header. Aşağıdaki örneği kontrol edin:

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)
  })
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.