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:
- 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:
- 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.
- 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:
- Ripristinare da un backup la risorsa padre o ricreare le risorse.
- 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
- Diagnosticare e risolvere i problemi che si verificano durante l'uso di .NET SDK per Azure Cosmos DB.
- Informazioni sulle linee guida sulle prestazioni per .NET v3 e .NET v2.
- Diagnosticare e risolvere i problemi che si verificano durante l'uso di Java v4 SDK per Azure Cosmos DB.
- Informazioni sulle linee guida sulle prestazioni per Java v4 SDK.