net microsoft from example descargar asp asp.net-mvc-4 azure azure-storage azure-storage-blobs blobstorage

asp.net mvc 4 - microsoft - Azure Blob 400 Solicitud incorrecta en Creación de contenedor



download file from azure blob storage c# (10)

Estoy desarrollando una aplicación ASP.Net MVC 4 y estoy usando Azure Blob para almacenar las imágenes que subirán mis usuarios. 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 se ejecuta la declaración if 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 de malo en ello. La cadena de conexión parece crear un buen almacenamiento con todos los detalles del blob. Estoy perdido Investigué la web y todos dicen que es un problema de nomenclatura, pero no encuentro nada de 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 aún recibo la misma excepción. también la cadena de conexión de desarrollo es la siguiente: <add name="StorageConnection" connectionString="UseDevelopmentStorage=true" />


¡El mío fue un estúpido problema de nombres! Aparentemente no tenemos permitido usar letras mayúsculas en los nombres.

Acabo de cambiar esto:

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

A

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


A partir de la experimentación, parece que los nombres de los contenedores siempre deben estar en 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 volver a crearlo, lo reduce de nuevo, lo que genera un conflicto. Esta es una mejor suposición.


Acabo de tener este problema y lo solucioné.

Mi nombre de contenedor estaba bien, pero accidentalmente tenía el parámetro AccountName en mi cadena de conexión en mayúscula. Esto condujo a mi 400.


Asegúrese de que sus versiones de las bibliotecas de almacenamiento y el emulador de almacenamiento no estén "desincronizadas". Actualicé mis bibliotecas pero no actualicé el emulador a la última versión y obtuve esta situación exacta.


Como descubrió en su 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á usando ImageAds-57905553-8585-4d7c-8270-be9e611eda81 . Observe la diferencia en mayúsculas. Si cambia el nombre de su contenedor a minúsculas, funcionará correctamente.


Para obtener más información, consulte el n. ° 3 en Nombres de contenedores al nombrar y hacer referencia a contenedores, blobs y metadatos :

3. Todas las letras en un nombre de contenedor deben estar en minúsculas.

De hecho, terminé encontrando el problema.

Mi problema era que el emulador de almacenamiento de blob no se iniciaba (los demás emuladores se iniciaban y echaba de menos el blob). El problema terminó siendo que el puerto 10000 (puerto predeterminado del emulador de blobs) ya estaba siendo utilizado por otro software. ¡Utilicé la herramienta de cmd Netstat para ver qué software era, lo maté y ahora funciona como un amuleto! ¡¡Gracias a todos!!


Intenté reproducir tu problema, pero parece que estás usando una versión anterior de la biblioteca cliente, ya que container.CreateIfNotExist() ahora es container.CreateIfNotExists() . ¿Ha considerado actualizar la última versión del cliente (2.1)?


Para ampliar la respuesta de @kwill, implementé una solución para convertir cualquier cadena en un nombre de contenedor aceptable, de acuerdo con las reglas de Azure para denominación de contenedor :

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

Luego, cuando trates de obtener el contenedor, límpialo primero:

CloudBlobContainer container = blobClient.GetContainerReference(bucket.ToURLSlug());


Si acabas de actualizar el paquete nuget WindowsAzure.Storage y tu aplicación comenzó a fallar con la solicitud errónea http error 400 :

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

Mi solución es esta:

  1. Vaya a la página SDK de Microsoft Azure here.
  2. Busque "Azure Storage Emulator" y descargue el último emulador de almacenamiento. Por lo general, en el medio de la página a la izquierda en la sección "Herramientas de línea de comandos"
  3. Instala el último emulador
  4. Tú eres bueno para irte.

Cuando descargué Storage Emulator 5.2 y actualicé desde 5.1 los errores se detuvieron. Tal error ya me pasó varias veces.

Mi humilde pedido si alguien del equipo emulador de almacenamiento de Microsoft Azure lee esto : agregue una marca de verificación para el modo de desarrollo y genere una excepción significativa con el mensaje: "Tiene instalada Azure Storage Emulator versión XYZ. Para usar WindowsAzure.Storage actual biblioteca ** VVV con Azure Emulator necesita instalar la versión ZZZ del emulador desde este enlace ". ** o lo que considere útil.

Este tipo de problema ha desperdiciado varias horas de mi tiempo y supongo que lo mismo le sucedió a miles de desarrolladores en todo el mundo y aún así esta excepción se encuentra allí: ¡durante más de 4 años!


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 incorrecto del contenedor. blobcontainername que debe ser un nombre como "mycontainer1" o "mycontainer2" y así sucesivamente

aquí el código para agregar el 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 ""; }