Diagnostiquer et résoudre les problèmes liés à des exceptions introuvables Azure Cosmos DB
Article
S’APPLIQUE À : NoSQL
Le code d’état HTTP 404 indique que la ressource n’existe plus.
Comportement attendu
Il existe de nombreux scénarios valides où une application attend un code 404 et gère correctement le scénario.
Une exception introuvable a été retournée pour un élément qui doit exister ou existe
Voici les raisons possibles pour qu’un code d’état 404 soit retourné si l’élément doit exister ou existe.
The read session is not available for the input session token (La session de lecture n’est pas disponible pour le jeton de session d’entrée)
Solution :
Mettez à jour votre Kit de développement logiciel (SDK) actuel vers la dernière version disponible. Les causes les plus courantes de cette erreur particulière ont été corrigées dans les versions les plus récentes du SDK.
Condition de concurrence
Il existe plusieurs instances de client SDK et la lecture a eu lieu avant l’écriture.
Solution :
La cohérence de compte par défaut pour Azure Cosmos DB est la cohérence de session. Lorsqu’un élément est créé ou mis à jour, la réponse retourne un jeton de session qui peut être transmis entre les instances de SDK pour garantir que la demande de lecture lit à partir d’un réplica avec cette modification.
Lire le débit d'un conteneur ou d'une base de données
Utilisation de PowerShell ou d'Azure CLI, et réception d'un message d'erreur de type introuvable.
Solution :
Le débit peut être approvisionné au niveau de la base de données, du conteneur ou des deux. En cas d'erreur de type introuvable, essayez de lire le débit de la base de données parente ou du conteneur enfant.
Combinaison de la clé de partition et de l’ID non valide
La combinaison de la clé de partition et de l’ID n’est pas valide.
Solution :
Corrigez la logique d’application qui provoque la combinaison incorrecte.
Caractère non valide dans un ID d’élément
Un élément est inséré dans Azure Cosmos DB avec un caractère non valide dans l’ID d’élément.
Solution :
Remplacez l’ID par une valeur différente qui ne contient pas les caractères spéciaux. S’il n’est pas possible de modifier l’ID, vous pouvez l’encoder au format Base64 pour placer les caractères spéciaux dans une séquence d’échappement. Base64 peut toujours produire un nom avec un caractère non valide « / » qui doit être remplacé.
Pour les éléments déjà insérés dans le conteneur, l’ID peut être remplacé avec des valeurs RID plutôt que des références basées sur un nom.
// Get a container reference that uses RID values.
ContainerProperties containerProperties = await this.Container.ReadContainerAsync();
string[] selfLinkSegments = containerProperties.SelfLink.Split('/');
string databaseRid = selfLinkSegments[1];
string containerRid = selfLinkSegments[3];
Container containerByRid = this.cosmosClient.GetContainer(databaseRid, containerRid);
// Invalid characters are listed here.
// https://learn.microsoft.com/dotnet/api/microsoft.azure.documents.resource.id#remarks
FeedIterator<JObject> invalidItemsIterator = this.Container.GetItemQueryIterator<JObject>(
@"select * from t where CONTAINS(t.id, ""/"") or CONTAINS(t.id, ""#"") or CONTAINS(t.id, ""?"") or CONTAINS(t.id, ""\\"") ");
while (invalidItemsIterator.HasMoreResults)
{
foreach (JObject itemWithInvalidId in await invalidItemsIterator.ReadNextAsync())
{
// Choose a new ID that doesn't contain special characters.
// If that isn't possible, then Base64 encode the ID to escape the special characters.
byte[] plainTextBytes = Encoding.UTF8.GetBytes(itemWithInvalidId["id"].ToString());
itemWithInvalidId["id"] = Convert.ToBase64String(plainTextBytes).Replace('/', '!');
// Update the item with the new ID value by using the RID-based container reference.
JObject item = await containerByRid.ReplaceItemAsync<JObject>(
item: itemWithInvalidId,
ID: itemWithInvalidId["_rid"].ToString(),
partitionKey: new Cosmos.PartitionKey(itemWithInvalidId["status"].ToString()));
// Validating the new ID can be read by using the original name-based container reference.
await this.Container.ReadItemAsync<ToDoActivity>(
item["id"].ToString(),
new Cosmos.PartitionKey(item["status"].ToString())); ;
}
}
Suppression définitive de la durée de vie
La propriété Durée de vie a été définie pour l’élément. L’élément a été supprimé définitivement, car la propriété Durée de vie a expiré.
Solution :
Modifiez la propriété Durée de vie pour empêcher la suppression définitive de l’élément.
Nous apprendrons à utiliser un riche ensemble de codes de réponse REST renvoyés par la requête Azure Cosmos DB pour vous aider à analyser les problèmes potentiels.
Écrivez des requêtes efficaces, créez des stratégies d’indexation, gérez et approvisionnez des ressources dans l’API SQL et le Kit de développement logiciel (SDK) avec Microsoft Azure Cosmos DB.