144 votes

Azure table storage renvoie 400 Bad Request

Je l'ai exécuté en mode débogage, et je joins une image avec les détails de l'exception. Comment puis-je savoir ce qui a mal tourné ? J'essayais d'insérer des données dans un tableau. Azure ne peut pas me donner plus de détails ?

Obs : Le stockage est sur Windows Azure et non sur ma machine. Les tables ont été créées, mais j'obtiens cette erreur lors de l'insertion de données

enter image description here

// Retrieve the storage account from the connection string.
Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=***;AccountKey=***");

// Create the table client.
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

// Create the table if it doesn't exist.
CloudTable table = tableClient.GetTableReference("EmployeeOnlineHistory");
table.CreateIfNotExists();

et voici le code d'insertion :

public static void SetStatus(Employee e, bool value)
{
    try
    {
        // Retrieve the storage account from the connection string.
        Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=###;AccountKey=###");

        // Create the table client.
        CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

        // Create the CloudTable object that represents the "people" table.
        CloudTable table = tableClient.GetTableReference("EmployeeOnlineHistory");

        // Create a new customer entity.

        if (value == true)
        {
            EmployeeOnlineHistory empHistory = new EmployeeOnlineHistory(e.Id);
            empHistory.IsOnline = true;
            empHistory.OnlineTimestamp = DateTime.Now;
            TableOperation insertOperation = TableOperation.Insert(empHistory);
            table.Execute(insertOperation);
        }
        else
        {
            TableQuery<EmployeeOnlineHistory> query = new TableQuery<EmployeeOnlineHistory>()
                .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, e.Id.ToString()));
            EmployeeOnlineHistory entity = table.ExecuteQuery(query).Take(1).FirstOrDefault();

            if ((entity!=null)&&(entity.IsOnline))
            {
                entity.IsOnline = false;
                entity.OfflineTimestamp = DateTime.Now;
                entity.OnlineTime = (entity.OfflineTimestamp - entity.OnlineTimestamp);
                TableOperation updateOperation = TableOperation.Replace(entity);
                table.Execute(updateOperation);
            }
            else
            {
                EmployeeOnlineHistory empHistory = new EmployeeOnlineHistory(e.Id);
                empHistory.IsOnline = false;
                empHistory.OfflineTimestamp = DateTime.Now;
                TableOperation insertOperation = TableOperation.Insert(empHistory);
                table.Execute(insertOperation);
            }
        }
    }
    catch (Exception ex)
    {
        //var details = new System.IO.StreamReader(((Microsoft.WindowsAzure.Storage.StorageException)ex)..Response.GetResponseStream()).ReadToEnd();
        LogFile.Error("EmployeeOnlineHistory.setStatus",ex);
    }
}

0voto

Chandana Points 593

J'ai réparé mes cas et ça a bien marché

Mes affaires :

  1. La clé de rangée n'est pas au bon format (400).
  2. La combinaison de partitionkey et rowkey n'est pas unique (409).

0voto

Aidan Points 93

Je recevais un message 400 Bad Request parce que j'utilisais ZRS (Zone Redundant Storage), et Analytics n'est pas disponible pour ce type de stockage. Je ne savais pas que j'utilisais Analytics.

J'ai supprimé le conteneur de stockage et l'ai recréé en tant que GRS et maintenant cela fonctionne bien.

0voto

Steve Friedl Points 33

Dans mon cas : J'ai inclus les métadonnées du blob avec un nom de balise contenant un trait d'union.

var blob = container.GetBlockBlobReference(filename);
blob.Metadata.Add("added-by", Environment.UserName);
//.. other metadata
blob.UploadFromStream(filestream);

Le tiret dans "added-by" était le problème, et plus tard RTFM m'a dit que les noms de balises doivent se conformer aux conventions d'identification C#.

Réf : https://docs.microsoft.com/en-us/azure/storage/blobs/storage-properties-metadata

Underscore fonctionne bien.

0voto

merry Points 1

Dans mon cas, je ne dois pas ajouter PartitionKey et Rowkey dans ma classe d'entité. Cela devrait être dans la classe de base. L'exemple ci-dessous fonctionnerait.

public class TableRunLogMessage:TableEntity
{
      public string status { get; set; }
      public long logged { get; set; }

      public TableRunLogMessage() { }
}

0voto

Doug Points 481

Si vous utilisez NodeJS et que vous êtes tombé sur cet article, et que vous constatez que vous n'obtenez pas ces belles informations détaillées dans votre objet d'erreur, vous pouvez utiliser un proxy pour obtenir ces détails. Cependant, puisque personne ici ne mentionne COMMENT utiliser un proxy.

La méthode la plus simple avec NodeJS consiste à définir deux variables environnementales :

NODE_TLS_REJECT_UNAUTHORIZED=0
This disables SSL checks so you can intercept your own SSL requests. This leaves you open to Man-in-The-Middle attacks and should NEVER make it to production, and I wouldn't even leave it in development for long. However, it will allow you to intercept the HTTP Requests.

HTTP_PROXY=http://127.0.0.1:8888
This sets node to utilize a proxy listening on your localhost at port 8888. Port 8888 is the default for Fiddler. Many other proxies default to 8080.

Si vous utilisez C#, comme l'auteur de cet article, vous pouvez simplement installer Fiddler et le configurer pour intercepter. Par défaut, il devrait intercepter les requêtes. Vous devrez peut-être aussi faire confiance au certificat de Fiddler ou faire l'équivalent de "NODE_TLS_REJECT_UNAUTHORIZED=0" de Node.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X