创建zipFile会耗尽内存

时间:2016-05-03 06:23:31

标签: c# asp.net-web-api

我有ASP.NET Web API项目,用户可以从数据库中下载一些东西。 我的下载控制器从数据库实例中获取数据。每个结果都有一个blob字段,它是某种数据(1)。 我想将每个结果添加到ZIP文件(2)。毕竟我发送HTTP响应添加我的流内容。

List<Result> results = m_Repository.GetResultsForResultId(given_id_by_request);

// 1
foreach (Result result in results)
{
    string fileName = String.Format("{0}-{1}.bin", id >> 16, result.Id);
    zipFile.AddEntry(fileName, result.Value);
}

// 2
PushStreamContent pushStreamContent = new PushStreamContent((stream, content, context) =>
{
    zipFile.Save(stream);
    stream.Close();
}

response = new HttpResponseMessage(HttpStatusCode.OK) { Content = pushStreamContent };

效果很好!但是在大量下载请求中,这耗尽了我的记忆。我需要找到一种方法将流放入zip缓冲区。有人可以帮帮我吗?!

1 个答案:

答案 0 :(得分:1)

从我发布的代码中我可以看到,您没有处理使用后创建的流。这可能会增加您的应用程序保留的大量内存,这可能会导致您的问题。

我正在使用ZipArchive将多个文件放入我的网络应用程序中的zip文件中。代码看起来有点像:

using (var compressedFileStream = new MemoryStream())
        {
            using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Update, false))
            {
                foreach (Result result in results)
                {
                    string fileName = String.Format("{0}-{1}.bin", id >> 16, result.Id);
                    var zipEntry = zipArchive.CreateEntry(fileName);

                    using (var originalFileStream = new MemoryStream(result.Value))
                    {
                        using (var zipEntryStream = zipEntry.Open())
                        {
                            originalFileStream.CopyTo(zipEntryStream);
                        }
                    }
                }
            }

            return File(compressedFileStream.ToArray(), "application/zip", string.Format("Download_{0:ddMMyyy_hhmm}.zip", DateTime.Now));
}

我在MVC Controller方法中使用该代码段,因此您必须根据您的情况调整返回部分。

以上代码在我的应用程序中可以正常工作,最多300个条目或50MB卷(这些是我的应用程序要求设置的限制)。

希望对你有所帮助。

编辑:忘记第一个使用块的结束括号。