Compartilhar via


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

APLICA-SE A: NoSQL

O código de status HTTP 404 representa que o recurso não existe mais.

Comportamento esperado

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

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

Aqui estão os possíveis motivos para um código de status 404 ser retornado se o item deveria existir ou existir.

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 de corrida

Há várias instâncias de cliente do SDK e a leitura ocorreu 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. Altere o nível de consistência para um nível mais forte.

Leitura da taxa de transferência de um contêiner ou recurso de banco de dados

Usando o PowerShell ou CLI do Azure e receber uma mensagem de erro não encontrado.

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 você receber um erro não encontrado, tente ler a taxa de transferência do recurso de banco de dados pai ou o recurso de contêiner filho.

Combinação inválida de chave de partição e ID

A chave de partição e a combinação de IDs não são válidas.

Solução:

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

Caractere inválido em uma ID de item

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

Solução:

Altere a ID para um valor diferente que não contenha os caracteres especiais. Se a alteração da ID não for uma opção, você poderá codificar a ID em Base64 para fazer o escape dos caracteres especiais. A 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://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())); ;
    }
}

Limpeza de vida útil

O item tinha a propriedade TTL (vida real) 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 lenta

A indexação lenta não foi capturada.

Solução:

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

Recurso pai excluído

O banco de dados ou contêiner em que 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óximas etapas