Diagnosticar e solucionar problemas de exceções não encontradas do Azure Cosmos DB

APLICA-SE A: NoSQL

O código de estado HTTP 404 indica que o recurso já não existe.

Comportamento esperado

Há muitos cenários válidos em que um aplicativo espera um código 404 e manipula corretamente o cenário.

Uma exceção não encontrada foi retornada para um item que deveria existir ou existe

Aqui estão as possíveis razões para um código de status 404 ser devolvido se o item deve existir ou existe.

A sessão de leitura não está disponível para o token de sessão de entrada

Solução:

  1. Atualize seu SDK atual para a versão mais recente disponível. As causas mais comuns para esse erro específico foram corrigidas nas versões mais recentes do SDK.

Condição race

Há várias instâncias de cliente SDK e a leitura aconteceu antes da gravação.

Solução:

  1. A consistência de conta padrão para o Azure Cosmos DB é a consistência da sessão. Quando um item é criado ou atualizado, a resposta retorna um token de sessão que pode ser passado entre instâncias do SDK para garantir que a solicitação de leitura seja lida de uma réplica com essa alteração.
  2. Mude o nível de consistência para um nível mais forte.

Taxa de transferência de leitura para um contêiner ou recurso de banco de dados

Usando o PowerShell ou a CLI do Azure e receber a mensagem de erro não encontrada .

Solução:

A taxa de transferência pode ser provisionada no nível do banco de dados, no nível do contêiner ou em ambos. Se receber um erro não encontrado , tente ler a taxa de transferência do recurso de banco de dados pai ou do recurso de contêiner filho.

Chave de partição inválida e combinação de ID

A combinação de chave de partição e ID não é válida.

Solução:

Corrija a lógica do aplicativo que está causando a combinação incorreta.

Caractere inválido em um ID de item

Um item é inserido no Azure Cosmos DB com um caractere inválido na ID do item.

Solução:

Altere o ID para um valor diferente que não contenha os caracteres especiais. Se alterar o ID não for uma opção, você poderá codificar o ID para escapar dos caracteres especiais. Base64 ainda pode produzir um nome com um caractere inválido '/' que precisa ser substituído.

Os itens já inseridos no contêiner para a ID podem ser substituídos usando valores RID em vez de referências baseadas em nome.

// 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://video2.skills-academy.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())); ;
    }
}

Tempo de Viver a purga

O item tinha a propriedade Time to Live (TTL) definida. O item foi limpo porque a propriedade TTL expirou.

Solução:

Altere a propriedade TTL para impedir que o item seja limpo.

Indexação preguiçosa

A indexação preguiçosa não pegou.

Solução:

Aguarde até que a indexação recupere ou altere a política de indexação.

Recurso pai excluído

O banco de dados ou contêiner no qual o item existe foi excluído.

Solução:

  1. Restaure a partir de um backup o recurso pai ou recrie os recursos.
  2. Crie um novo recurso para substituir o recurso excluído.

7. Os nomes de contêiner/coleção diferenciam maiúsculas de minúsculas

Os nomes de contêiner/coleção diferenciam maiúsculas de minúsculas no Azure Cosmos DB.

Solução:

Certifique-se de usar o nome exato ao se conectar ao Azure Cosmos DB.

Próximos passos