C#Response.OutputStream损坏下载的文件

C#Response.OutputStream损坏下载的文件,c#,asp.net,C#,Asp.net,我正在尝试创建动态创建的、可下载的ZIP文件。文件是在服务器上正确创建的,但是当使用“Response.OutputStream”将文件发送到客户端时,文件会损坏。这似乎只有在zip文件超过4GB时才会发生。有人知道这是为什么吗 我使用的确切代码是: string path = @"C:\temp\vid"; Response.BufferOutput = false; // Disable Buffer Output to start the download

我正在尝试创建动态创建的、可下载的ZIP文件。文件是在服务器上正确创建的,但是当使用“Response.OutputStream”将文件发送到客户端时,文件会损坏。这似乎只有在zip文件超过4GB时才会发生。有人知道这是为什么吗

我使用的确切代码是:

       string path = @"C:\temp\vid";

        Response.BufferOutput = false; // Disable Buffer Output to start the download immediately

        // Set custom headers to force browser to download the file instad of trying to open it
        Response.ContentType = "application/x-zip-compressed";
        Response.AppendHeader("content-disposition", "attachment; filename=Archive.zip");

        ZipOutputStream zipOutputStream = new ZipOutputStream(Response.OutputStream, 20000);
        zipOutputStream.SetLevel(0); // No compression
        zipOutputStream.UseZip64 = UseZip64.On;//Forces Zip64 to be used
        zipOutputStream.IsStreamOwner = true;

        try
        {
            foreach (string file in Directory.GetFiles(path, "*.*", SearchOption.AllDirectories))
            {
                using (var fs = System.IO.File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    ZipEntry entry = new ZipEntry(ZipEntry.CleanName(Path.GetFileName(file))); //Create zip compatible name
                    zipOutputStream.PutNextEntry(entry); //Adds entry to list

                    fs.CopyTo(zipOutputStream);

                    zipOutputStream.CloseEntry();
                    zipOutputStream.Flush();

                    Response.Flush();
                    Response.Clear();
                }
            }

            zipOutputStream.Finish();
            zipOutputStream.Close();
            Response.End();
            Response.Flush();

        }
        catch
        {
            Debug.WriteLine("Connection Closed or error");
        }

        return new HttpStatusCodeResult(HttpStatusCode.OK);

首先,通过HTTP发送4GB文件可能不是最好的方法。您使用的是哪个操作系统(特别是哪个文件系统)?或者可能将其分解为多个文件。我不确定为什么在
中使用(…)
块会有
响应。Clear()
。一旦完成了
刷新
,所有输出都应该被发送(或缓冲以由服务器发送)。下一个问题是,服务器有多少可用RAM?(应用程序,而不是机器。)希望不会有多个客户端试图同时执行此操作。这是像Microsoft.com这样的网站使用下载管理器处理海量文件的原因。使用这种方法,如果有10个人同时下载该文件,您将需要至少40GB的可用RAM(事实上,远不止此)。对于这种大小的文件,这不是一个很好的解决方案。它可能比前面提到的@Dav3更糟糕(或者不是)。我还没有研究ZipOutputStream或Response.outputStream的内部结构,但整个流可能需要在内存中连续分配。需要研究的东西。服务器仍然需要缓冲要发送的数据,并且根据下载速度,它可以很好地在内存中构建绝大多数存档,并且在将其下载到客户端时必须保存它。调用
Response.Flush()
并不能神奇地消除带宽限制
Flush()
不是一个阻塞调用—您仍然在将内容推送到内存中,IIS在尝试将数据传递到客户端时很高兴地保留着该数据。