ContractFilter在EndpointDispatcherexception处不匹配
我有以下情况,我试图testing:
- 一个常见的WSDL
- WCF端点,它实现基于WSDL的对象并托pipe在IIS中。
- 使用基于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议后,我发现这个网站:
这使我走上了正确的道路。 特别是“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中的空格)
这可能有两个原因:
-
服务参考已过时,请右键点击服务参考更新。
-
您已经实施的合同可能与客户有所不同。 比较两种服务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