Webapi传输大量大型文件

时间:2018-03-27 09:46:56

标签: c# asp.net streaming

我目前正在通过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内存(除了拆分)?

1 个答案:

答案 0 :(得分:3)

尝试使用PushStreamContent。它将流推送回客户端,而无需将其加载到内存中。

来自Stephen Cleary的优秀文章使用了PushStreamContent,唯一的区别是它在发送之前将文件压缩,所以你应该修改它,甚至更好,发送它们压缩版本以节省带宽。