C# .NET Core 3 MVC从HTTP下载一个文件,并使用最小内存重新交付给客户端

C# .NET Core 3 MVC从HTTP下载一个文件,并使用最小内存重新交付给客户端,c#,.net-core,asp.net-core-mvc,C#,.net Core,Asp.net Core Mvc,我有一个.NET Core 3 MVC应用程序,需要通过HTTP从一个位置读取一个文件,然后将其重新发送回响应。其中一些文件的大小约为200MB 我所做的工作正常,但在将文件结果发送到客户端之前,它会将整个文件读入内存。有没有一种方法可以使它本质上成为一个passthrough,其中读取流流入响应流,从而在服务器上只需要很少的内存 这就是我现在所拥有的,但我认为它在处理大型文件时表现不佳: if (requestedFile != null) { using (var client =

我有一个.NET Core 3 MVC应用程序,需要通过HTTP从一个位置读取一个文件,然后将其重新发送回响应。其中一些文件的大小约为200MB

我所做的工作正常,但在将
文件
结果发送到客户端之前,它会将整个文件读入内存。有没有一种方法可以使它本质上成为一个passthrough,其中读取流流入响应流,从而在服务器上只需要很少的内存

这就是我现在所拥有的,但我认为它在处理大型文件时表现不佳:

if (requestedFile != null)
{
    using (var client = new System.Net.Http.HttpClient())
    {
        using (var result = await client.GetAsync(requestedFile.DownloadUrl))
        {
            if (result.IsSuccessStatusCode)
            {
                var bytes = await result.Content.ReadAsByteArrayAsync();
                return File(bytes, "application/zip", "largefile.zip");
            }
        }
    }
}
我也尝试过这样做,结果出现运行时错误“无法访问封闭流”:

编辑:

经过一些尝试和错误后,解决方案是使用语句删除所有流,并让
FileStreamResult
自行关闭流。因此,我最终得出以下结论:

var client = new HttpClient();
var result = await client.GetAsync(requestedFile.DownloadUrl);
var stream = await result.Content.ReadAsStreamAsync();
return new FileStreamResult(stream, "application/zip")
{
    FileDownloadName = "largefile.zip"
};

文件的重载之一是流。只需将该url作为流获取,或将响应正文作为流读取,然后立即在重载中返回该url:

     var client = new System.Net.Http.HttpClient();

     var result = await client.GetAsync(requestedFile.DownloadUrl);
     var stream = await result.Content.ReadAsStreamAsync();

     return File(stream,"application/pdf", "Invoice.pdf");

注意:如果将流包装在using块中,则此操作将失败,因为FileResult已关闭流。

文件的重载之一是流。只需将该url作为流获取,或将响应正文作为流读取,然后立即在重载中返回该url:

     var client = new System.Net.Http.HttpClient();

     var result = await client.GetAsync(requestedFile.DownloadUrl);
     var stream = await result.Content.ReadAsStreamAsync();

     return File(stream,"application/pdf", "Invoice.pdf");

注意:如果将流包装到using块中,则此操作将失败,因为FileResult已关闭流。

能否尝试压缩文件,然后对这些文件进行流式处理?我对问题进行了一些编辑,以反映正在下载的一些文件是ZIP,高达200MB。你能试着压缩文件然后流式传输这些文件吗?我对这个问题进行了一些编辑,以反映一些正在下载的文件是ZIP,高达200MB。
HttpClient.ReadAsStreamAsync
我想不在.NET Core 3中(编译错误)。我尝试了类似的方法(请参见主要问题中的编辑),但它导致运行时错误。但它很接近…这与我尝试的导致
无法访问关闭流的
错误相同。但正如我在前面的评论中所说的,我认为这很接近。试着删除HttpClientre周围的using。移动usings让我走到了我需要走的地方。最后我没有给出你的代码示例,但它让我找到了我需要去的地方。谢谢<代码>HttpClient.ReadAsStreamAsync
不在.NETCore3中(编译错误)。我尝试了类似的方法(请参见主要问题中的编辑),但它导致运行时错误。但它很接近…这与我尝试的导致
无法访问关闭流的
错误相同。但正如我在前面的评论中所说的,我认为这很接近。试着删除HttpClientre周围的using。移动usings让我走到了我需要走的地方。最后我没有给出你的代码示例,但它让我找到了我需要去的地方。谢谢