AWS S3 GetObjectAsync流响应无限期挂起

时间:2018-06-14 08:55:35

标签: c# amazon-web-services amazon-s3

我正在尝试使用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客户端上的超时值,但这对返回的流没有影响,并且流已禁用超时,因此我甚至无法正常中止等待。你有什么意义呢?

0 个答案:

没有答案