Udostępnij za pośrednictwem


Diagnozowanie i rozwiązywanie problemów z wyjątkami nie odnalezionych w usłudze Azure Cosmos DB

DOTYCZY: NoSQL

Kod stanu HTTP 404 oznacza, że zasób już nie istnieje.

Oczekiwane zachowanie

Istnieje wiele prawidłowych scenariuszy, w których aplikacja oczekuje kodu 404 i poprawnie obsługuje scenariusz.

Nie znaleziono wyjątku został zwrócony dla elementu, który powinien istnieć lub nie istnieje

Poniżej przedstawiono możliwe przyczyny zwrócenia kodu stanu 404, jeśli element powinien istnieć lub istnieje.

Sesja odczytu nie jest dostępna dla tokenu sesji wejściowej

Rozwiązanie 2.

  1. Zaktualizuj bieżący zestaw SDK do najnowszej dostępnej wersji. Najczęstsze przyczyny tego konkretnego błędu zostały naprawione w najnowszych wersjach zestawu SDK.

Sytuacja wyścigu

Istnieje wiele wystąpień klienta zestawu SDK i odczyt wystąpił przed zapisem.

Rozwiązanie 2.

  1. Domyślna spójność konta dla usługi Azure Cosmos DB to spójność sesji. Po utworzeniu lub zaktualizowaniu elementu odpowiedź zwraca token sesji, który można przekazać między wystąpieniami zestawu SDK, aby zagwarantować, że żądanie odczytu odczytuje z repliki z tej zmiany.
  2. Zmień poziom spójności na silniejszy poziom.

Odczytywanie przepływności dla zasobu kontenera lub bazy danych

Przy użyciu programu PowerShell lub interfejsu wiersza polecenia platformy Azure nie znaleziono komunikatu o błędzie.

Rozwiązanie 2.

Przepływność można aprowizować na poziomie bazy danych, na poziomie kontenera lub obu tych poziomach. Jeśli wystąpi błąd nie znaleziono , spróbuj odczytać przepływność nadrzędnego zasobu bazy danych lub zasobu kontenera podrzędnego.

Nieprawidłowa kombinacja klucza partycji i identyfikatora

Kombinacja klucza partycji i identyfikatora jest nieprawidłowa.

Rozwiązanie 2.

Napraw logikę aplikacji, która powoduje nieprawidłową kombinację.

Nieprawidłowy znak w identyfikatorze elementu

Element jest wstawiany do usługi Azure Cosmos DB z nieprawidłowym znakiem w identyfikatorze elementu.

Rozwiązanie 2.

Zmień identyfikator na inną wartość, która nie zawiera znaków specjalnych. Jeśli zmiana identyfikatora nie jest opcją, możesz zakodować identyfikator base64, aby uniknąć znaków specjalnych. Base64 nadal może utworzyć nazwę z nieprawidłowym znakiem "/", który należy zamienić.

Elementy już wstawione w kontenerze dla identyfikatora można zamienić przy użyciu wartości RID zamiast odwołań opartych na nazwach.

// 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())); ;
    }
}

Czas wygaśnięcia przeczyszczania

Element miał ustawioną właściwość Time to Live (TTL). Element został przeczyszczone, ponieważ właściwość TTL wygasła.

Rozwiązanie 2.

Zmień właściwość czasu wygaśnięcia, aby uniemożliwić przeczyszczanie elementu.

Indeksowanie z opóźnieniem

Indeksowanie leniwe nie dogoniło.

Rozwiązanie 2.

Poczekaj na nadrobienie zaległości lub zmianę zasad indeksowania.

Usunięto zasób nadrzędny

Baza danych lub kontener, w ramach którego istnieje element, został usunięty.

Rozwiązanie 2.

  1. Przywróć z kopii zapasowej zasób nadrzędny lub utwórz ponownie zasoby.
  2. Utwórz nowy zasób, aby zastąpić usunięty zasób.

7. W nazwach kontenerów/kolekcji uwzględniana jest wielkość liter

Nazwy kontenerów/kolekcji są uwzględniane w wielkości liter w usłudze Azure Cosmos DB.

Rozwiązanie 2.

Pamiętaj, aby używać dokładnej nazwy podczas nawiązywania połączenia z usługą Azure Cosmos DB.

Następne kroki