ContractFilter在EndpointDispatcherexception处不匹配

我有以下情况,我试图testing:

  1. 一个常见的WSDL
  2. WCF端点,它实现基于WSDL的对象并托pipe在IIS中。
  3. 使用基于WSDL的代理创build请求的客户端应用程序。

当我从客户端到服务端点进行Web服务调用时,出现以下exception:

{“带有Action'http:// IMyService / CreateContainer '的消息由于EndpointDispatcher中的ContractFilter不匹配而无法在接收方处理,这可能是由于合同不匹配(发送方和接收方之间的操作不匹配)发送方和接收方之间的绑定/安全性不匹配检查发送方和接收方是否具有相同的合同和绑定(包括安全性要求,如消息,传输,无)。

我开始使用MS服务跟踪查看器,但不知道在哪里看。 在查看客户端和端点中的类时,它们显得完全相同。

如何开始debugging这个问题?

这个例外有什么可能的原因?

“EndpointDispatcher中的ContractFilter不匹配”意味着接收方无法处理该消息,因为它不匹配接收方为收到该消息的端点configuration的任何合约。

这可能是因为:

  • 客户和发件人之间有不同的合同。
  • 您正在使用客户端和发件人之间的不同绑定。
  • 客户端和发件人之间的邮件安全设置不一致。

请查看EndpointDispatcher类以获取有关该主题的更多信息。

我有这个错误,这是由于收件人合同没有实现被调用的方法。 基本上,有人没有将最新版本的WCF服务部署到主机服务器上。

我有这个问题,发现我的代理生成器,我从另一个服务复制,我忘了改变服务的名称。

我改变了这个…

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

至…

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

这是一个简单的代码错误,但几乎不可能debugging。 我希望这可以节省一些时间。

如果您尝试连接到错误的URL ,您也会得到这个;)

我在系统中定义了两个端点和服务,名称相似。

得到这个确切的错误,当我的客户在某些时候交换的URL。 真的挠了脑袋,直到最后弄清楚这个愚蠢的错误。

我通过将以下内容添加到合同执行中来解决此问题:

[ ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

例如:

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

我复制了svc文件并重新命名后得到了这个。 尽pipe文件名和svc.cs文件被正确地重命名,但标记仍然引用原始文件。

要解决这个问题,请右键单击复制的svc文件并selectView Markup并更改服务引用。

对于调用.net端点的Java客户端。 这是由Soap Action标题不匹配造成的。

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

上面的HTTP标头或以下的XML标签需要匹配你试图调用的动作/方法。

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

错误表示存在不匹配,假定您拥有基于相同WSDL的公共约定,则configuration中存在不匹配。

例如,客户端使用nettcpip,服务器设置为使用基本的http。

我有一个类似的错误。 这可能是因为你的configuration文件被引用到你的项目后,你会改变一些契约设置。 解决scheme – 更新VSstudio项目上的webservice引用,或者使用svcutil.exe创build一个新的代理

我花了几天的时间寻找答案,我发现它,但不是在这个线程。 我对WCF和C#很新,所以有些答案可能是显而易见的。

在我的情况下,我有一个最初为ASMX服务开发的客户端工具,对我来说,它是返回相同的错误消息。

尝试各种build议后,我发现这个网站:

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

这使我走上了正确的道路。 特别是“soap:operation” – WCF将ServiceName附加到名称空间:

客户端期待Http://TEST.COM/Login ,但是WCF发送了Http://TEST.COM/IService1/Login 。 解决scheme是像这样添加设置到[OperationContract]

[OperationContract(Action = "http://TEST.COM/Login", ReplyAction = "http://TEST.COM/Login")] (忽略Http中的空格)

这可能有两个原因:

  1. 服务参考已过时,请右键点击服务参考更新。

  2. 您已经实施的合同可能与客户有所不同。 比较两种服务n客户合同n修正合同不匹配。

我遇到过同样的问题。 问题是我复制了另一个服务的代码作为起点,并没有更改.svc文件中的服务类

打开.svc文件,确保服务属性是正确的。

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

如果您正在调用WCF方法,则应在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+ "\""); } 

正如其他答案(如@chinto)中提到的,当SOAP:Action头元素与端点不匹配时,会发生这种情况。

您可以通过查看服务器的WSDLfind正确的URI。 你会看到一个带有一个“Action”属性的input子元素的操作元素。 这就是您的SOAP:操作需要在客户端请求。

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

我在部署的WCF服务上发生了同样的错误,问题与使用同一端口的另一个合同部署的另一个服务有关。

我在web.config中使用了不同的端口,问题消失了。

服务1

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

服务2

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

另外 ,我遇到了这种情况,通过使用服务和消费者之间的相同地址的不同端口。

傻,但我忘了添加[OperationContract]到我的服务接口(标有[ServiceContract] ),然后你也得到这个错误。

您的客户没有更新。所以从Web服务更新您的服务,然后重build您的项目

如果代码没有正确部署,通常会出现此错误。

就我而言,我有两个服务ServiceA和ServiceB。 我发现ServiceB文件没有正确部署的问题。 由于ServiceA在内部调用ServiceB时发生了以下错误。

**错误**

请确保文件和引用正确部署。

我也有这个问题。 原来这是由服务器端的合约序列化器造成的。 它不能返回我的数据合同对象, 因为它的一些数据成员是只读属性

确保您的对象具有setter属性的序列化。

奇怪的是,我们通过使用与使用的Path和OperationContract名称相同的框架来解决此错误。 显然这是区分大小写的。 如果有人知道为什么,请评论。 谢谢!

所以,我的情况如下。 我没有使用代理进行客户端 – 服务器交互,我使用了ChannelFactory(因此,所有build议升级到服务引用对我来说都没有意义)。

该服务托pipe在IIS中,出于某种原因,它在bin文件夹中有错误的引用。 项目重新编译根本没有导致该文件夹中的新DLL。

所以我只是从那里删除了所有的东西,并在同一个解决scheme中添加了对服务的引用,然后重新编译,现在一切正常。

我的问题原来是罕见的,但我会提到它。

我遇到了部署到我们的开发环境的问题。 在这台机器上,我们的编译人员创build了两个文件夹(部署了两个应用程序)。 旧版本和新的当前版本。 因此,如果您的Web服务器上没有您的应用程序的两个版本,则这不适用于您。

他创build的新位置在主机之后有一个非标准名称作为url的第一部分:

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

在我的本地机器上,我的客户端指向标准文件夹名称,这是在所有环境(除开发之外)(包括我的本地环境)上设置的。

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

当我用本地副本吹掉并replace了开发中的web.config时,需要特别指出的那部分url被标准部分吹掉了,结果dev上的客户端指向了旧的应用程序。

旧的应用程序有一个旧的合同,不理解的要求,抛出这个错误。

我有这个错误,因为我的服务器的GAC中有一个旧版本的DLL。 所以确保所有的东西都被正确地引用,并且程序集/ GAC与最好的dll最新。

我在testing服务器上遇到了这个问题,因为我在同一个应用程序池上运行了两个相同的wcf。 为我解决的是为我的wcf上的每个版本创build分离池,然后重新启动IIS。

对于那些正在编码的人来说,这也许是有用的。 您需要将WebHttpBehavior()添加到您添加的服务端点。 就像是:

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

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