在AWS.NET SDK中获取冰川文件状态

在AWS.NET SDK中获取冰川文件状态,.net,amazon-web-services,sdk,amazon-s3,amazon-glacier,.net,Amazon Web Services,Sdk,Amazon S3,Amazon Glacier,我在一个需要能够从S3下载一批文件的应用程序中使用Amazon.NETSDK。其中一些文件可能已存档到Glacier,在这种情况下,应用程序应启动任何此类文件的RestoreObject请求,而不是从S3下载任何文件。以下是一些不起作用的解决方案: ListObjectsResponse中的S3Object的StorageClass属性为S3StorageClass.Glacier,用于启用Glacier的文件。但是,即使文件被临时还原,S3Object也会继续使用该设置,因此这没有帮助 我希望

我在一个需要能够从S3下载一批文件的应用程序中使用Amazon.NETSDK。其中一些文件可能已存档到Glacier,在这种情况下,应用程序应启动任何此类文件的RestoreObject请求,而不是从S3下载任何文件。以下是一些不起作用的解决方案:

ListObjectsResponse中的S3Object的StorageClass属性为S3StorageClass.Glacier,用于启用Glacier的文件。但是,即使文件被临时还原,S3Object也会继续使用该设置,因此这没有帮助

<>我希望一个恢复对象响应会返回一些不同的结果,如果有问题的文件在恢复的中间或者暂时恢复,但是它继续返回0 /ok。< /P> 确定文件当前是否可用的唯一方法是尝试GetObjectRequest并查看它是否失败。我不想使用这个解决方案,因为它可能需要下载大量文件,结果发现其中一个文件在冰川中


有谁能建议另一个选项,让我知道是否所有的图像都是可用的,而不需要下载它们?谢谢

好的,我有一个解决办法。与其从S3中提取完整文件,还可以只提取第一个字节:

GetObjectRequest getObjectRequest = new GetObjectRequest();
getObjectRequest.BucketName = bucketName;
getObjectRequest.Key = key;
getObjectRequest.ByteRange = new ByteRange(0, 1);

try
{
    s3Client.GetObject(getObjectRequest);
}
catch (AmazonS3Exception ex)
{
    if (ex.ErrorCode == "InvalidObjectState")
    {
        // In Glacier, perform appropriate actions
    }
    else throw ex;
}

// If no exception, object has been restored

我仍然认为他们最好在响应对象中提供一些让您知道状态的内容,而不是抛出异常,但此方法至少可以满足我的需要。

您可以执行GetObjectMetadata,响应类包含两个相关属性:

RestoreInProgress-如果为false,则恢复完成/失败。 RestoreExpiration-如果已还原,则获取还原文件的过期日期。 您可以尝试以下方法:

    GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest
    {
        BucketName = bucketName,
        Key = objectKey
    };
    GetObjectMetadataResponse response = await client.GetObjectMetadataAsync(metadataRequest);
    if (!response.RestoreInProgress)
    {
        return (response.RestoreExpiration.HasValue && response.RestoreExpiration.Value<DateTime.UtcNow);
    }
    return false;