Azure Blob 400 Solicitud incorrecta al crear un contenedor


Estoy desarrollando un ASP.Net MVC 4 app y estoy usando Azure Blob para almacenar las imágenes que mis usuarios van a subir. Tengo el siguiente código:

 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
    } 

Tan pronto como la sentencia if es ejecutada, obtengo la siguiente excepción:

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

Pensé que era el nombre del contenedor, pero no veo nada malo en él. La cadena de conexión parece crear un buen almacenamiento con todos los detalles para el blob. Estoy perdido. He investigado la web y todo el mundo está diciendo que es un problema de nombres, pero no puedo encontrar nada malo en ello.

Nombre del contenedor de prueba que utilicé: imageads-57905553-8585-4d7c-8270-be9e611eda81

El Contenedor tiene el siguiente uri: {http://127.0.0.1:10000/devstoreaccount1/imageads-57905553-8585-4d7c-8270-be9e611eda81}

ACTUALIZACIÓN: He cambiado el nombre del contenedor a solo image y todavía obtengo la misma excepción. también la cadena de conexión de desarrollo es la siguiente: <add name="StorageConnection" connectionString="UseDevelopmentStorage=true" />

Author: Jon Crowell, 2013-10-26

10 answers

Como descubriste a través de tu investigación, el problema es el nombre.

Usted dice que su contenedor de prueba se llama imageads-57905553-8585-4d7c-8270-be9e611eda81, pero en su código está utilizando ImageAds-57905553-8585-4d7c-8270-be9e611eda81. Observe la diferencia en la capitalización. Si cambia el nombre de su contenedor a todas las minúsculas, funcionará correctamente.


Para obtener más información, consulte #3 en Nombres de contenedores en Nombrar y hacer referencia a Contenedores, Blobs y Metadatos :

3. Todas las letras en un nombre de contenedor deben ser minúsculas.
 81
Author: kwill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-17 19:32:16

Para ampliar la respuesta de @kwill, implementé una solución para convertir cualquier cadena en un nombre de contenedor aceptable, basado en Las reglas de Azure para nombrar contenedores :

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

Luego, cuando intente obtener el recipiente, límpielo primero:

CloudBlobContainer container = blobClient.GetContainerReference(bucket.ToURLSlug());
 10
Author: Albert Bori,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-28 23:51:06

En realidad terminé encontrando el problema.

Mi problema era que el emulador de blob storage no se iniciaría (los otros emuladores se iniciarían y me perdí el blob). El problema terminó siendo que el puerto 10000 (puerto predeterminado del emulador de blob) ya estaba siendo utilizado por otro software. Utilicé la herramienta cmd Netstat para ver qué software era, lo maté y ahora funciona como un encanto!!! Gracias a todos!!

 7
Author: hjavaher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-25 22:43:44

Asegúrese de que sus versiones de las bibliotecas de almacenamiento y el emulador de almacenamiento no estén "fuera de sincronización". Actualizé mis bibliotecas, pero no actualizé el emulador a la última versión y obtuve esta situación exacta.

 5
Author: nmit026,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-27 23:03:27

Acabo de tener este problema y lo solucioné.

El nombre de mi contenedor estaba bien, pero accidentalmente puse en mayúscula el parámetro AccountName en mi cadena de conexión. Esto me llevó a mis 400.

 4
Author: Rudy Scoggins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-06 16:53:22

Si tiene acaba de actualizar el WindowsAzure.Storage el paquete nuget y su aplicación comenzaron a fallar con http error 400 bad request :

En mi caso sucedió cuando actualicé a 8.2.1 y mi emulador local fue la versión 5.1.

Mi solución es la siguiente:

  1. Vaya a la página de Microsoft Azure SDK aquí.
  2. Busque "Azure Storage Emulator" y descargue el último emulador de almacenamiento. Por lo general, en el centro de la página a la izquierda en la sección" Herramientas de línea de comandos "
  3. Instalar el último emulador
  4. Usted es bueno para ir.

Cuando descargué el Emulador de almacenamiento 5.2 y actualicé de 5.1 los errores se detuvieron. Tal error ya me ocurrió varias veces.

Mi humilde petición si alguien del equipo de Microsoft Azure Storage Emulator lee esto - Agregue una comprobación para el modo de desarrollo y lance una excepción significativa con el mensaje como - " Tiene Azure Storage Emulador versión X. Y. Z instalado. Con el fin de utilizar el WindowsAzure actual.Biblioteca de almacenamiento * * V. V. V con Azure Emulator es necesario instalar la versión Z. Z. Z del emulador desde este enlace".** o lo que consideres útil.

Este tipo de problema han perdido varias horas de mi tiempo y supongo que lo mismo le pasó a miles de desarrolladores de todo el mundo y todavía esta excepción se sienta allí - por más de 4 años!

 4
Author: Ognyan Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-11 05:41:55

De la experimentación parece que los nombres de los contenedores siempre deben ser también minúsculas. Debe haber una conversión implícita internamente, lo que hace que cree el blob original en minúsculas, pero no cuando lo compara en createifnotexists(async). Pero cuando va a recrearlo, vuelve a minimizarlo, lo que resulta en un conflicto. Esta es la mejor suposición.

 2
Author: A.K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-29 23:53:07

El mío fue un estúpido problema de nombres! Aparentemente no se nos permite usar mayúsculas en los nombres.

Acabo de cambiar esto:

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

A

CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");
container.CreateIfNotExists();
 2
Author: Ashkan Sirous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-20 11:49:57

He intentado reproducir su problema, pero parece que está utilizando una versión anterior de la biblioteca cliente, ya que container.CreateIfNotExist() es ahora container.CreateIfNotExists(). ¿Ha considerado actualizar la última versión del cliente (2.1)?

 1
Author: Garrett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-25 22:36:10

Es necesario ver el httpstatusmessage en la excepción: en mi caso el error fue porque El URI solicitado no representa ningún recurso en el servidor.

Así que he visto que mi BlobContainerName no contiene el contenedor correcto (o no existe)

CloudBlobContainer container = > blobClient.GetContainerReference(BlobContainerName);

Otro caso que he visto es el nombre equivocado del contenedor. blobcontainername que debe ser un nombre como "mycontainer1" o "mycontainer2" y así sucesivamente

Aquí el código para agregar contenedor

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
Author: user3394095,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-17 19:30:09