c#-Webapi传输大量的大文件

这个问题已经在这里有了答案:            >            Returning binary file from controller in ASP.NET Web API                                    7个
我目前正在计划通过网络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的内存(除了拆分)?

解决方法:

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

Stephen Cleary的Here’s优秀文章使用PushStreamContent,唯一的不同是它在发送文件之前先对其进行了压缩,因此,您应该对其进行修改,甚至更好,将其发送为压缩版本以节省带宽.

上一篇:直播推流常用推流传输协议


下一篇:实现PHP中Flink框架模式下Storm胡变量!Samza如何做到分流处理框架分层