C# Webapi传输大量大型文件

C# Webapi传输大量大型文件,c#,asp.net,streaming,C#,Asp.net,Streaming,我目前正计划通过web api实现更新机制。传输的文件大小可以高达1 GB,并且可以有20个客户端同时尝试获取文件 每当我查看示例时,我都会发现类似的内容(简化): 现在,虽然在这些示例中,他们将整个文件加载到内存中(对于客户端需要下载的单个文件,总计高达20 GB…。这不是最佳选择,即使我只加载每个特定文件一次,但我遇到了类似的问题,因为它们可能处于不同的更新步骤) 我看到的一个选择是,在提交之前,我将文件分割成10 MB的块,让客户端下载,然后重新组合。这样一来,仅文件的最大内存占用就将达到

我目前正计划通过web api实现更新机制。传输的文件大小可以高达1 GB,并且可以有20个客户端同时尝试获取文件

每当我查看示例时,我都会发现类似的内容(简化):

现在,虽然在这些示例中,他们将整个文件加载到内存中(对于客户端需要下载的单个文件,总计高达20 GB…。这不是最佳选择,即使我只加载每个特定文件一次,但我遇到了类似的问题,因为它们可能处于不同的更新步骤)

我看到的一个选择是,在提交之前,我将文件分割成10 MB的块,让客户端下载,然后重新组合。这样一来,仅文件的最大内存占用就将达到200 MB,这是一个更可接受的区域

尽管如此,我还是想知道是否有其他方法可以完成下载,而不必为20个并发客户端使用20 GB内存(除了拆分)?

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


Stephen Cleary的优秀文章使用了PushStreamContent,唯一的区别是它在发送文件之前先对文件进行压缩,所以你应该修改它,或者更好地发送压缩版本以节省带宽。

这只是个坏例子,不要使用它。直接使用
FileStream
,而不是毫无理由地将整个文件复制到
MemoryStream
中。@evk我只找到了类似上面使用MemoryStream的示例。因此,我可以“只”在streamcontent中使用filestream,它不会将文件放入我的内存或客户机中,而只是在客户机加载数据并对其执行任何操作时传输“块”(如果将其放入filestream,则直接传输到硬盘上)?是的,只要在那里传递
FileStream
,你就会没事的。它将读取具有小块的文件(取决于缓冲区大小,通常为1MB),并直接写入http响应(因此基本上是写入网络套接字)。确保不锁定该流(打开读取并使用
Read
share),以便多个请求可以同时从中读取。不要忘记确保从客户端正确下载此文件。例如,如果您使用类似于
DownloadData
或任何类似的api将整个响应从服务器拉入内存,那么这次您将毫无理由地占用客户机内存。相反,将响应流直接复制到客户端上的文件(
responseStream.CopyTo(localFileStream)
@evk tnx顺便说一句,我敢说这也是对我问题的一个回答。不过,Pushstream内容不是主要用于视频流吗?()或者我忽略了什么?是的,但它也适用于您描述的场景。我成功地做到了完美无瑕,即使是大于2GB的文件。您可以使用
PushStreamContent
,但为什么?常规
StreamContent
可以用更少的代码完成同样的工作。
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;
}