我正在实现一个WCF Web服务,该服务与我无法控制的代码进行交互。 WSDL由客户提供。
我使用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来发出相同的请求。这很好。
然后我尝试使用客户端提供的WSDL来使用SOAPUI。这失败了上面的空动作错误。
然后我连接了Wireshark(启用SSL解密)并验证从客户端发送的消息确实缺少SOAPAction,因此看起来这肯定是问题。
由于我无法更改客户端是否有办法让WCF Web服务与此类客户端进行交互?我猜它需要接受没有SOAPAction的请求,而是从SOAP信封中的请求对象类型派生所需的请求?
答案 0 :(得分:18)
以下对我有用(基于this主题):
ServiceContract
旁边)
XmlSerializerFormat
DispatchByBodyBehavior
将以下内容添加到服务界面
[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);
}