Diagnostika výjimek nenalezena ve službě Azure Cosmos DB a řešení souvisejících potíží

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ář.

Pro položku, která by měla existovat nebo existuje, se vrátila výjimka nenalezena.

Tady jsou možné důvody pro vrácení stavového kódu 404, pokud by položka měla existovat nebo existuje.

Relace čtení není pro vstupní token relace k dispozici

Řešení:

  1. 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 instancí klienta sady SDK a ke čtení došlo před zápisem.

Řešení:

  1. Výchozí konzistencí účtů pro službu Azure Cosmos DB je konzistence relací. Když je položka vytvořena nebo aktualizována, odpověď vrátí token relace, který je možné předat mezi instancemi sady SDK, aby se zajistilo, že se požadavek na čtení čte z repliky s danou změnou.
  2. Změňte úroveň konzistence na silnější úroveň.

Propustnost čtení pro kontejner nebo prostředek databáze

Pomocí PowerShellu nebo Azure CLI se zobrazí chybová zpráva Nenalezena .

Řešení:

Propustnost je možné zřídit na úrovni databáze, kontejneru nebo obojího. Pokud se zobrazí chyba Nenalezena , zkuste přečíst propustnost prostředku nadřazené 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

Do služby Azure Cosmos DB se vloží položka 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žná, můžete ID zakódovat do kódování 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é už jsou v kontejneru pro ID vložené, je možné nahradit pomocí hodnot RID místo odkazů na základě názvů.

// 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í funkce TTL (Time to Live)

Položka měla nastavenou vlastnost TTL (Time to Live). Položka byla vyprázdněna, protože vypršela platnost vlastnosti TTL.

Řešení:

Změňte vlastnost TTL tak, aby se zabránilo vymazání položky.

Opožděné indexování

Opožděné indexování se nedohonilo.

Řešení:

Počkejte, až indexování dožene nebo změní zásady indexování.

Nadřazený prostředek se odstranil

Databáze nebo kontejner, ve které položka existuje, byly odstraněny.

Řešení:

  1. Obnovte nadřazený prostředek ze zálohy nebo je znovu vytvořte.
  2. 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.

V názvech kontejnerů nebo kolekcí se ve službě Azure Cosmos DB rozlišují velká a malá písmena.

Řešení:

Při připojování ke službě Azure Cosmos DB nezapomeňte použít přesný název.

Další kroky