Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从AWS S3读取流涉及加载整个文件_C#_.net_Asp.net Mvc_Amazon S3 - Fatal编程技术网

C# 从AWS S3读取流涉及加载整个文件

C# 从AWS S3读取流涉及加载整个文件,c#,.net,asp.net-mvc,amazon-s3,C#,.net,Asp.net Mvc,Amazon S3,我的场景的简短版本是,我正在使用.NETSDK读取存储在Amazon的S3中的文件 GetObjectRequest request = new GetObjectRequest { BucketName = this.m_bucketName, Key = GetFileKey(fileIdentifier), }; IAmazonS3 source = ... GetObjectResponse response = await source.GetObjectAsync(

我的场景的简短版本是,我正在使用.NETSDK读取存储在Amazon的S3中的文件

GetObjectRequest request = new GetObjectRequest
{
    BucketName = this.m_bucketName,
    Key = GetFileKey(fileIdentifier),
};

IAmazonS3 source = ...
GetObjectResponse response = await source.GetObjectAsync(request);
return response.ResponseStream;
然后,我将此流作为
文件
结果传递给MVC

public async Task<FileResult> Download(...)
{
   return File(GetAwsStream(...), ...);
}
公共异步任务下载(…)
{
返回文件(GetAwsStream(…),…);
}
问题是,显然,S3在返回任何内容之前急切地计算整个文件的校验和。对于大型文件,这是一个重要的问题,因为

  • web服务器必须从AWS S3下载整个文件,然后单个字节才能开始流式传输到客户端;对于大型文件,web服务器响应客户端可能需要几分钟的时间
  • 它使用web服务器上的大量内存来读取整个流并计算校验和

这完全违背了溪流的观点。有没有办法从S3获取实际的“流”?

您可以使用头在循环中下载S3对象的特定字节,然后在下载后将这些字节传递给客户端。这样,web服务器就不必等到检索到完整的文件后才给客户端提供一些信息。

我也遇到了同样的问题。我可以在流上调用
.ToArray()
来获取内容,但我似乎不能仅仅使用
返回文件(流、contentType、文件名)因为下载时文件不包含任何内容。