【问题标题】:WCF client exception: Unrecognized message versionWCF 客户端异常:无法识别的消息版本
【发布时间】: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 信封。所以我的问题是:

  1. 我的假设是否正确,或者我应该寻找其他地方吗?
  2. 是否有某种方法可以配置 WCF 客户端的绑定以消除 SOAP Envelope 期望?
  3. 我是否应该告诉远程服务实现者修复他们的服务(他们只是根据提供的 WSDL 为我们编写的)?

WCF 客户端正在使用 basicHttpBindings(以及基于 SSL/TLS 的 HTTP 基本身份验证)。我曾考虑使用 IClientMessageInspector.AfterReceiveReply() 来重写响应,但在调用该方法之前引发了异常,即:我们已经为请求/响应日志记录实现了它,并且它没有在那里遇到断点。


更多信息:

在与服务开发人员沟通后,他们似乎完全忽略了我们提供给他们的 .wsdl 和(svcutil 生成的)IService.cs 文件,并从头开始编写了 POX(Plain-Old XML)服务。

我不确定我们能否说服他们正确地执行此操作,所以现在我正在寻找将正常运行的 WCF SOAP 客户端转换为 POX 客户端的技巧。

【问题讨论】:

    标签: c# wcf soap


    【解决方案1】:

    这可能是由于您的服务使用了 Soap1.2 而您使用不同的版本来调用它。

    请尝试“添加服务引用”-“高级...”-“添加 Web 引用...”作为兼容性方法。

    【讨论】:

      【解决方案2】:

      我也有这个问题。我知道这是一篇较旧的帖子,但就我而言,我在调用此 Web 服务的 C# .NET 应用程序中修改了 app.config 文件。我认为它正在添加

      <security mode="Transport" />
      

      到解决它的basicHttpBinding 元素。我还延长了超时时间和maxBufferPoolSize

      微软有documentation that describes this,以防这对其他人有帮助。

      【讨论】:

        猜你喜欢
        • 2011-03-17
        • 1970-01-01
        • 1970-01-01
        • 2020-10-30
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        相关资源
        最近更新 更多