我正在尝试使用C#API从S3读取一些文件,并且我遇到了GetObjectAsync方法返回的响应流在完成读取文件之前处理的问题。
这是S3代码:
public static async Task<DownloadByteRangeResult> GetObjectAsync(IAmazonS3 s3, string bucketName, string prefix, string objectName, CancellationToken ct = default(CancellationToken))
{
try
{
var getObjectRequest = new GetObjectRequest() {
BucketName = bucketName,
Key = GetValidKey(prefix, objectName)
};
using (var result = await s3.GetObjectAsync(getObjectRequest, ct).ConfigureAwait(false))
{
var bytes = PollStream(result.ResponseStream, (int)result.ContentLength);
return new DownloadByteRangeResult(result.HttpStatusCode, bytes);
}
}
catch (Exception e)
{
if (e is AmazonS3Exception s3Ex)
{
return new DownloadByteRangeResult(s3Ex.StatusCode, s3Ex.Message);
}
return new DownloadByteRangeResult(HttpStatusCode.InternalServerError, e.Message);
}
}
以下是我如何轮询数据流:
private static byte[] PollStream(Stream stream, int numToRead)
{
var numRead = 0;
var bytes = new byte[numToRead];
while (numRead < numToRead)
{
var countRead = stream.Read(bytes, numRead, numToRead - numRead);
if (countRead == 0)
{
;
}
numRead += countRead;
}
return bytes;
}
计划将不时出现
stream.Read(bytes, numRead, numToRead - numRead);
永远不会回来。如果下载比平常慢,它往往会发生更多,这表明它是一个超时问题。我已经尝试修改S3客户端上的超时值,但这对返回的流没有影响,并且流已禁用超时,因此我甚至无法正常中止等待。你有什么意义呢?