【问题标题】:WCF MTOM/XOP Client Deserialization ErrorWCF MTOM/XOP 客户端反序列化错误
【发布时间】:2020-03-16 15:41:25
【问题描述】:

这是我已经回答过的那些“问题”之一,但我正在发布 b/c,根据一周的谷歌搜索,那里的信息似乎几乎为零。

TL;DR:WCF MTOM 编码 BasicHttpBinding 客户端到外部/第 3 部分,非 .NET Web 服务在 MTOM 响应的 XOP 处理上阻塞 - 基本上 MTOM 编码器似乎期望二进制元素中的 base64 有效负载,但运行到... 指令并将 SOAP/XML 反序列化为运行时对象失败,因此在此问题的标题中引发错误。

错误:应在命名空间“http://mynamespace”中结束元素“MyBinaryData”。从命名空间“http://www.w3.org/2004/08/xop/”中找到元素“xop:Include”

如前所述,关于这个主题的内容并不多,我猜 b/c MS 基于服务开发编写了他们的大部分 WCF 文档,而不是那么多客户端(虽然有一些,但公平地说) .

我不打算详细介绍初始设置 b/c 我将要回答我自己的问题,但我会在回答前先说这更类似于默认设置WCF MTOM 的配置比没有。

另外,我知道 WCF 很旧、很无聊,并且不再由 MS 积极开发,但它仍然受到支持并且有很多用途。实际上,我没有太多选择,必须找到一种方法来完成这项工作。这就是为什么我要与其他必须处理这种头痛的人分享我的发现。

【问题讨论】:

    标签: java wcf interop mtom xop


    【解决方案1】:

    TL;DR:检查 http 标头以查看对您的服务响应是否为“Transfer-Encoding: chunked”(流式传输),如果是,请在绑定配置中使用 transferMode="StreamedResponse"。

    因此,在没有帮助的情况下搜索了几天后,我启动了 Fiddler 以捕获 http 流量 - 这需要您的 WCF 基本 http 绑定配置代理到 Fiddler(我认为默认情况下为http://localhost:8888),具体取决于您的目标位置服务驻留您可能需要也可能不需要配置 Fiddler 的网关设置(企业代理等)。

    这让我可以看到我的客户与他们的服务之间发送的原始文本;所有有效载荷都很好,这意味着,在我的情况下,来自服务的 MTOM/XOP 响应被完全传输,并且 WCF 运行时没有正确解释响应。我看到的另一个关键是 Transfer-Encoding http 标头被“分块”并且没有 Content-Length 标头......这意味着服务正在流式传输响应,而不是缓冲响应。现在有点旁注:MS 的 WCF MTOM 文档有一个标注说您应该始终在绑定配置中使用“Buffered”作为您的 transferMode ......但没有提到这实际上只适用于服务,不一定是客户端!

    所以很自然,我只是进入我的配置文件,找到 system.serviceModel >> bindings >> basicHttpBinding 集合,找到我的特定绑定配置并设置 transferMode="StreamedResponse"(因为第 3 方服务正在流式传输我的响应给我的客户)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多