Share via


Diagnostisera och felsöka undantag som inte hittades i Azure Cosmos DB

GÄLLER FÖR: NoSQL

HTTP-statuskoden 404 anger att resursen inte längre finns.

Förväntat beteende

Det finns många giltiga scenarier där ett program förväntar sig en kod 404 och hanterar scenariot korrekt.

Ett undantag som inte hittades returnerades för ett objekt som ska finnas eller som finns

Här är de möjliga orsakerna till att statuskoden 404 returneras om objektet ska finnas eller finns.

Läsningssessionen är inte tillgänglig för inmatningssessionens token

Lösning:

  1. Uppdatera din aktuella SDK till den senaste tillgängliga versionen. De vanligaste orsakerna till det här felet har åtgärdats i de senaste SDK-versionerna.

Konkurrenstillstånd

Det finns flera SDK-klientinstanser och läsningen skedde före skrivning.

Lösning:

  1. Standardkontokonsekvensen för Azure Cosmos DB är sessionskonsekvens. När ett objekt skapas eller uppdateras returnerar svaret en sessionstoken som kan skickas mellan SDK-instanser för att garantera att läsbegäran läser från en replik med den ändringen.
  2. Ändra konsekvensnivån till en starkare nivå.

Läsa dataflöde för en container eller databasresurs

Använd PowerShell eller Azure CLI och få felmeddelandet hittades inte .

Lösning:

Dataflödet kan etableras på databasnivå, containernivå eller båda. Om det inte gick att hitta ett fel kan du prova att läsa dataflödet för den överordnade databasresursen eller den underordnade containerresursen.

Ogiltig kombination av partitionsnyckel och ID

Partitionsnyckeln och ID-kombinationen är inte giltiga.

Lösning:

Åtgärda den programlogik som orsakar den felaktiga kombinationen.

Ogiltigt tecken i ett objekt-ID

Ett objekt infogas i Azure Cosmos DB med ett ogiltigt tecken i objekt-ID:t.

Lösning:

Ändra ID:t till ett annat värde som inte innehåller specialtecken. Om det inte är ett alternativ att ändra ID:t kan du Base64 koda ID:t för att undvika specialtecken. Base64 kan fortfarande skapa ett namn med ett ogiltigt tecken "/" som måste ersättas.

Objekt som redan har infogats i containern för ID:t kan ersättas med HJÄLP av RID-värden i stället för namnbaserade referenser.

// 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-rensning

Objektet hade egenskapen Time to Live (TTL) inställd. Objektet rensades eftersom TTL-egenskapen har upphört att gälla.

Lösning:

Ändra TTL-egenskapen för att förhindra att objektet rensas.

Lat indexering

Den lata indexeringen har inte kommit ikapp.

Lösning:

Vänta tills indexeringen kommer ikapp eller ändrar indexeringsprincipen.

Överordnad resurs har tagits bort

Databasen eller containern som objektet finns i togs bort.

Lösning:

  1. Återställ från en säkerhetskopia av den överordnade resursen eller återskapa resurserna.
  2. Skapa en ny resurs som ersätter den borttagna resursen.

7. Container-/samlingsnamn är skiftlägeskänsliga

Container-/samlingsnamn är skiftlägeskänsliga i Azure Cosmos DB.

Lösning:

Se till att använda det exakta namnet när du ansluter till Azure Cosmos DB.

Nästa steg