J'ai exécuté cela en mode débogage et j'attache une image avec les détails de l'exception. Comment puis-je savoir ce qui ne va pas? 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 ma machine. Les tables ont été créées, mais j'obtiens cette erreur lors de l'insertion de données
// 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);
}
}
Réponses:
400 Une erreur signifie qu'il y a un problème avec la valeur de l'une de vos propriétés. Une façon de le savoir est de suivre la demande / réponse via Fiddler et de voir les données réelles envoyées au stockage Windows Azure.
Prenant une supposition sauvage, je suppose en jetant un coup d'œil rapide à votre code que dans votre modèle vous avez des propriétés de type Date / Heure (OfflineTimestamp, OnlineTimestamp) et j'ai observé que dans certains scénarios, l'un d'entre eux est initialisé avec la valeur par défaut qui est " DateTime.MinValue ". Veuillez noter que la valeur minimale autorisée pour un attribut de type Date / Heure est le 1er janvier 1601 (UTC) dans Windows Azure [http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx] . Veuillez voir si ce n'est pas le cas. Si tel est le cas, vous pouvez créer des champs de type nullable afin qu'ils ne soient pas remplis avec les valeurs par défaut.
Jetez également un œil à la réponse de Juha Palomäki ci-dessous ... il y a parfois un message légèrement plus utile dans l'exception où il suggère (RequestInformation.ExtendedErrorInformation.ErrorMessage)
la source
Le StorageException contient également des informations un peu plus détaillées sur l'erreur.
Archiver le débogueur: StorageException.RequestInformation.ExtendedInformation
la source
The specifed resource name contains invalid characters.
le nom de ma table contenait des tirets ... tout comme mes noms de file d'attente ... soupir. Espérons que la recherche ramènera cela pour plus de gens! voir: stackoverflow.com/questions/45305556/…Dans mon cas, c'était une barre oblique dans le RowKey .
J'ai également reçu un «OutOfRangeInput - L'une des entrées de demande est hors de portée. erreur lors de la tentative d'ajout manuel via l'émulateur de stockage.
http://msdn.microsoft.com/en-us/library/dd179338.aspx
J'ai écrit une méthode d'extension pour gérer cela pour moi.
la source
J'ai rencontré le même problème mais la raison dans mon cas était due à la taille. Après avoir fouillé dans les propriétés d'exception supplémentaires (RequestInformation.ExtendedErrorInformation), j'ai 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, elle est encodée en UTF-16 et le nombre maximal de caractères doit être de 32 Ko ou moins.
la source
Eh bien, dans mon cas, j'essayais de faire ceci:
à cause de ContainerName
SessionMaterials
(comme une habitude d'écrire dans Pascal Case et Camel Case: D), cela provoquait 400 mauvaises requêtes. Alors, je dois juste y arriversessionmaterials
. et cela a fonctionné.J'espère que cela aide quelqu'un.
PS: - Vérifiez simplement la réponse http d'exception ou utilisez un fiddler pour capturer la demande et la réponse.
la source
dans mon cas: le nom du conteneur était en majuscule. il y a des limitations lors de l'utilisation de caractères.
la source
Parfois, c'est parce que votre
partitionKey
ourowKey
estNULL
(c'était le cas pour moi)
la source
Une documentation de MS sur tous les codes d'erreur de service de table peut être trouvée ici
la source
J'ai eu la même erreur BadRequest (400), à la fin, je remplis manuellement:
Et a travaillé pour moi. J'espère que cela t'aides!
la source
Timestamp
doit être généré manuellement. C'est vraiment agaçant.J'ai également fait face au même genre de problème. Dans mon cas, la valeur PartitionKey n'a pas été définie, donc par défaut, la valeur PartitionKey était nulle, ce qui a entraîné une
Object reference not set to an instance of an object.
exceptionVérifiez si vous fournissez les valeurs appropriées pour PartitionKey ou RowKey, vous pouvez être confronté à un tel problème.
la source
J'ai réparé mes affaires et ça a bien fonctionné
Mes cas:
la source
Je recevais une 400 Bad Request 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éé en tant que GRS et maintenant cela fonctionne très bien.
la source
Je recevais une (400) mauvaise demande, StatusMessage: Bad Request, ErrorCode: OutOfRangeInput lorsque l'entité avait une propriété DateTime non définie (= DateTime.MinValue)
la source
Dans mon cas: j'ai inclus des métadonnées blob avec un nom de balise contenant un trait d'union.
Le tiret
"added-by"
était le problème, et plus tard RTFM m'a dit que les noms de balises doivent être conformes aux conventions d'identificateur C #.Réf: https://docs.microsoft.com/en-us/azure/storage/blobs/storage-properties-metadata
Le soulignement fonctionne très bien.
la source
Dans mon cas, je ne devrais pas ajouter PartitionKey et Rowkey dans ma classe d'entité. Cela devrait provenir de la classe de base. Ci-dessous fonctionnerait simplement.
la source
Si vous utilisez NodeJS et que vous êtes tombé sur ce post, seulement pour constater 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 ne mentionne ici COMMENT utiliser un proxy.
Le moyen le plus simple avec NodeJS est de définir deux variables d'environnement:
Si vous utilisez réellement C #, comme le fait l'auteur de cet article; vous pouvez simplement installer Fiddler et le configurer pour intercepter. Par défaut, il doit intercepter les requêtes. Vous devrez peut-être également faire confiance au certificat de Fiddler ou faire l'équivalent de "NODE_TLS_REJECT_UNAUTHORIZED = 0" de Node.
la source
J'ai reçu une réponse 400-BadRequest de l'API Azure Storage Account Table. Les informations d'exception ont montré que "Le compte auquel vous accédez ne prend pas en charge http.". J'ai pensé que nous devions utiliser https dans la chaîne de connexion lorsque "Transfert sécurisé requis" est activé dans la configuration du compte de stockage, comme indiqué dans l'image ci-dessous.
la source
Dans mon cas pour créer une nouvelle installation de la classe "TableBotDataStore" (framework de bot MS), nous transmettons le paramètre "tableName" avec un trait d'union comme "master-bot" et TableBotDataStore ne peut avoir des noms de table qu'avec des lettres et des chiffres uniquement
la source
J'ai eu le même problème, la fonction passait la
containerNameKey
chaîne as. ci-dessous est le code qui a donné une erreurJe l'ai changé en
Ça a marché
la source