Compartir a través de


Diagnóstico y solución de problemas de excepciones recurso de Azure Cosmos DB no encontrado

SE APLICA A: NoSQL

El código de estado HTTP 404 representa que el recurso ya no existe.

Comportamiento esperado

Hay muchos escenarios válidos en los que una aplicación espera un código 404 y administra correctamente el escenario.

Se ha devuelto la excepción de recurso no encontrado para un elemento que existe o debería existir

A continuación se ofrecen las posibles razones para que se devuelva un código de estado 404 cuando el elemento existe o debería existir.

La sesión de lectura no está disponible para el token de sesión de entrada.

Solución:

  1. Actualice el SDK actual a la versión más reciente disponible. Las causas más comunes de este error concreto se han corregido en las versiones más recientes del SDK.

Condición de carrera

Hay varias instancias de cliente de SDK y la lectura se produjo antes de la escritura.

Solución:

  1. La coherencia de la cuenta predeterminada para Azure Cosmos DB es la coherencia de la sesión. Cuando se crea o se actualiza un elemento, la respuesta devolverá un token de sesión que se puede pasar de una instancia de SDK a otra para garantizar que la solicitud de lectura lea desde una réplica que tiene ese cambio.
  2. Cambie el nivel de coherencia a un nivel más seguro.

Lectura del rendimiento de un contenedor o recurso de base de datos

Uso de PowerShell o la CLI de Azure y recepción de un mensaje de error no encontrado.

Solución:

El rendimiento se puede aprovisionar en el nivel de base de datos, en el nivel de contenedor o en ambos. Si recibe un error no encontrado, intente leer el rendimiento del recurso de base de datos principal o el recurso de contenedor secundario.

Combinación no válida de clave de partición e identificador

La combinación de la clave de partición y el identificador no es válida.

Solución:

Corrija la lógica de aplicación que provoca la combinación incorrecta.

Carácter no válido en un identificador de elemento

Se ha insertado un elemento en Cosmos DB con un carácter no válido en el identificador de elemento.

Solución:

Cambie el identificador a un valor que no contenga el carácter especial. Si cambiar de identificador no es una alternativa, puede codificar el identificador en Base64 para omitir los caracteres especiales. Base64 aún puede producir un nombre con un carácter '/' no válido que es necesario reemplazar.

Los elementos ya insertados en el contenedor para el identificador se pueden reemplazar con valores RID en lugar de referencias basadas en nombres.

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

Purga de la propiedad Período de vida

El elemento tenía definida la propiedad Período de vida (TTL). El elemento se purgó porque la propiedad TTL expiró.

Solución:

Cambie la propiedad TTL para evitar que el elemento se purgue.

Indexación diferida

La indexación diferida no se ha actualizado.

Solución:

Espere a que la indexación se actualice o cambie la directiva de indexación.

Recurso primario eliminado

Se eliminó la base de datos o el contenedor donde se encuentra el elemento.

Solución:

  1. Restaurar desde una copia de seguridad el recurso primario o volver a crear los recursos.
  2. Cree un nuevo recurso para reemplazar el recurso eliminado.

7. Los nombres de contenedor o colección distinguen en mayúsculas y minúsculas

En Azure Cosmos DB, los nombres de contenedor o colección distinguen mayúsculas de minúsculas.

Solución:

Asegúrese de usar el nombre exacto mientras se conecta a Cosmos DB.

Pasos siguientes