Partager via


Diagnostiquer et résoudre les problèmes liés à des exceptions introuvables Azure Cosmos DB

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 :

  1. 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 :

  1. 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.
  2. Affectez au niveau de cohérence un niveau plus fort.

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.

Indexation différée

L’indexation différée n’est pas à jour.

Solution :

Attendez que l’indexation soit à jour ou modifiez la stratégie d’indexation.

Ressource parente supprimée

La base de données ou le conteneur dans lequel se trouve l’élément a été supprimé.

Solution :

  1. Restaurez depuis une sauvegarde la ressource parente ou recréez les ressources.
  2. Créez une ressource pour remplacer la ressource supprimée.

7. Les noms de conteneur/collection sont sensibles à la casse

Les noms de conteneur/collection respectent la casse dans Azure Cosmos DB.

Solution :

Veillez à utiliser le nom exact lors de la connexion à Azure Cosmos DB.

Étapes suivantes