ContractFilter在EndpointDispatcher异常处不匹配

lac*_*dev 108 wcf

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

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

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

{"与动作'的消息HTTP:// IMyService/CreateContainer ’不能在接收器处进行处理,由于在EndpointDispatcher一个ContractFilter不匹配,这可能是因为无论是合同不匹配(发送者和接收者之间不匹配的操作)或一发送方和接收方之间的绑定/安全性不匹配.检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息,传输,无)."}

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

如何开始调试此问题?

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

Pau*_*ner 74

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

这可能是因为:

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

有在看EndpointDispatcher类关于这一主题的更多信息.

所以:

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

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

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

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

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

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

  • 还要确保.svc文件中的service属性是正确的.请参阅下面的答案. (3认同)

小智 73

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

  • +1 - 同样的事发生在我身上,除了在我的情况下,我是"某人".我忘了提交和部署服务器端代码. (12认同)
  • 是的,我的SOAP Action名称错了.它想要http://tempuri.org/ICodeGenService/RenderApp,但由于某种原因,解析WSDL的代码只考虑http://tempuri.org/RenderApp. (2认同)
  • 谢谢!我没有花很多时间进行调试,而是在阅读了这篇文章之后,我很快意识到我正在将请求发送到错误的环境。 (2认同)

小智 19

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

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

Return New Service1DataClient(binding, New EndpointAddress(My.Settings.WCFServiceURL & "/Service1Data.svc"))
Run Code Online (Sandbox Code Playgroud)

至...

Return New Service2DataClient(binding, New EndpointAddress(My.Settings.WCFServiceURL & "/Service2Data.svc"))
Run Code Online (Sandbox Code Playgroud)

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


Bra*_*itz 18

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

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

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

  • 这是一个愚蠢的错误,但这是一个非常有用的答案.因为它显而易见,很容易被忽视. (2认同)

ben*_*ben 9

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

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

例如:

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

}
Run Code Online (Sandbox Code Playgroud)


chi*_*nto 9

对于调用.net端点的Java客户端.这是由不匹配的Soap Action标头引起的.

Content-Type: application/soap+xml;charset=UTF-8;action="http://example.org/ExampleWS/exampleMethod"
Run Code Online (Sandbox Code Playgroud)

上面的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>
Run Code Online (Sandbox Code Playgroud)


iKn*_*ing 8

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

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


car*_*ans 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>
Run Code Online (Sandbox Code Playgroud)