我目前正在通过web api规划更新机制。传输的文件最大可达1 GB,可能有20个客户端同时尝试获取文件。
每当我查看示例时,我发现了类似的内容(简化):
public HttpResponseMessage GetFile(string name)
{
var reqFile = @"C:\updates\" + name;
var dataBytes = File.readAllBytes(reqFile)
var dataStream new MemoryStream (dataBytes);
HttpResponseMessage httprm = Request.CreateResponse(HttpStatusCode.OK);
httprm.Content = new StreamContent(dataStream);
httprm.Content.Headers.ContentDisposition = = new ContentDispositionHeaderValue("attachment");
httprm.Content.Headers.ContentDisposition.FileName = name;
httprm.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octetstream");
return httprm;
}
现在,虽然在这些示例中,他们将整个文件加载到内存中(总共高达20 GB,因此对于客户端需要在我的情况下下载的单个文件......这不是最佳的,即使我只加载每个特定文件只有一次我遇到类似的问题,因为他们可以在不同的更新步骤)。
我看到的一个选项是,在我将文件拆分为10 MB块之前,让客户端下载它然后再将它放在一起。这样,仅文件的最大内存占用量就是200 MB,这是一个更容易接受的区域。
尽管我想知道是否有另一种方法可以完成下载,而不必为20个并发客户端使用20 GB内存(除了拆分)?
答案 0 :(得分:3)
尝试使用PushStreamContent。它将流推送回客户端,而无需将其加载到内存中。
来自Stephen Cleary的优秀文章使用了PushStreamContent,唯一的区别是它在发送之前将文件压缩,所以你应该修改它,甚至更好,发送它们压缩版本以节省带宽。