Sdílet prostřednictvím


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í:

  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 klientských instancí sady SDK a čtení proběhlo před zápisem.

Řešení:

  1. 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.
  2. 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í:

  1. Proveďte obnovení ze zálohy nadřazeného prostředku nebo znovu vytvořte prostředky.
  2. 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