Diagnóstico y solución de problemas de excepciones recurso de Azure Cosmos DB no encontrado
Artículo
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.
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.
c#
// Get a container reference that uses RID values.
ContainerProperties containerProperties = awaitthis.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 inawait 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.awaitthis.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.
Únase a la serie de reuniones para crear soluciones de inteligencia artificial escalables basadas en casos de uso reales con compañeros desarrolladores y expertos.
Aprenderemos a usar un amplio conjunto de códigos de respuesta REST devueltos por la solicitud de Azure Cosmos DB para ayudarle a analizar posibles problemas.
Obtenga información sobre cómo diagnosticar y corregir excepciones de solicitudes erróneas. Por ejemplo, cuando el contenido de entrada o la clave de partición no son válidos, la clave de partición no coincide en Azure Cosmos DB.
Obtenga información acerca del Explorador de datos de Azure Cosmos DB, una interfaz basada en web independiente que le permite ver y administrar los datos almacenados en Azure Cosmos DB.