Не может найти загруженное изображение при использовании Azure Storage Emulator на локальной машине

asp.net 4.5, Веб-формы, vs2013, Identity 2.0, Entity Framework 6.0

Я планирую использовать Azure Storage blob для хранения загруженных пользователем изображений. Поэтому я загрузил Azure Storage Emulator для тестирования на своей локальной машине.

Кажется, контейнер создан правильно, и изображение сохранено правильно - поскольку я не получал никаких исключений при запуске приложения.

Но проблема в том, что я не вижу этот образ на своей веб-странице. Отладка в коде, я видел, что это URI этого изображения

http://127.0.0.1:10000/devstoreaccount1/images/my_sub_folder_2/my_image.jpg

Я вставляю этот URL в браузер, IE говорит мне:

The webpage cannot be found 404

Chrome говорит мне:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>ResourceNotFound</Code>
<Message>
The specified resource does not exist. RequestId:e4b64fa8-5985-4aa4-bfbe-50aabd497537 Time:2014-04-21T07:26:04.4264011Z
</Message>
</Error>

Я использую AzureStorageAccess.CreateContainer() для создания контейнера в хранилище и использования AzureStorageAccess.UploadBlob() для сохранения загруженного пользователем изображения (потока) в хранилище. Код выглядит следующим образом.

public class AzureStorageAccess
{
// create a container in Azure Storage Emulator
    static public void CreateContainer(string containerName)
    {
        CloudStorageAccount storageAccount = CloudStorageAccount
            .Parse("UseDevelopmentStorage=true");
        // CloudConfigurationManager.GetSetting("StorageConnectionString")
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer container = blobClient.GetContainerReference(containerName);
        container.CreateIfNotExists();
    }

// upload a stream to Azure Storage Emulator
    static public void UploadBlob(System.IO.Stream stream, string containerName, string blobRelativeURI, out string blobURI)
    {
        CloudStorageAccount storageAccount = CloudStorageAccount
            .Parse("UseDevelopmentStorage=true");
        // CloudConfigurationManager.GetSetting("StorageConnectionString")
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer container = blobClient.GetContainerReference(containerName);
        CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobRelativeURI);
        blockBlob.UploadFromStream(stream);
        blobURI = blockBlob.Uri.AbsoluteUri;
    }
}

У меня есть эта строка соединения в web.config. Первоначально я использовал эту строку соединения. Позже, когда я пытаюсь решить проблему, я прочитал несколько сообщений здесь, в stackoverflow, которые я должен использовать Parse("UseDevelopmentStorage=true"). Вы можете увидеть, что код для чтения этой строки связи закомментирован в приведенном выше коде.

<add key="StorageConnectionString"         value="DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1"
/>  

Может ли кто-нибудь сказать мне, в чем проблема? Большое вам спасибо!

Ответ 1

Это происходит потому, что контейнеры по умолчанию отключают доступ к общедоступному доступу. Вы сможете получить доступ к блобе из браузера, если вы измените свойство Public Read Access на Container, используя Visual Studio Server Explorer

enter image description here

Или если вы хотите сделать это в коде через SDK, добавьте следующую строку перед созданием контейнера.

        //Create container
        container.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Container });
        container.CreateIfNotExists();

Ответ 2

Еще один способ сделать это напрямую через Microsoft Azure Storage Explorer. Щелкните правой кнопкой мыши по контейнеру BLOB-объектов и выберите "Установить уровень общего доступа"...

Microsoft Azure Storage Explorer