Delen via


Azure Cosmos DB-uitzonderingen vaststellen en oplossen

VAN TOEPASSING OP: NoSQL

De HTTP-statuscode 404 geeft aan dat de resource niet meer bestaat.

Verwacht gedrag

Er zijn veel geldige scenario's waarbij een toepassing een code 404 verwacht en het scenario correct verwerkt.

Er is een niet-gevonden uitzondering geretourneerd voor een item dat moet bestaan of bestaat

Hier volgen de mogelijke redenen waarom een statuscode 404 moet worden geretourneerd als het item moet bestaan of bestaat.

De leessessie is niet beschikbaar voor het token voor de invoersessie

Oplossing:

  1. Werk uw huidige SDK bij naar de nieuwste versie die beschikbaar is. De meest voorkomende oorzaken voor deze specifieke fout zijn opgelost in de nieuwste SDK-versies.

Racevoorwaarde

Er zijn meerdere SDK-clientexemplaren en de leesbewerking is vóór de schrijfbewerking uitgevoerd.

Oplossing:

  1. De standaardaccountconsistentie voor Azure Cosmos DB is sessieconsistentie. Wanneer een item wordt gemaakt of bijgewerkt, retourneert het antwoord een sessietoken dat kan worden doorgegeven tussen SDK-exemplaren om te garanderen dat de leesaanvraag wordt gelezen vanuit een replica met die wijziging.
  2. Wijzig het consistentieniveau in een sterker niveau.

Doorvoer lezen voor een container- of databaseresource

Het gebruik van PowerShell of Azure CLI en het foutbericht wordt niet gevonden .

Oplossing:

Doorvoer kan worden ingericht op databaseniveau, containerniveau of beide. Als er een fout niet is gevonden , leest u de doorvoer van de bovenliggende databaseresource of de onderliggende containerresource.

Ongeldige partitiesleutel en id-combinatie

De combinatie van partitiesleutel en id is niet geldig.

Oplossing:

Los de toepassingslogica op die de onjuiste combinatie veroorzaakt.

Ongeldig teken in een item-id

Een item wordt ingevoegd in Azure Cosmos DB met een ongeldig teken in de item-id.

Oplossing:

Wijzig de id in een andere waarde die geen speciale tekens bevat. Als het wijzigen van de id geen optie is, kunt u base64 de id coderen om aan de speciale tekens te ontsnappen. Base64 kan nog steeds een naam produceren met een ongeldig teken '/' dat moet worden vervangen.

Items die al in de container voor de id zijn ingevoegd, kunnen worden vervangen door RID-waarden te gebruiken in plaats van verwijzingen op basis van namen.

// 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())); ;
    }
}

Time to Live leegmaken

Voor het item is de eigenschap Time to Live (TTL) ingesteld. Het item is leeggemaakt omdat de TTL-eigenschap is verlopen.

Oplossing:

Wijzig de TTL-eigenschap om te voorkomen dat het item wordt opgeschoond.

Luie indexering

De luie indexering is niet opgepikt.

Oplossing:

Wacht totdat de indexering het indexeringsbeleid heeft ingehaald of gewijzigd.

Bovenliggende resource verwijderd

De database of container waarin het item bestaat, is verwijderd.

Oplossing:

  1. Herstel vanuit een back-up van de bovenliggende resource of maak de resources opnieuw.
  2. Maak een nieuwe resource om de verwijderde resource te vervangen.

7. Namen van containers/verzamelingen zijn hoofdlettergevoelig

Namen van containers/verzamelingen zijn hoofdlettergevoelig in Azure Cosmos DB.

Oplossing:

Zorg ervoor dat u de exacte naam gebruikt tijdens het maken van verbinding met Azure Cosmos DB.

Volgende stappen