it-swarm.com.ru

Azure Blob 400 Плохой запрос на создание контейнера

Я занимаюсь разработкой приложения ASP.Net MVC 4 и использую BLOB-объект Azure для хранения изображений, которые будут загружать мои пользователи. У меня есть следующий код:

 var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["StorageConnection"].ConnectionString);

 var blobStorage = storageAccount.CreateCloudBlobClient();
 //merchantKey is just a GUID that is asociated with the merchant
 var containerName = ("ImageAds-" + merchant.merchantKey.ToString()).ToLower();
 CloudBlobContainer container = blobStorage.GetContainerReference(containerName);
 if (container.CreateIfNotExist())
    {
       //Upload the file
    } 

как только выражение if выполнено, я получаю следующее исключение:

  {"The remote server returned an error: (400) Bad Request."}

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

Имя тестового контейнера, которое я использовал: imageads-57905553-8585-4d7c-8270-be9e611eda81

Контейнер имеет следующий URI: {http://127.0.0.1:10000/devstoreaccount1/imageads-57905553-8585-4d7c-8270-be9e611eda81}

ОБНОВЛЕНИЕ: Я изменил имя контейнера на просто image, и я все еще получаю то же исключение. также строка подключения для разработки выглядит следующим образом: <add name="StorageConnection" connectionString="UseDevelopmentStorage=true" />

33
hjavaher

Я фактически закончил тем, что нашел проблему. 

Моя проблема заключалась в том, что эмулятор хранилища BLOB-объектов не запускался (запускались другие эмуляторы, и я пропускал BLOB-объекты). Проблема закончилась тем, что порт 10000 (порт эмулятора BLOB-объектов по умолчанию) уже использовался другим программным обеспечением. Я использовал инструмент Netstat cmd, чтобы увидеть, какое это было программное обеспечение, убило его, и теперь оно работает как шарм !!! Спасибо всем!!

7
hjavaher

Как вы выяснили из своего исследования, проблема в названии.

Вы говорите, что ваш тестовый контейнер называется imageads-57905553-8585-4d7c-8270-be9e611eda81, но в своем коде вы используете ImageAds-57905553-8585-4d7c-8270-be9e611eda81. Обратите внимание на разницу в капитализации. Если вы переключите имя контейнера на все строчные буквы, оно будет работать правильно.


Для получения дополнительной информации см. # 3 в разделе Имена контейнеров в Имена и ссылки на контейнеры, BLOB-объекты и метаданные :

3. Все буквы в имени контейнера должны быть строчными
83
kwill

Чтобы расширить ответ @ kwill, я реализовал решение для преобразования любой строки в приемлемое имя контейнера на основе правил Azure для именования контейнеров :

public static string ToURLSlug(this string s)
{
    return Regex.Replace(s, @"[^a-z0-9]+", "-", RegexOptions.IgnoreCase)
        .Trim(new char[] { '-' })
        .ToLower();
}

Затем, когда вы попытаетесь получить контейнер, сначала очистите его:

CloudBlobContainer container = blobClient.GetContainerReference(bucket.ToURLSlug());
10
Albert Bori

Убедитесь, что ваши версии библиотек хранилища и эмулятора хранилища не "не синхронизированы". Я обновил свои библиотеки, но не обновил эмулятор до последней версии и получил именно эту ситуацию.

5
nmit026

Если у вас есть только что обновленный пакет nuget WindowsAzure.Storage, и ваше приложение начало сбой из-за http error 400 bad request

В моем случае это произошло, когда я обновился до 8.2.1 и мой локальный эмулятор был версии 5.1.

Мое решение таково:

  1. Перейдите на страницу Microsoft Azure SDK здесь.
  2. Найдите «Azure Storage Emulator» и загрузите последнюю версию эмулятора хранилища. Обычно в середине страницы слева в разделе «Инструменты командной строки»
  3. Установите последнюю версию эмулятора
  4. Тебе хорошо идти.

Когда я скачал Storage Emulator 5.2 и обновился с 5.1, ошибки прекратились…. Такая ошибка уже несколько раз случалась со мной.

Мой скромный запрос, если кто-то из команды Microsoft Azure Storage Emulator читает это - Пожалуйста, добавьте проверку для режима разработки и сгенерируйте значимое исключение с сообщением, например - "У вас установлена ​​версия Azure Storage Emulator XYZ. Чтобы используйте текущую библиотеку WindowsAzure.Storage ** VVV с эмулятором Azure, вам нужно установить версию эмулятора ZZZ по этой ссылке ". ** или что вы считаете полезным.

Подобные проблемы потратили впустую несколько часов моего времени, и я полагаю, что то же самое случилось с тысячами разработчиков по всему миру, и все же это исключение существует - более 4 лет!

4
Ognyan Dimitrov

У меня просто была эта проблема и я ее исправил.

Мое имя контейнера было в порядке, но у меня случайно в строке подключения был прописан параметр AccountName. Это привело к моим 400.

4
Rudy Scoggins

У меня была глупая проблема с именами! По-видимому, мы не разрешено использовать прописными буквами в именах.

Я только что изменил это:

CloudBlobContainer container = blobClient.GetContainerReference("MyContainer");
container.CreateIfNotExists();

К  

CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");
container.CreateIfNotExists();
3
Ashkan Sirous

Из экспериментов видно, что имена контейнеров всегда должны быть в нижнем регистре. Внутри должно быть неявное преобразование, которое заставляет его создавать исходный BLOB-объект в нижнем регистре, но не тогда, когда оно сравнивает его в createifnotexists (async). Но когда он собирается воссоздать его, он еще раз делает нижний регистр, что приводит к конфликту. Это лучшая догадка.

2
A.K.

Я столкнулся с этой ошибкой после обновления пакетов, но не мой код. Моя проблема заключается в том, что формат и содержимое строки подключения изменились с тех пор, как я впервые начал использовать хранилище Azure несколько лет назад. Обязательно обновите строку подключения соответствующим образом в параметрах ключей доступа на портале Azure.

В моем случае: я пропустил это в строке подключения: EndpointSuffix = core.windows.net

2
Stephen O'Leary

Я попытался воспроизвести вашу проблему, но похоже, что вы используете более старую версию клиентской библиотеки, поскольку container.CreateIfNotExist() теперь container.CreateIfNotExists(). Рассматривали ли вы обновление до последней версии клиента (2.1)?

1
Garrett

Простое решение этой проблемы - контейнер всегда должен быть в нижнем регистре. У меня была та же проблема, которая была решена после изменения имени контейнера на строчные буквы.

0
StaticVariable

необходимо просмотреть httpstatusmessage в исключении: в моем случае ошибка была из-за Запрошенный URI не представляет никакой ресурс на сервере.

так что я видел, что мой BlobContainerName не содержит нужный контейнер (или не существует) 

CloudBlobContainer container = > blobClient.GetContainerReference(BlobContainerName);

другой случай, который я видел, это неправильное имя контейнера. имя blobcontainer, которое должно быть таким, как «mycontainer1» или «mycontainer2» и т. д.

здесь код для добавления контейнера

try
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString);

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

            // Retrieve reference to a previously created container.
            CloudBlobContainer container = blobClient.GetContainerReference(BlobContainerName);

            container.CreateIfNotExists();

           //creo se non esiste e aggiungo i permessi
            BlobContainerPermissions containerPermissions = new BlobContainerPermissions();
            containerPermissions.PublicAccess = BlobContainerPublicAccessType.Blob;
            container.SetPermissions(containerPermissions);

            // Retrieve reference to a blob named "myblob".
            CloudBlockBlob blockBlob = container.GetBlockBlobReference(Filename); 

            blockBlob.UploadFromStream(inFileUpload);
        }
        catch (Exception ex)
        {
            return "";
        }
0
user3394095