Diagnostika a řešení potíží s výjimkami, které se nenašly ve službě Azure Cosmos DB
PLATÍ PRO: NoSQL
Stavový kód HTTP 404 značí, že prostředek již neexistuje.
Očekávané chování
Existuje mnoho platných scénářů, kdy aplikace očekává kód 404 a správně zpracuje scénář.
Nebyla nalezena výjimka vrácená pro položku, která by měla existovat nebo existuje.
Tady jsou možné důvody, proč se má vrátit stavový kód 404, pokud by položka měla existovat nebo existuje.
Relace čtení není pro vstupní token relace k dispozici
Řešení:
- Aktualizujte aktuální sadu SDK na nejnovější dostupnou verzi. Nejběžnější příčiny této konkrétní chyby byly opraveny v nejnovějších verzích sady SDK.
Konflikt časování
Existuje několik klientských instancí sady SDK a čtení proběhlo před zápisem.
Řešení:
- Výchozí konzistencí účtu pro službu Azure Cosmos DB je konzistence relací. Při vytvoření nebo aktualizaci položky vrátí odpověď token relace, který se dá předat mezi instancemi sady SDK, aby se zajistilo, že požadavek na čtení čte z repliky s danou změnou.
- Změňte úroveň konzistence na silnější úroveň.
Čtení propustnosti kontejneru nebo databázového prostředku
Pomocí PowerShellu nebo Azure CLI se zobrazí chybová zpráva, která se nenašla .
Řešení:
Propustnost je možné zřídit na úrovni databáze, na úrovni kontejneru nebo na obou. Pokud se zobrazí chyba nenalezena , zkuste číst propustnost nadřazeného prostředku databáze nebo podřízeného prostředku kontejneru.
Neplatná kombinace klíče oddílu a ID
Kombinace klíče oddílu a ID není platná.
Řešení:
Opravte logiku aplikace, která způsobuje nesprávnou kombinaci.
Neplatný znak v ID položky
Položka se vloží do služby Azure Cosmos DB s neplatným znakem v ID položky.
Řešení:
Změňte ID na jinou hodnotu, která neobsahuje speciální znaky. Pokud změna ID není možnost, můžete ID zakódovat do base64 tak, aby unikly speciální znaky. Base64 může přesto vytvořit název s neplatným znakem /, který je potřeba nahradit.
Položky, které jsou již vloženy do kontejneru pro ID, lze nahradit použitím hodnot RID místo odkazů založených na názvu.
// 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())); ;
}
}
Vyprázdnění time to Live
Položka měla nastavenou vlastnost Time to Live (TTL ). Položka byla vyprázdněna, protože vypršela platnost vlastnosti TTL.
Řešení:
Změňte vlastnost TTL, aby se zabránilo vymazání položky.
Opožděné indexování
Opožděné indexování se nezachytilo.
Řešení:
Počkejte, až se indexování zachytí nebo změní zásady indexování.
Odstraněný nadřazený prostředek
Databáze nebo kontejner, ve které položka existuje, byla odstraněna.
Řešení:
- Proveďte obnovení ze zálohy nadřazeného prostředku nebo znovu vytvořte prostředky.
- Vytvořte nový prostředek, který nahradí odstraněný prostředek.
7. V názvech kontejnerů nebo kolekcí se rozlišují malá a velká písmena.
V Azure Cosmos DB se rozlišují malá a velká písmena v názvech kontejnerů nebo kolekcí.
Řešení:
Při připojování ke službě Azure Cosmos DB nezapomeňte použít přesný název.
Další kroky
- Diagnostika a řešení potíží při použití sady .NET SDK služby Azure Cosmos DB
- Přečtěte si informace o pokynech k výkonu pro .NET v3 a .NET v2.
- Diagnostika a řešení potíží při používání sady Azure Cosmos DB Java SDK v4
- Přečtěte si o pokynech k výkonu sady Java SDK v4.