【发布时间】:2016-12-26 07:30:36
【问题描述】:
我的程序使用HttpClient 向 Web API 发送 GET 请求,这会返回一个文件。
我现在使用此代码(简化)将文件存储到光盘:
public async Task<bool> DownloadFile()
{
var client = new HttpClient();
var uri = new Uri("http://somedomain.com/path");
var response = await client.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
var fileName = response.Content.Headers.ContentDisposition.FileName;
using (var fs = new FileStream(@"C:\test\" + fileName, FileMode.Create, FileAccess.Write, FileShare.None))
{
await response.Content.CopyToAsync(fs);
return true;
}
}
return false;
}
现在,当此代码运行时,进程会将所有文件加载到内存中。我实际上更希望流从HttpResponseMessage.Content 流式传输到FileStream,因此只有一小部分保存在内存中。
我们计划在大文件(> 1GB)上使用它,那么有没有办法在不将所有文件都放在内存中的情况下实现它?
理想情况下,无需手动循环将一部分读取到byte[] 并将该部分写入文件流直到所有内容都被写入?
【问题讨论】:
-
CopyToAsync已经在执行您所描述的操作(在内部,它会重复从响应中读取一大块数据并将其写入文件,直到传输所有数据)它不应导致缓冲整个文件立即记忆。 -
我也是这么想的,但是看看内存消耗,它确实会将整个文件加载到内存中,我想避免这种情况。
-
你试过
response.Content.ReadAsStreamAsync()和使用Stream.CopyToAsync吗? -
那么可能是您对“内存消耗”的测量不准确。除非需要,否则运行时不一定会释放“空闲”内存,因此内存使用值在例如任务管理器可能无法反映应用程序实际“使用”的内存。
标签: c# stream asp.net-web-api2