wake-up-neo.com

Azure Blob 400 Ungültige Anforderung zum Erstellen eines Containers

Ich entwickle eine ASP.Net MVC 4-App und verwende Azure Blob zum Speichern der Bilder, die meine Benutzer hochladen werden. Ich habe folgenden Code:

 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
    } 

sobald die if-Anweisung ausgeführt wird, erhalte ich die folgende Ausnahme:

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

Ich dachte, es wäre der Name des Containers, aber ich sehe nichts Falsches daran. Die Verbindungszeichenfolge scheint einen guten Speicherplatz mit allen Details für den Blob zu schaffen. Ich bin ratlos. Ich habe das Web recherchiert und jeder sagt, es sei ein Namensproblem, aber ich finde nichts falsches.

Testcontainername, den ich verwendet habe: imageads-57905553-8585-4d7c-8270-be9e611eda81

Der Container hat den folgenden URI: {http://127.0.0.1:10000/devstoreaccount1/imageads-57905553-8585-4d7c-8270-be9e611eda81}

UPDATE: Ich habe den Containernamen in image geändert und bekomme immer noch die gleiche Ausnahme. Die Entwicklungsverbindungszeichenfolge lautet wie folgt: <add name="StorageConnection" connectionString="UseDevelopmentStorage=true" />

33
hjavaher

Ich habe das Problem tatsächlich gefunden. 

Mein Problem war, dass der Blob-Speicheremulator nicht startet (die anderen Emulatoren würden starten und ich habe den Blob vermisst). Das Problem bestand schließlich darin, dass der Port 10000 (Standard-Blob-Emulator-Port) bereits von einer anderen Software verwendet wurde. Ich benutzte das Netstat cmd-Tool, um zu sehen, welche Software es war. Es wurde getötet und es funktioniert jetzt wie ein Zauber !!! Vielen Dank an alle !!

7
hjavaher

Wie Sie bei Ihrer Recherche festgestellt haben, ist das Problem der Name.

Sie sagen, dass Ihr Testcontainer imageads-57905553-8585-4d7c-8270-be9e611eda81 heißt, aber in Ihrem Code verwenden Sie ImageAds-57905553-8585-4d7c-8270-be9e611eda81. Beachten Sie den Unterschied in der Großschreibung. Wenn Sie Ihren Containernamen auf Kleinbuchstaben umstellen, funktioniert er ordnungsgemäß.


Weitere Informationen finden Sie unter Nummer 3 unter Containernamen unter Benennen und Referenzieren von Containern, Blobs und Metadaten :

3. Alle Buchstaben in einem Containernamen müssen Kleinbuchstaben sein .
83
kwill

Um die Antwort von @ kwill zu erweitern, habe ich eine Lösung zum Konvertieren einer beliebigen Zeichenfolge in einen akzeptablen Containernamen implementiert, basierend auf Azures Regeln für die Benennung von Containern :

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

Wenn Sie versuchen, den Container zu erhalten, müssen Sie ihn zuerst bereinigen:

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

Stellen Sie sicher, dass Ihre Versionen der Speicherbibliotheken und des Speicheremulators nicht synchron sind. Ich habe meine Bibliotheken aktualisiert, aber den Emulator nicht auf die neueste Version aktualisiert und habe genau diese Situation erhalten.

5
nmit026

Wenn Sie gerade aktualisiert haben, das WindowsAzure.Storage -Nuget-Paket und Ihre App mit dem http-Fehler 400 abgestürzt ist, konnte die Anforderung nicht ausgeführt werden: 

In meinem Fall ist es passiert, als ich auf 8.2.1 aktualisiert habe und mein lokaler Emulator Version 5.1 war.

Meine Lösung ist folgende:

  1. Gehen Sie zur Microsoft Azure SDK-Seite hier.
  2. Suchen Sie nach "Azure Storage Emulator" und laden Sie den neuesten Speicheremulator herunter. Normalerweise in der Mitte der Seite links im Abschnitt "Befehlszeilen-Tools"
  3. Installieren Sie den neuesten Emulator
  4. Du bist startklar.

Als ich den Storage Emulator 5.2 heruntergeladen und von 5.1 aufgerüstet habe, sind die Fehler gestoppt .. Ein solcher Fehler ist mir schon mehrmals passiert.

Meine bescheidene Anfrage, wenn jemand aus dem Microsoft Azure Storage Emulator-Team dies liest - Fügen Sie eine Überprüfung für den Entwicklungsmodus hinzu und geben Sie eine sinnvolle Ausnahme mit der folgenden Meldung aus: - "Sie haben die Azure Storage Emulator-Version XYZ installiert Verwenden Sie die aktuelle WindowsAzure.Storage-Bibliothek ** VVV mit dem Azure-Emulator. Sie müssen die Version ZZZ des Emulators über diesen Link installieren. ". ** oder was auch immer Sie für nützlich halten.

Diese Art von Problem hat mehrere Stunden meiner Zeit verschwendet, und ich nehme an, dass es Tausenden von Entwicklern auf der ganzen Welt dasselbe passiert, und diese Ausnahme gilt immer noch dort - seit mehr als 4 Jahren!

4
Ognyan Dimitrov

Ich hatte gerade dieses Problem und habe es behoben.

Mein Containername war in Ordnung, aber ich hatte versehentlich den Parameter AccountName in meiner Verbindungszeichenfolge groß geschrieben. Dies führte zu meiner 400.

4
Rudy Scoggins

Meines war ein dummes Namensproblem! Anscheinend sind wir nicht erlaubt, um Großbuchstaben in den Namen zu verwenden.

Ich habe das gerade geändert:

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

An 

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

Beim Experimentieren scheint es, als müssten Containernamen immer auch Kleinbuchstaben sein. Es muss intern eine implizite Konvertierung vorhanden sein, die bewirkt, dass der ursprüngliche Blob in Kleinbuchstaben erstellt wird, nicht jedoch, wenn er in createifnotexists (async) verglichen wird. Wenn es jedoch neu erstellt wird, werden die Groß- und Kleinschreibung erneut unterschrieben, was zu einem Konflikt führt. Das ist eine gute Vermutung.

2
A.K.

Ich habe diesen Fehler nach dem Aktualisieren der Pakete festgestellt, aber nicht meinen Code. Mein Problem ist, dass sich das Format und der Inhalt der Verbindungszeichenfolge geändert haben, seit ich vor einigen Jahren Azure Storage verwendet habe. Stellen Sie sicher, dass Sie die Verbindungszeichenfolge entsprechend über die Zugriffsschlüsseloptionen im Azure-Portal aktualisieren.

In meinem Fall: Mir fehlte dies in meiner Verbindungszeichenfolge: EndpointSuffix = core.windows.net

2
Stephen O'Leary

Ich habe versucht, Ihr Problem zu reproduzieren, aber es sieht so aus, als würden Sie eine ältere Version der Clientbibliothek verwenden, da container.CreateIfNotExist() jetzt container.CreateIfNotExists() ist. Haben Sie in Betracht gezogen, die neueste Client-Version (2.1) zu aktualisieren?

1
Garrett

Die einfache Lösung für dieses Problem besteht darin, dass der Container immer in Kleinbuchstaben sein sollte. Ich hatte das gleiche Problem, das behoben wurde, nachdem der Containername in Kleinschreibung geändert wurde.

0
StaticVariable

es ist erforderlich, die httpstatus-Meldung in Ausnahmebedingung anzuzeigen: In meinem Fall war der Fehler die Ursache von Der angeforderte URI repräsentiert keine Ressource auf dem Server.

also habe ich gesehen, dass meine BlobContainerName nicht den richtigen Container enthält (oder nicht existiert) 

CloudBlobContainer container = > blobClient.GetContainerReference(BlobContainerName);

ein anderer Fall, den ich gesehen habe, ist der falsche Name des Containers. blobcontainername, der ein Name wie "mycontainer1" oder "mycontainer2" sein muss, usw.

hier der Code zum Hinzufügen des Containers

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