请考虑以下代码:
Stream stream = GetStreamFromSomewhere();
XmlDictionaryReader mtomReader =XmlDictionaryReader.CreateMtomReader
(
stream,
Encoding.UTF8,
XmlDictionaryReaderQuoatas.Max
);
/// ...
/// is there best way to read binary data from mtomReader's element??
string elementString = mtomReader.XmlReader.ReadElementString();
byte[] elementBytes = Covert.FromBase64String(elementString);
Stream elementFileStream = new FileStream(tempFileLocation);
elementFileStream.Write(elementBytes,0,elementBytes.Length);
elementFileStream.Close();
/// ...
mtomReader.Close();
问题是二进制附件的大小有时应该超过100Mb。有没有办法逐块读取元素的二进制附件,然后将其写入临时文件流,这样我就可以逃避为空洞分配内存?
第二个 - 甚至更具体的问题 - mtomReader在读取元素的内容之前是否创建了mime二进制附件的任何内部缓存,即为二进制数据分配内存?或者它是否直接从输入流中读取字节?
答案 0 :(得分:3)
对于那些可能对解决方案感兴趣的人:
using (Stream stream = GetStreamFromSomewhere())
{
using (
XmlDictionaryReader mtomReader = XmlDictionaryReader.CreateMtomReader(
stream, Encoding.UTF8, XmlDictionaryReaderQuotas.Max))
{
string elementString = mtomReader.ReadElementString();
byte[] buffer = new byte[1024];
using (
Stream elementFileStream =
new FileStream(tempFileLocation, FileMode.Create))
{
while(mtomReader.XmlReader.ReadElementContentAsBase64(buffer,0,buffer.Length)
{
elementFileStream.Write(buffer, 0, buffer.Length);
}
}
/// ...
mtomReader.Close();
}
}
ReadElementContentAsBase64(...)有助于逐块读取二进制部分。我的帖子的第二期在这里完全涵盖:Does XmlMtomReader cache binary data from the input stream internally?
答案 1 :(得分:0)
对于那个尺寸的附件,最好使用流媒体。
流式传输可以改善 服务的可扩展性 消除对大型的要求 内存缓冲区。是否改变了 传输模式提高了可扩展性 取决于消息的大小 被转移。大邮件大小 赞成使用流传输。
答案 2 :(得分:0)
首先,您的代码应该更像这样:
using (Stream stream = GetStreamFromSomewhere())
{
using (
XmlDictionaryReader mtomReader = XmlDictionaryReader.CreateMtomReader(
stream, Encoding.UTF8, XmlDictionaryReaderQuotas.Max))
{
string elementString = mtomReader.ReadElementString();
byte[] elementBytes = Convert.FromBase64String(elementString);
using (
Stream elementFileStream =
new FileStream(tempFileLocation, FileMode.Create))
{
elementFileStream.Write(
elementBytes, 0, elementBytes.Length);
}
/// ...
mtomReader.Close();
}
}
如果没有using
块,则存在资源泄漏的风险。