Проблемы с AWS SDK .NET

Я пытаюсь извлечь изображения из своего хранилища для отправки в мои мобильные приложения, в настоящее время у меня есть устройства, напрямую подключающиеся к AWS, однако я добавляю уровень безопасности и теперь мои приложения (IOS и Android) отправляют запросы на мой сервер, которые будут затем ответьте данными DynamoDB и S3.

Я пытаюсь следовать документации и образцам кода, предоставленным AWS для.Net, и они бесперебойно работали для DynamoDB, у меня проблемы с S3.

S3.NET Документация

Моя проблема в том, что если я не предоставлю учетные данные, я получаю сообщение об ошибке:

Не удалось получить учетные данные из службы метаданных экземпляра EC2

Это ожидается, поскольку я настроил роли IAM и хочу, чтобы только мои приложения и этот сервер (в будущем только этот сервер) имели доступ к корзинам.

Но когда я предоставляю учетные данные, так же, как я предоставлял учетные данные для DynamoDB, мой сервер ждет бесконечно и не получает никаких ответов от AWS.

Вот мой C#:

<%@ WebHandler Language="C#" Class="CheckaraRequestHandler" %>

using System;
using System.Web;
using System.Collections.Generic;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using Amazon.DynamoDBv2.DocumentModel;
using Amazon;
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;
using System.IO;
using System.Threading.Tasks;


public class CheckaraRequestHandler : IHttpHandler
{

    private const string bucketName = "MY_BUCKET_NAME";

    private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USEast1;
    public static IAmazonS3 client = new AmazonS3Client("MY_ACCESS_KEY", "MY_SECRET_KEY", RegionEndpoint.USEast1);



    public void ProcessRequest(HttpContext context)
    {

        if (context.Request.HttpMethod.ToString() == "GET")
        {
            string userID = context.Request.QueryString["User"];
            string Action = context.Request.QueryString["Action"];



            if (userID == null)
            {
                context.Response.ContentType = "text/plain";
                context.Response.Write("TRY AGAIN!");
                return;
            }



            if (Action == "GetPhoto")
            {

                ReadObjectDataAsync(userID).Wait();


            }

            var client = new AmazonDynamoDBClient("MY_ACCESS_KEY", "MY_SECRET_KEY", RegionEndpoint.USEast1);

            Console.WriteLine("Getting list of tables");

            var table = Table.LoadTable(client, "TABLE_NAME");
            var item = table.GetItem(userID);


            if (item != null)
            {
                context.Response.ContentType = "application/json";
                context.Response.Write(item.ToJson());
            }
            else
            {
                context.Response.ContentType = "text/plain";
                context.Response.Write("0");
            }
        }

    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

    static async Task ReadObjectDataAsync(string userID)
    {



        string responseBody = "";
        try
        {
            string formattedKey = userID + "/" + userID + "_PROFILEPHOTO.jpeg";
            //string formattedKey = userID + "_PROFILEPHOTO.jpeg";
            //formattedKey = formattedKey.Replace(":", "%3A");
            GetObjectRequest request = new GetObjectRequest
            {
                BucketName = bucketName,
                Key = formattedKey
            };


            using (GetObjectResponse response = await client.GetObjectAsync(request))
            using (Stream responseStream = response.ResponseStream)
            using (StreamReader reader = new StreamReader(responseStream))
            {
                string title = response.Metadata["x-amz-meta-title"]; // Assume you have "title" as medata added to the object.
                string contentType = response.Headers["Content-Type"];
                Console.WriteLine("Object metadata, Title: {0}", title);
                Console.WriteLine("Content type: {0}", contentType);

                responseBody = reader.ReadToEnd(); // Now you process the response body.
            }
        }
        catch (AmazonS3Exception e)
        {
            Console.WriteLine("Error encountered ***. Message:'{0}' when writing an  object", e.Message);
        }
        catch (Exception e)
        {
            Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
        }
    }

}

Когда я отлаживаю, эта строка ждет вечно:

using (GetObjectResponse response = await client.GetObjectAsync(request)) 

Это та же самая строка, которая выдает ошибку учетных данных, когда я их не предоставляю. Есть ли что-то, что мне здесь не хватает?

Любая помощь будет принята с благодарностью.

1 ответ

Решение

Я подозреваю, что в AWS .NET SDK есть некоторые проблемы, связанные с асинхронным вызовом S3.

Асинхронный вызов DynamoDB работает отлично, но S3 зависает навсегда.

Что решило мою проблему, так это простое удаление асинхронных функций (даже в документах AWS предполагается использовать асинхронный вызов)

До:

using (GetObjectResponse response = await client.GetObjectAsync(request))

После:

using (GetObjectResponse response =  myClient.GetObject(request))

Надеюсь, это поможет всем, кто столкнулся с этой проблемой.

Другие вопросы по тегам