首先使用WSDL的WCF服务器,客户端不需要发送SOAPAction。

6
我正在实现一个WCF网络服务,与我无法控制其代码的客户端进行交互。 WSDL由客户端提供。
我使用SvcUtil从WSDL生成了C#文件,除了在此处讨论的错误之外,没有遇到任何问题。
在启用SSL(客户端要求)的IIS 7.0中托管服务后,我尝试让客户端向服务发出请求。
此时,我收到以下错误:
The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver.  Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).

我验证了可以使用服务发布的元数据和SOAPUI一起进行相同的请求。这个方法很好用。
然后,我尝试使用客户端提供的WSDL来使用SOAPUI。但是出现了与上述相同的空操作错误,无法成功。
接着,我连接了Wireshark(启用了SSL解密),并验证了从客户端发送的消息确实缺少SOAPAction,因此这肯定是问题所在。
由于我不能更改客户端,有没有办法让WCF Web服务与这样的客户端进行交互呢?我猜想它需要接受没有SOAPAction的请求,并从SOAP包中请求对象的类型推导出所需的请求。
1个回答

19
以下方法对我起作用了(基于这个帖子):

  1. 下载 Microsoft WCF 示例。
  2. 从 WF_WCF_Samples\WCF\Extensibility\Interop\RouteByBody\CS\service 中添加以下文件到你的项目中。
    • DispatchByBodyOperationSelector.cs
    • DispatchByBodyBehaviorAttribute.cs
  3. 在你的接口旁边添加以下属性(紧接着你的ServiceContract
    • XmlSerializerFormat
    • DispatchByBodyBehavior
  4. 将以下内容添加到你的服务接口中

    [OperationContract(Action = "")]
    public void DoNothing()
    {
    }
    
    对于我的服务,所有消息的WrapperName和Wrappernamespace都为null。我不得不进入DispatchByBodyBehaviorAttribute并编辑ApplyDispatchBehavior(),添加以下行以检查这一点:
     if (qname.IsEmpty) {
         qname = new XmlQualifiedName(operationDescription.Messages[0].Body.Parts[0].Name, operationDescription.Messages[0].Body.Parts[0].Namespace);
     }
    

太准确了!我刚花了几个小时研究这个问题。我试图让我的新WCF Web服务(从客户端的角度)看起来与旧的Web服务完全相同,但是我卡在这里了。我不得不指定多个空操作才能使wsdl与旧版本匹配,但这破坏了WCF。直到我找到了你的答案,它完美地解决了这个问题。如果我可以给你投多次票,我一定会的! - Rob Levine
如果有人实现了这个解决方案,并在调试时开始收到“此消息无法支持操作,因为它已被读取”的错误,请查看我在这里的回复,可能会有所帮助: https://dev59.com/fuo6XIcBkEYKwwoYPSL7#11170390 - Pablo Romeo
工作得很好!但现在我的wsdl页面出问题了.. 有人有什么想法吗? - Sérgio S. Filho
刚刚救了我的一命!我使用SvcUtil.exe消费了一个Java Web服务的WSDL。它为不同的方法调用生成了相同的Action属性,这是WCF不喜欢的。这个解决方案让它能够工作,所以我可以模拟Java服务!谢谢! - Pratt Hinds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接