Je construis une application .Net Console pour lire des informations dans un DocumentDB. L'application de la console contient des données provenant d'un EventHub et insère/met à jour des données récentes à mesure qu'elles arrivent dans le cloud.
J'essaie de lire un document unique à partir de DocumentDB et je peux confirmer que le document existe avant de demander le document.
if (DocumentDBRepository<DocumentDBItem>.DoesItemExist(name))
{
device = await DocumentDBRepository<DocumentDBItem>.GetItemAsync(name);
}
J'ai utilisé le didacticiel this de Microsoft sur la création d'un référentiel permettant d'accéder aux enregistrements DocumentDB, et j'ai réussi à utiliser presque toutes les méthodes. Je peux mettre à jour/supprimer/interroger la base de données mais je ne peux pas lire un élément unique.
D'abord, il lançait une exception demandant une PartitionKey. J'ai donc modifié la méthode pour ajouter à la requête la PartitionKey utilisée par la base de données. Dès que j'ai ajouté la PartitionKey, une autre exception est renvoyée avec le message "Ressource non trouvée".
public static async Task<T> GetItemAsync(string id)
{
try
{
RequestOptions options = new RequestOptions();
options.PartitionKey = new PartitionKey("DeviceId");
Document document = await client.ReadDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id), options);
return (T)(dynamic)document;
}
catch (DocumentClientException e)
{
if (e.StatusCode == HttpStatusCode.NotFound)
{
return null;
}
else
{
throw;
}
}
}
J'ai déjà modifié mes appels pour utiliser "GetItemsAsyc", obtenir un IEnumerable de documents et obtenir le premier élément de la liste, mais la raison pour laquelle je peux utiliser toutes les autres méthodes du didacticiel n'a pas de sens, mais cela continue pour lancer des exceptions disant "Ressource non trouvée".
Exception je reçois:
"Message: {\"Errors\":[\"Resource Not Found\"]}\r\nActivityId: e317ae66-6500-476c-b70e-c986c4cbf1d9, Request URI: /apps/e842e452-2347-4a8e-8588-2f5f8b4803ad/services/2c490552-a24d-4a9d-a786-992c07356545/partitions/0281cfdd-0c60-499f-be4a-289723a7dbf9/replicas/131336364114731886s"
Comme indiqué dans la documentation , vous devez fournir le valeur de la clé de partition, pas le nom du champ qui stocke la clé de partition. Ainsi, vous devez ajouter l'ID de périphérique en tant que paramètre à votre méthode et transmettre sa valeur au constructeur PartitionKey
.
De l'exemple:
// Read document. Needs the partition key and the ID to be specified
Document result = await client.ReadDocumentAsync(
UriFactory.CreateDocumentUri("db", "coll", "XMS-001-FE24C"),
new RequestOptions { PartitionKey = new PartitionKey("XMS-0001") });
Donc pour votre code:
public static async Task<T> GetItemAsync(string id, string deviceId)
{
try
{
RequestOptions options = new RequestOptions();
options.PartitionKey = new PartitionKey(deviceId);
Document document = await client.ReadDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id), options);
return (T)(dynamic)document;
}
catch (DocumentClientException e)
{
if (e.StatusCode == HttpStatusCode.NotFound)
{
return null;
}
else
{
throw;
}
}
}
J'ai eu le problème exact aujourd'hui.
En lisant le document dans le document db,
lorsque le docLink de format (dbs/dbid ../colls/collid ../docs/docid ..)
Solution:
Le client du document lance "Ressource introuvable" dans 2 cas:
1. la collection est mal identifiée
2. partitionKey donné a quelques problèmes. C'est-à-dire que vous avez indiqué une partitionKey incorrecte ou que partitionKey n'était pas obligatoire, mais qu'une a été donnée.