C# 在ASP.NET中将文件从web服务传递到客户端

C# 在ASP.NET中将文件从web服务传递到客户端,c#,asp.net,.net,vb.net,C#,Asp.net,.net,Vb.net,我需要将通过web服务获得的文件传递给最终用户。现在,我分两步来做: 从安全web服务获取文件: Dim客户端作为新的Net.WebClient client.Headers.Add(“Authorization”,String.Format(“Bearer{0}”,access_token)) 作为字节()的Dim数据=client.DownloadData(uri) 通过http响应将文件提供给用户 对于最终用户来说,这需要很长时间,因为用户必须等待服务器从服务下载文件,然后等待客户端从服务

我需要将通过web服务获得的文件传递给最终用户。现在,我分两步来做:

  • 从安全web服务获取文件:

    Dim客户端作为新的Net.WebClient client.Headers.Add(“Authorization”,String.Format(“Bearer{0}”,access_token))

    作为字节()的Dim数据=client.DownloadData(uri)

  • 通过http响应将文件提供给用户

  • 对于最终用户来说,这需要很长时间,因为用户必须等待服务器从服务下载文件,然后等待客户端从服务器下载文件


    是否可以将文件直接从web服务流式传输给用户?如果是这样,最好的方法是什么?

    我认为实现这一点的最好方法是逐步下载文件并将其缓冲到响应中,以便逐步下载到客户端。这样,最终用户就不必等待服务器完全下载文件并将其发回。当它从另一个位置下载文件内容时,它只会流式传输文件内容。作为奖励,您不必将整个文件保存在内存或磁盘中

    下面是实现这一点的代码示例:

        protected void downloadButton_Click(object sender, EventArgs e)
        {
            Response.Clear();
            Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "MyFile.exe"));
            Response.Buffer = true;
            Response.ContentType = "application/octet-stream";
    
            using (var downloadStream = new WebClient().OpenRead("http://otherlocation.com/MyFile.exe")))
            {
                var uploadStream = Response.OutputStream;
                var buffer = new byte[131072];
                int chunk;
    
                while ((chunk = downloadStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    uploadStream.Write(buffer, 0, chunk);
                    Response.Flush();
                }
            }
    
            Response.Flush();
            Response.End();
        }
    

    无论您如何剪切它,您仍然需要自己进行流式处理,因为您最终是文件和最终用户之间的代理。您是否无法在第一次流式传输文件时将其存储在自己的服务器上,然后后续请求可以下载您保存的版本?我可以存储该文件,但每个文件仅可能由单个用户下载一次,因此该选项中的实用性很小。我只是希望加快这个过程。太好了。这太完美了。