EndpointDispatcher异常的ContractFilter不匹配


116

我尝试测试以下情形:

  1. 通用的WSDL
  2. WCF终结点,该终结点基于WSDL实现对象并托管在IIS中。
  3. 使用基于WSDL的代理来创建请求的客户端应用程序。

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

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

我开始使用MS Service Trace Viewer,但不确定在哪里查找。在客户端和端点中查看类时,它们看起来是相同的。

如何开始调试此问题?

有什么可能导致此异常的原因?

Answers:


75

“ EndpointDispatcher上的ContractFilter不匹配”表示接收方无法处理该消息,因为它与接收方为接收该消息的终结点配置的任何合同都不匹配。

这可能是因为:

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

看看 EndpointDispatcher课程以获取有关该主题的更多信息。

所以:

确保您的客户端和服务器合同匹配。

  • 如果您是从WSDL生成客户端的,那么WSDL是最新的吗?
  • 如果您最近对合同进行了更改,是否已部署了客户端和服务器的正确版本?
  • 如果您手工制作了客户端合同类,请确保名称空间,元素名称和操作名称与服务器期望的名称匹配。

检查客户端和服务器之间的绑定是否相同。

  • 如果您使用.config文件管理端点,请确保绑定元素匹配。

检查客户端和服务器之间的安全设置是否相同。

  • 如果您使用.config文件管理端点,请确保安全元素匹配。

3
还请确保.svc文件中的service属性正确。请参阅下面的答案。
AntonK '02

我只是想添加到上面的解决方案中(对于新来者),因为我遇到了相同的问题,但是上面的解决方案对我来说不起作用。如果您已经尝试了上述解决方法并仍然遇到相同的错误,请尝试通过简单地重新键入所涉及的端点来更新配置,即使该端点在服务器和客户端上均已正确。
devpro101 '18

74

我遇到了此错误,这是由于未实现所调用方法的客户代销合同引起的。基本上,没有人将最新版本的WCF服务部署到主机服务器。


12
+1-我也发生了同样的事情,除了我自己是“某人”。我忘了提交和部署服务器端代码。
杰西·韦伯

2
是的,我把SOAP Action的名称弄错了。它想要tempuri.org/ICodeGenService/RenderApp,但是出于某种原因,解析WSDL的代码只是tempuri.org/RenderApp
user435779 '10 -10-17

我也是。我的.SVC.CS中有该方法,但界面中没有相应的OperationContract。
PahJoker

我也是:)我使用正在开发的本地服务刷新了SoapUI中的WSDL,当我针对服务中的新方法创建请求时,SoapUI使用了我们的开发环境。因此,方法运行良好,我只是查询了错误的URL。
拉尔斯比,2015年

2
谢谢!我没有花很多时间进行调试,相反,读完这篇文章后,我很快意识到我正在将请求发送到错误的环境。
Jan Matousek '16

20

如果您尝试连接到错误的URL,也会得到此信息;)

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

在某些时候在我的客户端上交换了URL时,出现了这个确切的错误。直到最后弄清楚这个愚蠢的错误之前,他的头都被划伤了。


3
当然,这是一个愚蠢的错误,但这是一个非常有用的答案。由于它很明显,因此很容易被忽略。
mungflesh 2015年

错误的网址给出-'没有端点监听'错误
AriesConnolly

19

我遇到了这个问题,发现从另一个服务复制的代理生成器中,我忘记了更改服务的名称。

我改变了这个...

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

至...

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

这是一个简单的代码错误,但几乎无法调试。我希望这可以节省一些时间。


我也是这样。
Vasyl Boroviak

谢谢,我遇到了同样的问题!
Dieterg 2014年

10

对于调用.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>

9

我通过在合同实施中添加以下内容来解决此问题:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

例如:

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

}

这通过转发端口解决了我的问题。谢谢。
MathiasMüller'15

不是,我收到一个新的错误,我讨厌IIS-CommunicationException:服务器未提供有意义的答复。这可能是由于合同不匹配,会话过早关闭或内部服务器错误引起的。
AriesConnolly

8

复制了svc文件并将其重命名后,我得到了这个。尽管已正确重命名了文件名和svc.cs文件,但标记仍引用了原始文件。

要解决此问题,请右键单击复制的svc文件,然后选择“ 查看标记”并更改服务引用。


5

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

通过查看服务器的WSDL,可以找到要使用的正确URI。您将看到带有输入子元素的操作元素,该子元素具有“动作”属性。那就是您的SOAP:Action必须在客户端请求上。

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

经过数天的搜索,测试和发疯之后-这个答案对我有所帮助。谢谢。
babboon

在我的特定场景中,我正在使用Apache HttpClient从我的java类中调用WebService。为了设置Soap操作标头,我在将setHeader方法调用为setContent Type之后立即调用了HttpPost SetHeader方法。
vofili

3

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

打开.svc文件,确保Service属性正确。

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

2

该错误表明存在不匹配,假设您具有基于同一WSDL的通用合同,则该不匹配在配置中。

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


2

我有一个类似的错误。这可能是因为在将配置文件提交到您的项目后,您已经更改了一些合同设置。解决方案-更新VSstudio项目上的Web服务参考,或使用svcutil.exe创建新的代理


1

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

就我而言,我有两个服务ServiceA和ServiceB。我发现ServiceB文件未正确部署的问题。因此,当ServiceA内部调用ServiceB时,出现以下错误。

**错误**

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


1

我花了几天时间寻找答案,但没有找到答案。我是WCF和C#的新手,所以对某些人来说答案可能是显而易见的。

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

在尝试了各种建议之后,我找到了这个网站:

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。解决方案是将设置添加[OperationContract]如下:

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


2
好。您的解决方案是使服务按某些客户端的期望进行操作。但是,通过让客户端实际上遵守服务器的合同也可以很好地解决(或在许多情况下最好)!毕竟,服务器是合同的发布者。
达格2014年

1

这可能有两个原因:

  1. 服务参考已过时,请右键单击服务参考n对其进行更新。

  2. 您执行的合同可能与客户的合同有所不同。比较两个服务n客户合同n修复合同不匹配的情况。


1

如果要调用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+ "\"");
}

1

这对于通过编码执行此操作的人员可能也很有用。您需要将WebHttpBehavior()添加到添加的服务端点。就像是:

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

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


这帮助我节省了时间,谢谢:)
Sely Lychee 17/12/28

0

很傻,但是我忘了添加[OperationContract]到我的服务界面(标有的界面[ServiceContract])中,然后您也遇到此错误。


0

您的客户端尚未更新。因此,请从Web服务更新您的服务,然后重建您的项目


0

我也有这个问题。原来,这是由服务器端的合同序列化程序引起的。它无法返回我的数据协定对象,因为它的某些数据成员是只读属性

确保您的对象具有将要序列化的属性的设置器。


0

奇怪的是,我们通过使用相同的大小写使用Path和OperationContract名称来解决此错误。显然,它是区分大小写的。如果有人知道原因,请发表评论。谢谢!


0

因此,我的情况如下。我没有使用代理进行客户端-服务器交互,而是使用ChannelFactory(因此,升级到服务参考的所有建议对我来说都是毫无意义的)。

该服务托管在IIS中,由于某种原因,该文件夹中的bin文件夹中的引用有误。重新编译项目根本没有在该文件夹中产生新的dll。

因此,我只删除了所有内容,并在同一解决方案中添加了对该服务的引用,然后重新编译,现在一切正常。


0

我的问题原来很少见,但无论如何我都会提到。

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

他创建的新位置以非标准名称作为主机后面URL的第一部分:

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

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

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

当我吹散并用本地副本替换开发中的web.config时,需要特殊的url部分被标准部分吹走了,因此开发人员将客户端指向了旧应用程序。

旧的应用程序具有旧的合同,并且不理解该请求并抛出此错误。


0

我在部署的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"

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


0

我遇到此错误是因为我的服务器GAC中有旧版本的DLL。因此,请确保正确引用了所有内容,并确保程序集/ GAC与最新的dll保持一致。


0

我的测试服务器存在此问题,因为我在同一应用程序池中运行同一wcf的两个副本。为我解决的是在wcf上为每个版本创建单独的池,然后重新启动IIS。


0

对于那些将NodeJSaxios一起使用来发出SOAP请求的人,您必须包括一个SOAPAction header。检查以下示例:

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)
  })
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.