WCF 客户端异常:无法识别的消息版本
Posted
技术标签:
【中文标题】WCF 客户端异常:无法识别的消息版本【英文标题】:WCF client exception: Unrecognized message version 【发布时间】:2016-10-10 21:37:04 【问题描述】:我今天在将 WCF 客户端部署到 QA 时遇到了这个错误:
System.ServiceModel.CommunicationException:无法识别的消息版本。
在 Fiddler 中,我注意到 WCF 客户端将其请求包装在 SOAP 信封中(如预期的那样),但来自远程 Web 服务的响应未包装在 SOAP 信封中。也就是说,我们的本地调试 Web 服务会发送如下响应:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header />
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Response xmlns="urn:example">
<Success>true</Success>
...
</Response>
</s:Body>
</s:Envelope>
但是远程网络服务只是发送这个:
<?xml version="1.0" encoding="utf-8"?>
<ns0:Response xmlns:ns0="urn:example">
<ns0:Success>true</ns0:Success>
...
</ns0:Response>
据我所知,WCF 客户端正在抛出异常,因为没有 SOAP 信封。所以我的问题是:
-
我的假设是否正确,或者我应该寻找其他地方吗?
是否有某种方法可以配置 WCF 客户端的绑定以消除 SOAP Envelope 期望?
我是否应该告诉远程服务实现者修复他们的服务(他们只是根据提供的 WSDL 为我们编写的)?
WCF 客户端正在使用 basicHttpBindings(以及基于 SSL/TLS 的 HTTP 基本身份验证)。我曾考虑使用 IClientMessageInspector.AfterReceiveReply() 来重写响应,但在调用该方法之前引发了异常,即:我们已经为请求/响应日志记录实现了它,并且它没有在那里遇到断点。
更多信息:
在与服务开发人员沟通后,他们似乎完全忽略了我们提供给他们的 .wsdl 和(svcutil 生成的)IService.cs 文件,并从头开始编写了 POX(Plain-Old XML)服务。
我不确定我们能否说服他们正确地执行此操作,所以现在我正在寻找将正常运行的 WCF SOAP 客户端转换为 POX 客户端的技巧。
【问题讨论】:
【参考方案1】:这可能是由于您的服务使用了 Soap1.2 而您使用不同的版本来调用它。
请尝试“添加服务引用”-“高级...”-“添加 Web 引用...”作为兼容性方法。
【讨论】:
【参考方案2】:我也有这个问题。我知道这是一篇较旧的帖子,但就我而言,我在调用此 Web 服务的 C# .NET 应用程序中修改了 app.config
文件。我认为它正在添加
<security mode="Transport" />
到解决它的basicHttpBinding
元素。我还延长了超时时间和maxBufferPoolSize
。
微软有documentation that describes this,以防这对其他人有帮助。
【讨论】:
以上是关于WCF 客户端异常:无法识别的消息版本的主要内容,如果未能解决你的问题,请参考以下文章
分析器错误消息: 无法识别的属性“targetFramework”。
如何防止 jQuery tablesorter 中的“未捕获的异常:语法错误,无法识别的表达式”?
NSInvalidArgumentException,使用 performSegueWithIdentifier 时发送到实例的无法识别的选择器