Diagnose und Troubleshooting für die Ausnahme „Nicht gefunden“ in Azure Cosmos DB
GILT FÜR: NoSQL
Der HTTP-Statuscode 404 steht dafür, dass die Ressource nicht mehr vorhanden ist.
Erwartetes Verhalten
Es gibt viele gültige Szenarien, in denen eine Anwendung eine 404-Meldung erwartet und das Szenario ordnungsgemäß verarbeitet.
Eine Ausnahme „Nicht gefunden“ wurde für ein Element zurückgegeben, das vorhanden sein sollte oder vorhanden ist.
Im Folgenden sind mögliche Ursachen für das Zurückgeben des Statuscodes 404 in Fällen aufgeführt, in denen das betreffende Element vorhanden sein sollte oder vorhanden ist.
Die Lesesitzung für das eingegebene Sitzungstoken ist nicht verfügbar
Lösung:
- Aktualisieren Sie Ihr aktuelles SDK auf die neueste verfügbare Version. Die häufigsten Ursachen für diesen speziellen Fehler wurden in den neuesten SDK-Versionen behoben.
Racebedingung
Es sind mehrere SDK-Clientinstanzen vorhanden, und der Lesevorgang ist vor dem Schreibvorgang erfolgt.
Lösung:
- Die standardmäßig für Azure Cosmos DB festgelegte Kontokonsistenz ist die Sitzungskonsistenz. Wenn ein Element erstellt oder aktualisiert wird, wird bei der Antwort ein Sitzungstoken zurückgegeben, das zwischen den SDK-Instanzen weitergegeben werden kann. Damit wird sichergestellt, dass bei der Leseanforderung aus einem Replikat mit dieser Änderung gelesen wird.
- Ändern Sie die Konsistenzebene in eine höhere Ebene.
Lesen des Durchsatzes für einen Container oder eine Datenbankressource
Bei der Verwendung von PowerShell oder der Azure CLI erhalten Sie die Fehlermeldung Nicht gefunden.
Projektmappe:
Der Durchsatz kann auf Datenbankebene, Containerebene oder beidem bereitgestellt werden. Versuchen Sie bei der Anzeige des Fehlers Nicht gefunden, den Durchsatz der übergeordneten Datenbankressource oder der untergeordneten Containerressource zu lesen.
Ungültige Kombination aus Partitionsschlüssel und ID
Die Kombination aus Partitionsschlüssel und ID ist ungültig.
Lösung:
Korrigieren Sie die Anwendungslogik, die die falsche Kombination verursacht.
Ungültiges Zeichen in einer Element-ID
Ein Element mit einem ungültigen Zeichen in der Element-ID wird in Azure Cosmos DB eingefügt.
Lösung:
Ändern Sie die ID in einen anderen Wert, der keine Sonderzeichen enthält. Wenn das Ändern der ID nicht möglich ist, können Sie die ID mit Base64 codieren, um keine Sonderzeichen zu verwenden. Base64 kann weiterhin einen Namen mit dem ungültigen Zeichen „ / “ ausgeben, das ersetzt werden muss.
Bei Elementen, die bereits in den Container eingefügt wurden, kann die ID ersetzt werden, indem RID-Werte anstelle von namensbasierten Verweisen verwendet werden.
// 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://zcusa.951200.xyz/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())); ;
}
}
Bereinigung nach Ablauf der Gültigkeitsdauer
Für das Element wurde die Eigenschaft Gültigkeitsdauer (TTL) festgelegt. Das Element wurde bereinigt, da die Gültigkeitsdauer abgelaufen war.
Lösung:
Ändern Sie die Eigenschaft für die Gültigkeitsdauer, um zu verhindern, dass das Element bereinigt wird.
Verzögerte Indizierung
Die verzögerte Indizierung ist noch nicht auf dem aktuellen Stand.
Lösung:
Warten Sie, bis die Indizierung auf den aktuellen Stand gebracht wurde, oder ändern Sie die Indizierungsrichtlinie.
Übergeordnete Ressource gelöscht
Die Datenbank oder der Container, in der bzw. dem sich das Element befindet, wurde gelöscht.
Lösung:
- Stellen Sie die übergeordnete Ressource aus einer Sicherungskopie wieder her oder erstellen Sie die Ressourcen neu.
- Erstellen Sie eine neue Ressource, um die gelöschte Ressource zu ersetzen.
7. Bei Container-/Sammlungsnamen wird zwischen Groß- und Kleinschreibung unterschieden
Bei Container-/Sammlungsnamen wird in Azure Cosmos DB zwischen Groß- und Kleinschreibung unterschieden.
Lösung:
Achten Sie darauf, beim Herstellen einer Verbindung mit Azure Cosmos DB den exakten Namen zu verwenden.
Nächste Schritte
- Diagnostizieren und Behandeln von Problemen bei Verwendung des .NET SDK für Azure Cosmos DB
- Weitere Informationen zu Leistungsrichtlinien für .NET Version 3 und .NET Version 2
- Diagnostizieren und Behandeln von Problemen bei Verwendung des Java v4 SDK für Azure Cosmos DB.
- Weitere Informationen zu Leistungsrichtlinien für das Java v4 SDK.