web-dev-qa-db-fra.com

Impossible de télécharger vers Azure Blob Storage: le serveur distant a renvoyé une erreur: (400) requête incorrecte.

J'essaie de créer un utilitaire pour télécharger un fichier sur Internet et le télécharger à nouveau vers le stockage d'objets blob Azure. Les conteneurs blob sont déjà bien créés. Mais pour une raison quelconque, je reçois une exception "Bad Request 400" lorsque j'ai essayé de télécharger le fichier vers un stockage ... Le nom du conteneur est créé, de petites lettres, des caractères spéciaux. Mais je ne sais toujours pas pourquoi je reçois l'exception!

S'il vous plaît aider.

Remarque

  • Je n'utilise aucun émulateur ... Je teste directement sur le cloud.
  • Tous mes conteneurs avec l'option d'accès "Public Container".

Voici l'exception:

An exception of type 'Microsoft.WindowsAzure.Storage.StorageException' 
occurred in Microsoft.WindowsAzure.Storage.dll but was not handled in user code
Additional information: The remote server returned an error: (400) Bad Request.

Et voici le code:

foreach (var obj in objectsList)
{
     var containerName = obj.id.Replace("\"", "").Replace("_", "").Trim();
     CloudBlobContainer blobContainer = blobClient.GetContainerReference(containerName);

     if (blobContainer.Exists())
     {
         var fileNamesArr = obj.fileNames.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries);

         foreach (var sora in fileNamesArr)
         {
             int soraInt = int.Parse(sora.Replace("\"", ""));
             String fileName = String.Format("{0}.mp3", soraInt.ToString("000"));

             var url = String.Format("http://{0}/{1}/{2}", obj.hostName.Replace("\"", ""), obj.id.Replace("\"", ""), fileName.Replace("\"", "")).ToLower();

             var tempFileName = "temp.mp3";

             var downloadedFilePath = Path.Combine(Path.GetTempPath(), tempFileName).ToLower();

             var webUtil = new WebUtils(url);
             await webUtil.DownloadAsync(url, downloadedFilePath).ContinueWith(task =>
             {
                 var blobRef = blobContainer.GetBlockBlobReference(fileName.ToLower());
                 blobRef.Properties.ContentType = GetMimeType(downloadedFilePath);

                 using (var fs = new FileStream(downloadedFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
                 {
                     blobRef.UploadFromStream(fs); // <--- Exception
                 }
             });
         }
      }
      else
      {
          throw new Exception(obj.id.Replace("\"", "") + " Container not exist!");
      }
}

Edition: l'exception de stockage

Microsoft.WindowsAzure.Storage.StorageException: le serveur distant a renvoyé une erreur: (400) demande incorrecte. ---> System.Net.WebException: le serveur distant a renvoyé une erreur: (400) requête incorrecte. Sur System.Net.HttpWebRequest.GetRequestStream (TransportContext & context) Sur System.Net. HttpWebRequest.GetRequestStream () À Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync [T] (RESTCommand1 cmd, IRetryPolicy policy, OperationContext operationContext) --- End of inner exception stack trace --- at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand1 cmd, politique IRetryPolicy, OperationContext operationContext) à. .CloudBlockBlob.UploadFromStreamHelper (Source du flux, Longueur de Nullable`1, AccessCondition accessCondition, Options de BlobRequestOptions, OperationContext operationContext) [. operationContext) dans TelawatAzureUtility.StorageService. <> c__DisplayClass4.b__12 (tâche) dans\psf\Home\Documents\Visual Studio 14\Projets\Telawat Azure Utility\TelawatAzureUtility\StorageServic e.cs: ligne 128 Demande d'information RequestID: RequestDate: samedi 28 juin 2014 20:12:14 GMT StatusMessage: Bad Request

Edit 2: Demande d'informations:

enter image description here

enter image description here

Edit 3: Le problème vient de WebUtils .. Je l’ai remplacé par le code ci-dessous et cela fonctionne! Je vais ajouter du code weUtils, vous pouvez peut-être nous aider à savoir quel est le problème.

HttpClient client = new HttpClient();
var stream = await client.GetStreamAsync(url);

Code WebUtils: 

public class WebUtils
{
    private Lazy<IWebProxy> proxy;

    public WebUtils(String url)
    {
        proxy = new Lazy<IWebProxy>(() => string.IsNullOrEmpty(url) ? null : new WebProxy {
            Address = new Uri(url), UseDefaultCredentials = true });
    }

    public IWebProxy Proxy
    {
        get { return proxy.Value; }
    }

    public Task DownloadAsync(string requestUri, string filename)
    {
        if (requestUri == null)
            throw new ArgumentNullException("requestUri is missing!");

        return DownloadAsync(new Uri(requestUri), filename);
    }

    public async Task DownloadAsync(Uri requestUri, string filename)
    {
        if (filename == null)
            throw new ArgumentNullException("filename is missing!");

        if (Proxy != null)
        {
            WebRequest.DefaultWebProxy = Proxy;
        }

        using (var httpClient = new HttpClient())
        {
            using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri))
            {
                using (Stream contentStream = await (await httpClient.SendAsync(request)).Content.ReadAsStreamAsync())
                {
                    using (var stream = new FileStream(filename, FileMode.Create, FileAccess.Write))
                    {
                        contentStream.CopyTo(stream);
                        stream.Flush();
                        stream.Close();
                    }
                    contentStream.Close();
                }
            }
        }
    }
}

Aussi, quand j'ai essayé ce code ... le "Wait" ne sera jamais fini ou complété!

webUtil.DownloadAsync(url, downloadedFilePath).Wait()
12
bunjeeb

Avez-vous essayé de créer un conteneur manuellement sur le portail Azure? Le nom que vous pouvez donner aux conteneurs est limité. 

Par exemple: Le nom du conteneur ne peut pas contenir de lettres majuscules. 

Si vous demandez un conteneur avec un nom invalide, cela entraînera une (400) requête incorrecte, que vous obtiendrez. Vérifiez donc votre chaîne "containerName".

31
siddhant

J'ai également eu cette erreur avec les files d'attente de messages Azure Storage. 

Les noms de la file d'attente de messages Azure Storage doivent également être en minuscules. C'est-à-dire: nom "newqueueitem" en minuscule.

// Retrieve a reference to a queue.
CloudQueue queue = queueClient.GetQueueReference("newqueueitem");

// Create the queue if it doesn't already exist.
queue.CreateIfNotExists();
2
Alex

J'ai eu un cas très différent de mauvais message de demande. Publier ici pour toute autre personne susceptible de frapper la même chose. Dans mon cas, je ne faisais que déplacer des ressources à travers d’autres groupes de ressources. Dans ce brassage, un bogue dans Azure m'a permis de pointer mon stockage vers un emplacement ("Asie du Sud-Est") qui n'était pas disponible dans ma région. Ainsi, toutes les requêtes adressées au compte de stockage ont renvoyé le message de requête incorrecte. Il m'a fallu un certain temps pour comprendre cela, car j'ai ensuite créé un autre compte de stockage à tester. Lors de la création, Azure ne m'a pas permis de choisir "Asie du Sud-Est" comme emplacement de choix. J'ai donc choisi un autre emplacement ("Asie de l'Est". ") et puis tout a bien fonctionné. 

1
Metal Latem

J'ai rencontré le même problème lors de la création de la file d'attente dans Azure avec une lettre UpperCase à partir de mon code C #. L'erreur était avec le nom de la file d'attente. Tous les caractères doivent être en minuscules. Après avoir changé tous les caractères en minuscule, cela a fonctionné! :)

//Retrieve a reference to a queue
CloudQueue queue = queueClient.GetQueueReference("myqueue");
//Create a queue if it alredy doen't exists
queue.CreateIfNotExists();
0
Digamber