1

这是我已经回答过的那些“问题”之一,但是我发布了 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 积极开发,但它仍然受到支持并且有很多用途。实际上,我没有太多选择,必须找到一种方法来完成这项工作。这就是为什么我要与其他必须处理这种头痛的人分享我的发现。

4

1 回答 1

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 文档有一个标注说您应该始终在绑定配置中使用“缓冲”作为您的传输模式......但没有提到这实际上只适用于服务,不一定是客户端!

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

于 2019-11-20T20:07:18.670 回答