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" />
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!!
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 .
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());
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.
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:
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!
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.
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();
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.
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
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)?
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.
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 "";
}