Le stockage de table Azure renvoie 400 Requête incorrecte

Je l’ai exécuté en mode débogage et j’attache 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. Azur ne peut pas me donner plus de détails?

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

entrer la description de l'image ici

// Resortingeve the storage account from the connection ssortingng. 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 { // Resortingeve the storage account from the connection ssortingng. 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 query = new TableQuery() .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, e.Id.ToSsortingng())); 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); } } 

    400 Erreur signifie que quelque chose ne va pas avec la valeur de l’une de vos propriétés. L’une des méthodes consiste à suivre la demande / réponse via Fiddler et à voir les données réellement envoyées à Windows Azure Storage.

    En supposant que vous ayez pris un rapide coup d’œil à votre code, vous avez dans votre modèle certaines propriétés de type Date / Heure (OfflineTimestamp, OnlineTimestamp) et constaté que dans certains scénarios, l’une d’elles est initialisée avec la valeur par défaut est ” DateTime.MinValue “. Notez que la valeur minimale autorisée pour un atsortingbut de type Date / Heure est le 1er janvier 1601 (UTC) dans Windows Azure [http://msdn.microsoft.com/en-us/library/windowsazuree/dd179338.aspx] . S’il vous plaît voir si ce n’est pas le cas. Si tel est le cas, alors vous pouvez les rendre de type nullable afin qu’ils ne soient pas remplis avec les valeurs par défaut.

    Jetez un coup d’œil à la réponse de Juha Palomäki ci-dessous également. Il y a parfois un message légèrement plus utile dans l’exception où il suggère (RequestInformation.ExtendedErrorInformation.ErrorMessage)

    StorageException contient également des informations un peu plus détaillées sur les erreurs.

    Débogueur d’archivage: StorageException.RequestInformation.ExtendedInformation

    entrer la description de l'image ici

    Dans mon cas, c’était une barre oblique dans RowKey .

    J’ai également reçu un ‘OutOfRangeInput – une des entrées de la requête est hors limites.’ erreur lors de la tentative d’ajout manuel via l’émulateur de stockage.

    Caractères interdits dans les champs clés

    Les caractères suivants ne sont pas autorisés dans les valeurs des propriétés PartitionKey et RowKey :

    • Le caractère barre oblique ( / )
    • Le caractère barre oblique inverse ( \ )
    • Le caractère de signe numérique ( # )
    • Le caractère d’interrogation ( ? )
    • Caractères de contrôle de U + 0000 à U + 001F , y compris:
      • Le caractère de tabulation horizontale ( \ t )
      • Le caractère de saut de ligne ( \ n )
      • Le caractère retour chariot ( \ r )
      • Contrôle des caractères de U + 007F à U + 009F

    http://msdn.microsoft.com/en-us/library/dd179338.aspx

    J’ai écrit une méthode d’extension pour gérer cela pour moi.

     public static ssortingng ToAzureKeySsortingng(this ssortingng str) { var sb = new SsortingngBuilder(); foreach (var c in str .Where(c => c != '/' && c != '\\' && c != '#' && c != '/' && c != '?' && !char.IsControl(c))) sb.Append(c); return sb.ToSsortingng(); } 

    J’ai fait face au même problème mais la raison dans mon cas était due à la taille. Après avoir creusé dans les propriétés d’exception supplémentaires (RequestInformation.ExtendedErrorInformation), trouvé la raison:

    ErrorCode: PropertyValueTooLarge ErrorMessage: La valeur de la propriété dépasse la taille maximale autorisée (64 Ko). Si la valeur de la propriété est une chaîne, celle-ci est codée en UTF-16 et le nombre maximal de caractères doit être inférieur ou égal à 32 Ko.

    dans mon cas: le nom du conteneur était en majuscule. il y a des limitations lors de l’utilisation des caractères. entrer la description de l'image ici

    Eh bien, dans mon cas, j’essayais de faire ça:

     CloudBlobContainer container = blobClient.GetContainerReference("SessionMaterials"); await container.CreateIfNotExistsAsync(); 

    à cause de ContainerName SessionMaterials (en tant SessionMaterials habituelle dans Pascal Case et Camel Case: D), il provoquait 400 requêtes incorrectes. Donc, je dois juste faire des sessionmaterials . et ça a fonctionné.

    J’espère que cela aide quelqu’un.

    PS: – Il suffit de vérifier la réponse http exception ou d’utiliser le violoniste pour capturer la demande et la réponse.

    Parfois, c’est parce que votre partitionKey ou rowKey est NULL

    (c’était le cas pour moi)

    Une documentation de MS sur tous les codes d’erreur du service de table est disponible ici

    J’ai eu la même erreur BadRequest (400), à la fin, je remplis manuellement:

    entrer la description de l'image ici

    Et a travaillé pour moi. J’espère que cela t’aides!

    J’ai également fait face au même genre de problème. Dans mon cas, la valeur PartitionKey n’était pas définie. Par conséquent, la valeur PartitionKey était par défaut nulle, ce qui entraînait que la Object reference not set to an instance of an object. exception

    Vérifiez si vous fournissez les valeurs appropriées pour PartitionKey ou RowKey, vous pouvez rencontrer un tel problème.

    J’ai réparé mes valises et ça a bien marché

    Mes cas:

    1. La clé de ligne n’est pas au format correct (400).
    2. La combinaison de partitionkey et rowkey n’est pas unique (409).

    Je recevais une demande 400 erronée car 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 recréé comme GRS et maintenant cela fonctionne bien.

    Je recevais une requête (400) incorrecte, un message d’état: une demande incorrecte, un code d’erreur: OutOfRangeInput lorsque l’entité avait une propriété DateTime non définie (= DateTime.MinValue)

    Dans mon cas: j’ai inclus les métadonnées blob avec un nom de tag 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 devaient être conformes aux conventions d’identifiant C #.

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

    Underscore fonctionne bien.