我有以下场景,我正在尝试测试:
当我从客户端到服务端点进行Web服务调用时,我得到以下异常:
由于EndpointDispatcher上的ContractFilter不匹配,{“无法在接收方处理带有操作'http://IMyService/CreateContainer'的消息。 这可能是由于合同不匹配(发送方与接收方之间的操作不匹配)或发送方与接收方之间的绑定/安全性不匹配。检查发件人和收件人是否具有相同的合同和相同的约束(包括安全要求,例如邮件,传输,无)。“}
我开始使用MS Service Trace Viewer,但不确定在哪里查看。在查看客户端和端点中的类时,它们看起来完全相同。
如何开始调试此问题?
此异常有哪些可能的原因?
答案 0 :(得分:72)
我遇到了这个错误,这是由于未实现调用方法的接收合同造成的。基本上,有人没有将最新版本的WCF服务部署到主机服务器。
答案 1 :(得分:71)
“EndpointDispatcher上的ContractFilter不匹配”表示接收方无法处理该消息,因为它与接收方为接收消息的端点配置的任何合同都不匹配。
这可能是因为:
查看EndpointDispatcher
课程,了解有关该主题的更多信息。
所以:
确保您的客户和服务器合同匹配。
检查客户端和服务器之间的绑定是否相同。
检查客户端和服务器之间的安全设置是否相同。
答案 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)
这可能有两个原因:
服务参考已过时,右键点击服务参考更新。
您实施的合同可能与客户有所不同 具有。比较服务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服务开发的客户端工具,对我而言,它返回了相同的错误消息。
在尝试各种推荐后,我找到了这个网站:
它让我走上了正确的道路。特别是&#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());
答案 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时,它会给出以下错误。
请确保正确部署文件和参考资料。
答案 23 :(得分:0)
您的客户端未更新。从Web服务更新您的服务,然后重建您的项目
答案 24 :(得分:0)
愚蠢,但我忘记将[OperationContract]
添加到我的服务界面(标有[ServiceContract]
的界面),然后您也会收到此错误。