ContractFilter在EndpointDispatcher异常处不匹配

时间:2011-03-30 14:36:45

标签: wcf

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

  1. 常见的WSDL
  2. 基于WSDL实现对象并在IIS中托管的WCF端点。
  3. 使用基于WSDL的代理创建请求的客户端应用程序。
  4. 当我从客户端到服务端点进行Web服务调用时,我得到以下异常:

      由于EndpointDispatcher上的ContractFilter不匹配,

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

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

    如何开始调试此问题?

    此异常有哪些可能的原因?

25 个答案:

答案 0 :(得分:72)

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

答案 1 :(得分:71)

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

这可能是因为:

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

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

所以:

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

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

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

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

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

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

答案 2 :(得分:19)

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

我改变了这个......

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

为...

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

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

答案 3 :(得分:17)

如果您尝试连接错误的网址,也会获得此信息;)

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

在某些时候在我的客户端上交换了URL时出现了这个确切的错误。真的摸不着头脑,直到最终搞清楚这个愚蠢的错误。

答案 4 :(得分:9)

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

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

例如:

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

}

答案 5 :(得分:9)

对于调用.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 :(得分:8)

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

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

答案 7 :(得分:4)

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

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

答案 8 :(得分:2)

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

答案 9 :(得分:2)

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

例如,客户端正在使用nettcpip,并且服务器已设置为使用基本http。

答案 10 :(得分:1)

这可能有两个原因:

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

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

答案 11 :(得分: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+ "\"");
}

答案 12 :(得分: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/

它让我走上了正确的道路。特别是&#34;肥皂:操作&#34; - 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中的空格)

答案 13 :(得分:1)

对于那些通过编码执行此操作的人来说,这可能也很有用。您需要将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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

答案 16 :(得分:0)

我的问题原来是罕见的,但无论如何我都会提到它。

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

他创建的新位置有一个非标准名称作为主持人之后网址的第一部分:

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

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

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

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

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

答案 17 :(得分:0)

对于那些使用带有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)
  })

答案 18 :(得分: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"

同样,我在服务和消费者之间使用不同的端口来处理这种情况。

答案 19 :(得分:0)

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

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

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

答案 20 :(得分:0)

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

答案 21 :(得分:0)

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

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

答案 22 :(得分:0)

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

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

**Error**

请确保正确部署文件和参考资料。

答案 23 :(得分:0)

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

答案 24 :(得分:0)

愚蠢,但我忘记将[OperationContract]添加到我的服务界面(标有[ServiceContract]的界面),然后您也会收到此错误。