嗯,理论上:
对于传统的 ASP.Net 应用程序,您应该能够将响应数据(字节)写入HttpContext.Response.OutputStream(如何获得 http 响应上下文将取决于您如何处理下载请求,例如,如果您正在实施IHttpHandler 然后你会得到传递给你的 http 上下文)。
查看 DotNetZip 示例,Save 方法似乎需要一个流,所以这很简单
zip.Save(context.Response.OutputStream);
如果 zip 文件被许多用户重复使用和下载,那么您可以在创建 zip 时将 zip 写入MemoryStream,以便稍后将此内存流的内容复制到各个响应:
MemoryStream stream = new MemoryStream()
zip.Save(stream);
// Save data somewhere common (e.g. cache it)
byte[] data = stream.ToArray();
将此数据写回响应:
MemoryStream reader = new MemoryStream(data);
CopyStream(reader, context.Response.OutputStream);
请参阅 Best way to copy between two Stream instances - C# 了解 CopyStream 的实现。
然而实际上:
考虑一下,这意味着如果 zip 文件为 500MB,我们将在内存中存储 500MB 的数据 - 如果这是唯一存在的 zip 文件,但如果有 3 或 4 个这些我们很快就会耗尽“内存”(即虚拟地址空间)。
解决方案?恐怕最简单的方法是将您的 zip 保存到一个文件中(即使它是一个不由 IIS 直接提供的临时文件)而不是内存流:
// To save the zip
string filename = Path.GetTempFileName();
zip.Save(filename);
// To write the file
context.Response.TransmitFile(filename);
您可能还应该在完成后删除该文件。
请注意,如果您确定要在多个用户之间共享同一个 zip,则只需要为此烦恼 - 如果您只是基于每个用户构建 zip 并使用 zip.Save(OutputStream) 将其直接写入输出流,那么事情少了很多麻烦。我的建议是首先以简单的方式执行此操作,然后进行测试,看看您是否遇到了仅通过创建一次 zip 即可解决的性能问题。