Amazon S3 SDK 不允许我使用 GetObjectMetadata。它只允许我使用 GetObjectMetadataAsync

Amazon S3 SDK is not allowing me use the GetObjectMetadata. It only allows me use GetObjectMetadataAsync

我正在将 Amazon S3 sdk 与 .Net 一起用于 Xamarin 项目,我需要在对某个对象执行某些操作之前检查该对象是否存在于存储桶中。我无法在 Amazon.S3.IO.S3FileInfo 上使用 Exists 属性,因为出于某种原因我无法在我的代码中使用 Amazon.S3.IO 命名空间。 (使用它会让我的生活变得更轻松),所以我使用以下代码(我从 S3FileInfo here 的源代码中获得)

        public bool PackageExistsOnS3(string bucket, string key)
        {
            bool bucketExists;
            return ExistsWithBucketCheck(out bucketExists, bucket, key);
        }

        private bool ExistsWithBucketCheck(out bool bucketExists, string bucket, string key)
        {
            bucketExists = true;
            try
            {
                var request = new GetObjectMetadataRequest
                {
                    BucketName = bucket,
                    Key = AWSS3Helper.EncodeKey(key)
                };
                ((Amazon.Runtime.Internal.IAmazonWebServiceRequest) request).AddBeforeRequestHandler(AWSS3Helper
                    .FileIORequestEventHandler);

                AmazonS3Client _client = new AmazonS3Client(_accessKey, _secretKey, _regionEndPoint);

                // If the object doesn't exist then a "NotFound" will be thrown
                // I DO NOT WANT TO USE THE METADATAASYNC VERSION HERE, I JUST WANT THE REGULAR VERSION BUT I CANNOT DO THAT
                _client.GetObjectMetadataAsync();
                //var test = _client.GetObjectMetadata;
                return true;
            }
            catch (AmazonS3Exception e)
            {
                if (string.Equals(e.ErrorCode, "NoSuchBucket"))
                {
                    bucketExists = false;
                    return false;
                }
                else if (string.Equals(e.ErrorCode, "NotFound"))
                {
                    return false;
                }

                throw;
            }

        }

AWSS3Helper的代码如下:

    internal static class AWSS3Helper
    {
        internal static string EncodeKey(string key)
        {
            return key.Replace('\', '/');
        }

        internal static string DecodeKey(string key)
        {
            return key.Replace('/', '\');
        }

        internal static void FileIORequestEventHandler(object sender, RequestEventArgs args)
        {
            WebServiceRequestEventArgs wsArgs = args as WebServiceRequestEventArgs;
            if (wsArgs != null)
            {
                string currentUserAgent = wsArgs.Headers[AWSSDKUtils.UserAgentHeader];
                wsArgs.Headers[AWSSDKUtils.UserAgentHeader] = currentUserAgent + " FileIO";
            }
        }
    }

有谁知道我怎样才能避免使用这个异步函数?它会阻止我 returning 一个布尔值,如果我必须 return 一些东西,我需要在任何使用这个函数的地方使用 Await ,这意味着我需要让每个使用它的函数成为异步函数我真的很想避免这样做带来的并发症。

您可以尝试使您的函数异步并在 _client.GetObjectMetadataAsync() 之前使用 await 关键字。如果你不这样做,你会得到如果函数被实现为异步任务< T > a Task 而不是 T 在你的情况下 T 是布尔值。 对于 IO 连接,现在标准是在 Dotnet 中使用异步函数来防止您的应用程序停止并等待响应。

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/