Изначально я объявил s3Client как приватное поле и застрял на методе GetFileMetadataAsync. В одном сообщении я нашел некоторую информацию о том, что создание нового клиента каждый раз может решить проблему, но это не помогло.
Затем я попытался вызвать GetObjectAsync, сначала вызов работает нормально и возвращает ошибку 404, затем в блоке catch я вызываю его второй раз, и в скрипаче я увидел ошибку 403, но GetObjectAsync завис и никогда не возвращает управление.
В окне потока я вижу, чего он ждет, Семапрхор.
Возможно, я неправильно настроил клиент? Но судя по примерам в документации, это не должно быть так уж сложно. В любом случае он не должен зависать.
Версия: AWSSDK.S3 4.0.19.4
.Net 10

_awsConfig = new AmazonS3Config
{
ServiceURL = serviceUrl.TrimEnd('/'),
ForcePathStyle = true,
UseHttp = serviceUrl.StartsWith("http://"),
MaxErrorRetry = _maxRetries,
RetryMode = RequestRetryMode.Standard,
AuthenticationRegion = ""
};
_awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
public async Task DownloadFileAsync(string objectKey)
{
try
{
using var s3Client = new AmazonS3Client(_awsCredentials, _awsConfig);
var request = new GetObjectRequest
{
BucketName = _bucketName,
Key = objectKey
};
using var response = await s3Client.GetObjectAsync(request);
return response.ResponseStream;
}
catch (AmazonS3Exception ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
{
if (objectKey.Contains("/"))
{
var fileName = objectKey.Substring(objectKey.IndexOf('/'));
var fallbackRequest = new GetObjectRequest
{
BucketName = _bucketName,
Key = fileName
};
using var s3Client = new AmazonS3Client(_awsCredentials, _awsConfig);
var response = await s3Client.GetObjectAsync(fallbackRequest);
return response.ResponseStream;
}
throw new Exception($"FileNotFound: {objectKey}", ex);
}
catch (AmazonS3Exception ex)
{
throw new Exception($"Error downloading file: {ex.Message}", ex);
}
}