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

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

Řešení:

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

  1. Obnovte nadřazený prostředek nebo prostředky 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.

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