Condividi tramite


Diagnosticare e risolvere i problemi relativi alle eccezioni Non trovato di Azure Cosmos DB

SI APPLICA A: NoSQL

Il codice di stato HTTP 404 indica che la risorsa non esiste più.

Comportamento previsto

Esistono molti scenari validi in cui un'applicazione prevede un codice 404 e gestisce correttamente lo scenario.

È stata restituita un'eccezione Non trovato per un elemento che deve esistere o esiste

Ecco i possibili motivi per cui viene restituito un codice di stato 404 se l'elemento deve esistere o esiste.

La sessione di lettura non è disponibile per il token di sessione di input

Soluzione:

  1. Aggiornare l'SDK corrente alla versione più recente disponibile. Le cause più comuni per questo particolare errore sono state corrette nelle versioni più recenti dell'SDK.

Race condition

Sono presenti più istanze del client SDK e la lettura è avvenuta prima della scrittura.

Soluzione:

  1. La coerenza dell'account predefinita per Azure Cosmos DB è la coerenza della sessione. Quando un elemento viene creato o aggiornato, la risposta restituisce un token di sessione che può essere passato tra istanze dell'SDK per garantire che la richiesta di lettura stia leggendo da una replica con tale modifica.
  2. Modificare il livello di coerenza in un livello più forte.

Lettura della velocità effettiva per un contenitore o una risorsa di database

Uso di PowerShell o dell'interfaccia della riga di comando di Azure e ricezione di messaggi di errore Non trovato.

Soluzione:

È possibile effettuare il provisioning della velocità effettiva a livello di database, a livello di contenitore o entrambi. Se viene visualizzato un errore Non trovato, provare a leggere la velocità effettiva della risorsa del database padre o della risorsa contenitore figlio.

Combinazione chiave di partizione e ID non valida

La combinazione di chiave di partizione e ID non è valida.

Soluzione:

Correggere la logica dell'applicazione che causa la combinazione errata.

Carattere non valido nell'ID elemento

Un elemento viene inserito in Azure Cosmos DB con un carattere non valido nell'ID elemento.

Soluzione:

Modificare l'ID in un valore diverso che non contiene i caratteri speciali. Se la modifica dell'ID non è un'opzione, è possibile codificare in Base64 l'ID per eseguire l'escape dei caratteri speciali. Base64 potrebbe comunque produrre un nome con un carattere non valido "/" che deve essere sostituito.

Gli elementi già inseriti nel contenitore per l'ID possono essere sostituiti usando valori RID anziché riferimenti basati sul nome.

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

Rimozione della durata (TTL)

L'elemento ha impostato la proprietà TTL. L'elemento è stato eliminato perché la proprietà TTL è scaduta.

Soluzione:

Modificare la proprietà TTL per impedire che l'elemento venga eliminato.

Indicizzazione differita

L'indicizzazione differita non è rimasta al passo.

Soluzione:

Attendere che l'indicizzazione venga recuperata o modificata dai criteri di indicizzazione.

Risorsa padre eliminata

Il database o il contenitore in cui è presente l'elemento è stato eliminato.

Soluzione:

  1. Ripristinare da un backup la risorsa padre o ricreare le risorse.
  2. Creare una nuova risorsa per sostituire quella eliminata.

7. I nomi dei contenitori/raccolte fanno distinzione tra maiuscole e minuscole

I nomi dei contenitori/raccolte fanno distinzione tra maiuscole e minuscole in Azure Cosmos DB.

Soluzione:

Assicurarsi di usare il nome esatto durante la connessione ad Azure Cosmos DB.

Passaggi successivi