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:
- 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:
- 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.
- 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:
- Restaurar desde una copia de seguridad el recurso primario o volver a crear los recursos.
- 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
- Diagnóstico y solución de problemas al utilizar el SDK de Azure Cosmos DB para .NET.
- Más información sobre las directrices de rendimiento de .NET v3 y .NET v2.
- Diagnóstico y solución de problemas al utilizar el SDK de Azure Cosmos DB para Java v4.
- Obtenga información sobre las instrucciones de rendimiento del SDK para Java v4.