【问题标题】:ContractFilter mismatch at the EndpointDispatcher exceptionEndpointDispatcher 异常中的 ContractFilter 不匹配
【发布时间】:2011-07-26 03:49:02
【问题描述】:

我正在尝试测试以下场景:

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

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

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

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

如何开始调试这个问题?

此异常的一些可能原因是什么?

【问题讨论】:

    标签: wcf


    【解决方案1】:

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

    这可能是因为:

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

    查看EndpointDispatcher 课程以了解有关该主题的更多信息。

    所以:

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

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

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

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

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

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

    【讨论】:

    • 还要确保 .svc 文件中的服务属性正确。请参阅下面的答案。
    • 只是想添加到上面的解决方案(针对新手),因为我遇到了同样的问题,但上面的解决方案对我不起作用。如果您已经尝试了上述解决方法但仍然遇到相同的错误,请尝试通过简单地重新键入所涉及的端点来更新您的配置,即使它在服务器和客户端上都已经正确。
    【解决方案2】:

    我遇到了这个错误,它是由接收方合约没有实现被调用的方法引起的。基本上,有人没有将最新版本的 WCF 服务部署到主机服务器。

    【讨论】:

    • +1 - 同样的事情也发生在我身上,除了在我的情况下,我是“某人”。我忘了提交和部署服务器端代码。
    • 是的,我把 SOAP 操作的名称弄错了。它想要tempuri.org/ICodeGenService/RenderApp,但由于某种原因,解析WSDL 的代码只是想tempuri.org/RenderApp
    • 我也是。我的 .SVC.CS 中有该方法,但我的界面中没有相应的 OperationContract。
    • 我也是 :) 我使用正在开发的本地服务刷新了 SoapUI 中的 WSDL,当我针对服务中的新方法创建请求时,SoapUI 使用了我们的开发环境。所以,方法运行良好,我只是查询了错误的 URL。
    • 谢谢!我没有花几个小时调试,而是在阅读了这篇文章后我很快意识到我正在向错误的环境发送请求。
    【解决方案3】:

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

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

    在某些时候在我的客户端上交换 URL 时出现了这个确切的错误。真是摸不着头脑,终于弄明白了这个愚蠢的错误。

    【讨论】:

    • 这是一个愚蠢的错误,但这是一个非常有用的答案。因为这是显而易见的事情,所以很容易被忽视。
    • 错误的 url 给出 - '没有端点监听' 错误
    • 可以确认,我不小心输入了交换的网址,这是我得到的错误。然后看到这个,我首先意识到这可能是一个问题,仔细检查后,肯定是问题!
    • 这个答案是给定异常的可能解决方案。注意不同地址上的端点地址和绑定接口
    【解决方案4】:

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

    我改变了这个...

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

    到...

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

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

    【讨论】:

    • 谢谢,我也遇到了同样的问题!
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      我通过在我的合同实施中添加以下内容解决了这个问题:

      [ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

      例如:

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

      【讨论】:

      • 这解决了我的转发端口问题。谢谢。
      • 不是我得到一个新的错误,我讨厌 IIS - CommunicationException: The server did not provide an Significant reply;这可能是由于合同不匹配、会话过早关闭或内部服务器错误造成的。
      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:

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

        您可以通过查看服务器的 WSDL 找到要使用的正确 URI。您将看到一个带有输入子元素的操作元素,该子元素具有“Action”属性。这就是您的 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>
        

        【讨论】:

        • 经过几天的谷歌搜索、测试和发疯 - 这个答案帮助了我。谢谢。
        • 在我的特定场景中,我使用 Apache HttpClient 从我的 java 类调用 WebService。为了设置 Soap 动作标头,我在调用 setHeader 方法设置内容类型之后立即调用了 HttpPost SetHeader 方法。
        【解决方案9】:

        对于那些使用带有axios 的NodeJS 来发出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)
          })
        

        【讨论】:

        • 谢谢!从邮递员进行测试时,我错过了 SOAPAction 标头
        【解决方案10】:

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

        打开 .svc 文件并确保服务属性正确。

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

        【讨论】:

          【解决方案11】:

          错误说存在不匹配,假设你有一个基于相同WSDL的通用合约,那么不匹配就在配置中。

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

          【讨论】:

            【解决方案12】:

            我遇到了类似的错误。这可能是因为在将配置文件引用到项目中后,您会更改配置文件上的某些合同设置。 解决方案 - 更新您的 VSstudio 项目的 Web 服务引用或使用 svcutil.exe 创建新代理

            【讨论】:

              【解决方案13】:

              我花了几天时间寻找答案并找到了答案,但不是在这个帖子中。 我对 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中的空格)

              【讨论】:

              • 好吧。您的解决方案是让服务按照某些客户的期望行事。但它同样可以通过让客户端实际遵守服务器的合同来解决(或者在许多情况下,最好)!毕竟,服务器是合约的发布者。
              【解决方案14】:

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

              【讨论】:

                【解决方案15】:

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

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

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

                【讨论】:

                  【解决方案16】:

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

                  该服务托管在 IIS 中,由于某种原因,它在那里的 bin 文件夹中有错误的引用。项目重新编译根本不会导致该文件夹中出现新的 dll。

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

                  【讨论】:

                    【解决方案17】:

                    这可能有两个原因:

                    1. 服务引用已过时,请右键单击服务引用更新它。

                    2. 您实施的合同可能与客户不同 已。比较服务 n 客户合同 n 修复合同 不匹配。

                    【讨论】:

                      【解决方案18】:

                      对于那些通过编码来做这件事的人来说,它也可能很有用。您需要将 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

                      【讨论】:

                      • 这帮我节省了时间,谢谢 :)
                      【解决方案19】:

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

                      【讨论】:

                        【解决方案20】:

                        您的客户端未更新。所以从 Web 服务更新您的服务,然后重建您的项目

                        【讨论】:

                          【解决方案21】:

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

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

                          【讨论】:

                            【解决方案22】:

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

                            【讨论】:

                              【解决方案23】:

                              我的问题被证明是罕见的,但我还是会提到它。

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

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

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

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

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

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

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

                              【讨论】:

                                【解决方案24】:

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

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

                                【讨论】:

                                  【解决方案25】:

                                  我遇到此错误是因为我的服务器的 GAC 中有旧版本的 DLL。因此,请确保所有内容都被正确引用,并且程序集/GAC 与良好的 dll 保持同步。

                                  【讨论】:

                                    【解决方案26】:

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

                                    【讨论】:

                                      猜你喜欢
                                      • 2013-02-21
                                      • 1970-01-01
                                      • 2014-04-16
                                      • 2013-03-09
                                      • 1970-01-01
                                      • 2011-03-28
                                      • 2018-07-05
                                      • 2019-07-20
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多