【问题标题】:How to extract binary attachment from a WCF SOAP response?如何从 WCF SOAP 响应中提取二进制附件?
【发布时间】:2014-01-13 13:23:35
【问题描述】:

我正在编写一个使用 3rd 方 WCF Web 服务的 .Net 3.5 解决方案。 SOAP 服务的代理客户端是由 VisualStudio 作为服务参考生成的。

来自服务的 SOAP 响应包括数据中的附件,正如我在 fiddler 中看到的那样。附件有一个指向 CID 引用的 href 字段。 VS 2012 在返回包含附件的对象时创建的代理客户端不包含任何二进制数据,但它确实包含带有 CID 引用的 href 字段。

使用 fiddler 捕获,这是 SOAP 响应附件数据,包括 cid:xxxx ref:

<attachments>
      <cmn:attachment href="cid:52b2d8a50035921e80bf1540" len="309" name="DOC1.rtf" type="application/rtf" xmime:contentType="application/rtf"/>
</attachments>

在 fiddler 的原始输出中,可以看到附件数据与匹配的 cid:xxxx ref:

------=_Part_22_12445037.1389617382038
Content-Type: application/rtf
Content-Location: DOC1.rtf
Content-ID: <52b2d8a50035921e80bf1540>
Content-Transfer-Encoding: binary

{\rtf1\ansi\ansicpg1252\deff0{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\f0\fs22 Doc 1\par
\par
Test information inside an attachment for KM retrieval.\par
\par
Here's something else I've written for use in testing.\par
}

这是返回对象中可用字段的屏幕截图:

如何访问该附件数据以便实际下载文件?

【问题讨论】:

    标签: c# .net wcf soap


    【解决方案1】:

    通常使用 WCF 和 SOAP,您的文件二进制文件在您的响应中某处被编码为 base64 字符串,但是我没有看到您在此处发布的那种长数据字符串。

    如果您在此处显示的只是响应的标头,您也可以检查响应消息的正文,因为标头有大小限制,但消息的正文没有 - 因此它是您的二进制有效负载的可能位置。

    【讨论】:

    • 返回的数据来自我创建服务引用时创建的 Visual Studio 代理生成的类。我非常仔细地查看了返回的数据,我看不到任何暗示附件数据的字节数组或长数据字符串。
    【解决方案2】:

    在您返回的实体之一中返回一个字节[],然后在您的客户端上使用它来重建文件不是更容易吗?

    您在使用 MTOM 吗?因为WCF does not support SwA (Soap with attachments) out of the box.

    【讨论】:

    • 当我创建对 SOAP Web 服务的服务引用时,这些实体是由 Visual Studio 自动创建的。它正在使用 MTOM(当我使用文本时会引发错误)并且我正在使用 BasicHttpBinding,这会是一个问题吗?
    【解决方案3】:

    原来问题是由于第 3 方 API 返回响应的方式,MTOM 数据格式不正确,因此 WCF 忽略了二进制数据。

    我解决这个问题的方法是使用一个定制类,该类基本上使用 HttpRequest 直接与 Web 服务对话并从响应中提取/解析二进制数据。

    【讨论】:

    • 能否与我们分享这个定制课程的来源?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    相关资源
    最近更新 更多