diagnostika a řešení potíží s Azure Cosmos DB nenalezenými výjimkami
platí pro: SQL API
Stavový kód HTTP 404 značí, že prostředek již neexistuje.
Očekávané chování
Existuje mnoho platných scénářů, kde aplikace očekává kód 404 a správně zpracovává scénář.
Pro položku, která by měla existovat nebo existovat, byla vrácena výjimka nenalezena.
Tady jsou možné důvody, proč se vrátí stavový kód 404, pokud by položka existovala nebo existovala.
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 více instancí klienta sady SDK a čtení proběhlo před zápisem.
Řešení:
- výchozí konzistencí účtu pro Azure Cosmos DB je konzistence relací. Při vytvoření nebo aktualizaci položky vrátí odpověď token relace, který lze předat mezi instancemi sady SDK, aby bylo zaručeno, že žádost o čtení je čtena z repliky s touto změnou.
- Změňte úroveň konzistence na silnější úroveň.
Čtení propustnosti pro kontejner nebo databázový prostředek
Pomocí PowerShellu nebo rozhraní příkazového řádku Azure CLI a chybové zprávy Receive Nenalezeno .
Řešení:
Propustnost lze zřizovat na úrovni databáze, kontejneru nebo obojím. Pokud se zobrazí chyba s informací o nenalezení , zkuste načíst propustnost nadřazeného prostředku databáze nebo podřízeného prostředku kontejneru.
Neplatný klíč oddílu a kombinace ID
Kombinace klíče oddílu a ID není platná.
Řešení:
Opravte aplikační logiku, která způsobila nesprávnou kombinaci.
Neplatný znak v ID položky
položka je vložena do 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 se změna ID nepoužívá, můžete kódování Base64 kódovat, aby se speciální znaky vyhnuly. Base64 může stále vytvořit název s neplatným znakem '/', který je nutné nahradit.
Položky, které jsou již vloženy do kontejneru pro ID, lze nahradit použitím hodnot identifikátorů 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://docs.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())); ;
}
}
Čas do živého vyprázdnění
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í:
Chcete-li zabránit mazání položky, změňte vlastnost TTL.
Opožděné indexování
Opožděné indexování se nezachycuje.
Řešení:
Počkejte, až indexování zachytí nebo změní zásady indexování.
Nadřazený prostředek smazán
Databáze nebo kontejner, ve kterém položka existuje, byla odstraněna.
Řešení:
- Obnovte nadřazený prostředek nebo prostředky znovu vytvořte.
- Vytvořte nový prostředek, který nahradí odstraněný prostředek.
7. v názvech kontejnerů nebo kolekcí se rozlišují velká a malá písmena.
u názvů kontejnerů nebo kolekcí se rozlišují velká a malá písmena v Cosmos DB.
Řešení:
nezapomeňte použít přesný název při připojování k Cosmos DB.
Další kroky
- diagnostikujte a řešte potíže při použití sady Azure Cosmos DB .net SDK.
- Seznamte se s pokyny k výkonu pro .NET V3 a .NET v2.
- diagnostikujte a řešte potíže při použití Azure Cosmos DB Java v4 SDK.
- Seznamte se s pokyny pro výkon pro Java v4 SDK.