2010-05-10 76 views
6

我正在实现一个WCF Web服务,它与客户端的代码不受控制。 WSDL由客户端提供。WSDL第一个客户端不发送SOAPAction的WCF服务器

我使用SvcUtil从WSDL生成C#文件,并且除了讨论的错误here我没有问题。

在启用了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一起提出同样的要求。这工作得很好。

然后我试图使用SOAPUI使用客户端提供的WSDL。这失败了上面相同的空行为错误。

然后,我连接Wireshark(启用SSL解密)并验证从客户端发送的消息的确没有SOAPAction,所以看起来这肯定是问题。

因为我不能改变客户端是否有办法让WCF Web服务与这样的客户端进行交互?我猜它需要接受没有SOAPAction的请求,而是从SOAP信封中的请求对象的类型派生出所需的请求?

回答

18

以下为我工作(基于this线程):

  1. 下载微软WCF的例子。
  2. 将下列文件添加到您的项目从WF_WCF_Samples \ WCF \扩展\互操作\ RouteByBody \ CS \服务
    • DispatchByBodyOperationSelector.cs
    • DispatchByBodyBehaviorAttribute.cs
  3. 添加以下属性到您的接口(在您的ServiceContract旁边)
    • XmlSerializerFormat
    • DispatchByBodyBehavior
  4. 以下添加到您的服务接口

    [OperationContract(Action = "")] 
    public void DoNothing() 
    { 
    } 
    
  5. 为我服务的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); 
    } 
    
+0

SPOT ON!我刚花了几个小时来研究这个问题。我试图让我的新WCF Web服务看起来完全相同(从客户端角度来看)到一个较早的Web服务,并且真的停留在这个上面。我必须指定多个空行为才能使wsdl与旧版本匹配,但是这打破了WCF。也就是说,直到我找到完美的答案。如果我可以不止一次地赞扬你,我会! – 2010-07-20 18:00:27

+0

很高兴我能帮到你。 – 2010-07-20 19:20:02

+0

如果有人实现此解决方案,并且在调试时开始出现错误“此消息无法支持操作,因为它已被读取”,请参阅我的回复,这可能有所帮助: http://stackoverflow.com/a/11170390/ 1373170 – 2012-06-23 14:52:40

相关问题