如何从WCF SOAP响应中提取二进制附件?

时间:2014-01-13 13:23:35

标签: c# .net wcf soap

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

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

使用fiddler捕获时,这是包含cid的SOAP响应附件数据: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
}

以下是返回对象的可用字段的屏幕截图:

fields available

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

3 个答案:

答案 0 :(得分:0)

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

如果你在这里显示的只是响应的标题,你也可以检查响应消息的正文,因为标题有一个大小限制,但消息的主体没有 - 因此它是您的二进制负载的可能位置。

答案 1 :(得分:0)

在你要返回的某个实体中返回一个byte []会不会更容易,然后在你的客户端上使用它来重建文件?

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

答案 2 :(得分:0)

事实证明问题是由于第三方API返回响应的方式,MTOM数据格式不正确所以WCF忽略了二进制数据。

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