web-dev-qa-db-fra.com

Azure Blob 400 Requête incorrecte sur la création d'un conteneur

Je développe une application ASP.Net MVC 4 et j'utilise Azure Blob pour stocker les images que mes utilisateurs vont télécharger. J'ai le code suivant:

 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
    } 

dès que l'instruction if est exécutée, je reçois l'exception suivante:

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

Je pensais que c'était le nom du conteneur mais je ne voyais rien de mal à cela. La chaîne de connexion semble créer un bon stockage avec tous les détails du blob. Je suis à perte. J'ai fait des recherches sur le Web et tout le monde dit que c'est un problème de nommage mais je ne trouve rien qui cloche avec ça.

Nom du conteneur de test que j'ai utilisé: imageads-57905553-8585-4d7c-8270-be9e611eda81

Le conteneur a l'URI suivant: {http://127.0.0.1:10000/devstoreaccount1/imageads-57905553-8585-4d7c-8270-be9e611eda81}

UPDATE: J'ai changé le nom du conteneur en image et j'ai toujours la même exception. la chaîne de connexion de développement est également la suivante: <add name="StorageConnection" connectionString="UseDevelopmentStorage=true" />

33
hjavaher

J'ai finalement trouvé le problème. 

Mon problème était que l'émulateur de stockage de blob ne démarre pas (les autres émulateurs démarrent et j'ai raté le blob). Le problème a fini par être que le port 10000 (port d'émulateur de blob par défaut) était déjà utilisé par un autre logiciel. J'ai utilisé l'outil Netstat cmd pour voir de quel logiciel il s'agissait, je l'ai tué et cela fonctionne maintenant comme un charme !!! Merci tout le monde!!

7
hjavaher

Comme vous l'avez constaté au cours de vos recherches, le problème est le nom.

Vous dites que votre conteneur de test s'appelle imageads-57905553-8585-4d7c-8270-be9e611eda81, mais vous utilisez ImageAds-57905553-8585-4d7c-8270-be9e611eda81 dans votre code. Remarquez la différence de capitalisation. Si vous changez le nom de votre conteneur en minuscule, cela fonctionnera correctement.


Pour plus d'informations, voir le n ° 3 sous Noms de conteneur à Nommer et référencer des conteneurs, des objets blob et des métadonnées :

3. Toutes les lettres d'un nom de conteneur doivent être en minuscules .
83
kwill

Pour développer la réponse de @ kwill, j'ai mis en œuvre une solution permettant de convertir toute chaîne en un nom de conteneur acceptable, basé sur les règles de dénomination de conteneur Azure :

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

Ensuite, lorsque vous essayez d’obtenir le conteneur, nettoyez-le d’abord:

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

Assurez-vous que vos versions des bibliothèques de stockage et de l'émulateur de stockage ne sont pas "désynchronisés". J'ai mis à jour mes bibliothèques mais je n'ai pas mis l'émulateur à jour avec la dernière version et j'ai obtenu cette situation exacte.

5
nmit026

Si vous avez venez de mettre à jour le package de nuget WindowsAzure.Storage et que votre application a commencé à planter avec l'erreur http 400 mauvaise requête

Dans mon cas, cela est arrivé lorsque j'ai mis à jour 8.2.1 et que mon émulateur local était la version 5.1.

Ma solution est la suivante:

  1. Accédez à la page du kit de développement logiciel Microsoft Azure ici.
  2. Recherchez "Azure Storage Emulator" et téléchargez le dernier émulateur de stockage. Habituellement au milieu de la page à gauche dans la section "Outils de ligne de commande"
  3. Installer le dernier émulateur
  4. Tu es prêt.

Lorsque j'ai téléchargé Storage Emulator 5.2 et mis à niveau à partir de la version 5.1, les erreurs se sont arrêtées ... Une telle erreur m'est déjà arrivée plusieurs fois.

Ma modeste requête si une personne de l'équipe Microsoft Azure Storage Emulator lit ceci - Veuillez ajouter une vérification du mode de développement et émettre une exception significative avec le message - "Vous avez installé la version XYZ de Azure Storage Emulator. Utilisez la bibliothèque actuelle WindowsAzure.Storage ** VVV avec Azure Emulator. Vous devez installer la version ZZZ de l’émulateur à partir de ce lien ". ** ou de ce que vous jugerez utile.

Ce genre de problème a perdu plusieurs heures de mon temps et je suppose que la même chose est arrivée à des milliers de développeurs à travers le monde et que cette exception existe toujours - depuis plus de 4 ans!

4
Ognyan Dimitrov

Je viens d'avoir ce problème et corrigé.

Mon nom de conteneur était correct, mais le paramètre AccountName de ma chaîne de connexion a été accidentellement mis en majuscule. Cela a conduit à mes 400.

4
Rudy Scoggins

Le mien était un problème de nommage stupide! Apparemment, nous n'avons pas le droit d'utiliser majuscule dans les noms.

Je viens de changer ceci:

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

À 

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

Il ressort de l’expérimentation que les noms de conteneur doivent toujours être en minuscule. Il doit exister une conversion implicite en interne, ce qui lui permet de créer le blob d'origine en minuscule, mais pas lorsqu'il le compare dans createifnotexists (async). Mais lorsqu'il le recrée, il le réduit à nouveau, ce qui entraîne un conflit. Ceci est une meilleure estimation.

2
A.K.

J'ai rencontré cette erreur après la mise à jour des packages, mais pas mon code. Mon problème est que le format et le contenu de la chaîne de connexion ont changé depuis que j'ai commencé à utiliser Azure Storage il y a plusieurs années. Veillez à mettre à jour votre chaîne de connexion de manière appropriée à partir des options de clé d'accès du portail Azure.

Dans mon cas: il me manquait ceci dans ma chaîne de connexion: EndpointSuffix = core.windows.net

2
Stephen O'Leary

J'ai essayé de reproduire votre problème, mais il semblerait que vous utilisiez une version plus ancienne de la bibliothèque cliente, puisque container.CreateIfNotExist() est maintenant container.CreateIfNotExists(). Avez-vous envisagé de mettre à niveau la dernière version du client (2.1)?

1
Garrett

La solution simple à ce problème est que le conteneur doit toujours être en minuscule. J'ai eu le même problème, qui a été résolu après avoir changé le nom du conteneur à tous en minuscules.

0
StaticVariable

il est nécessaire d'afficher le httpstatusmessage dans l'exception: Dans mon cas, l'erreur était due à L'URI demandé ne représente aucune ressource sur le serveur.

donc j'ai vu que ma BlobContainerName ne contient pas le bon conteneur (ou n'existe pas) 

CloudBlobContainer container = > blobClient.GetContainerReference(BlobContainerName);

autre cas que j'ai vu est le mauvais nom du conteneur. blobcontainername qui doit être un nom tel que "mycontainer1" ou "mycontainer2", etc.

voici le code pour ajouter un conteneur

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