CloudBlockBlob.UploadFromByteArrayAsync возвращает значение, но изображение не создано

У меня есть способ загрузить свое изображение в хранилище BLOB-объектов Azure. Моя учетная запись уже создана, а имя и ключ помещены в мое приложение. Поведение, которое я вижу, заключается в том, что await UploadFromByteArrayAsync(...) возвращает, а мой метод возвращает URL-адрес. Однако, когда я перехожу к моему лазурному хранилищу BLOB-объектов в Microsoft Azure Storage Explorer, я вижу, что BLOB-объекты не созданы. Очевидно, что при переходе по URL-адресу, возвращаемому методом, также возвращается ошибка 404. Метод успешно создал мой контейнер, поэтому есть определенная связь с соответствующими разрешениями для моей учетной записи хранения, я проверил содержимое массива байтов и содержит фактические данные. Кто-нибудь знает, почему мое изображение никогда не загружается?

public async Task<string> UploadImage(byte[] imageByteArr)
{
    // Retrieve storage account from the connection string.
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=redacted;AccountKey=redacted;EndpointSuffix=core.windows.net");

    // Create the blob client.
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

    // Retrieve a reference to a previously created container.
    CloudBlobContainer container = blobClient.GetContainerReference("user-images");

    // Create the container if it doesn't already exist.
    await container.CreateIfNotExistsAsync().ConfigureAwait(false);

    var docId = Guid.NewGuid().ToString();
    CloudBlockBlob blockBlob = container.GetBlockBlobReference(docId);

    await blockBlob.UploadFromByteArrayAsync(imageByteArr, 0, imageByteArr.Length);

    blockBlob.Properties.ContentType = "image/jpg";
    await blockBlob.SetPropertiesAsync();

    return blockBlob.Uri.ToString();
}

person ElFik    schedule 14.05.2017    source источник
comment
Мне любопытно узнать, как вы вызываете этот метод UploadImage? Вы ждете, чтобы закончить выполнение?   -  person Gaurav Mantri    schedule 14.05.2017
comment
кажется, проблема с «ожиданием» вызова UploadImage. Попробуйте вызвать свойство Result для возвращаемого значения UploadImage. Для более подробного объяснения того, как вызвать асинхронный метод, вы можете проверить этот ответ - stackoverflow.com/questions/9343594/   -  person alwayslearning    schedule 14.05.2017
comment
Можете ли вы вставить вызов blockBlob.ExistsAsync() после загрузки, чтобы узнать, существует ли он или нет? Возможно, у вас просто нет разрешений в браузере для просмотра URL-адреса.   -  person JLaanstra    schedule 14.05.2017


Ответы (1)


Я пропустил шаг в создании учебника по BLOB-объектам, которому следовал. Нам нужно вызвать следующее при создании контейнера в отделенном коде, чтобы у нас был публичный доступ к загруженному изображению.

container.SetPermissions(
    new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob });
person ElFik    schedule 14.05.2017