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 客户端异常:无法识别的消息版本的主要内容,如果未能解决你的问题,请参考以下文章

无法识别的 SSL 消息,明文连接?例外

分析器错误消息: 无法识别的属性“targetFramework”。

如何防止 jQuery tablesorter 中的“未捕获的异常:语法错误,无法识别的表达式”?

不可识别数据库格式

NSInvalidArgumentException,使用 performSegueWithIdentifier 时发送到实例的无法识别的选择器

Swift:手势识别器无法识别的选择器发送到实例