Partager via


Contexte de demandes

RequestContext est une fonctionnalité d’Orleans qui permet aux métadonnées d’application, telles qu’un ID de trace, d’accompagner les demandes. Les métadonnées d’application peuvent être ajoutées au niveau du client ; elles accompagneront les demandes Orleans jusqu’au grain de destination. La fonctionnalité est implémentée par une classe statique publique, RequestContext, dans l’espace de noms Orleans. Cette classe expose deux méthodes simples :

void Set(string key, object value)

L’API précédente sert à stocker une valeur dans le contexte de la demande. La valeur peut être de n’importe quel type sérialisable.

Object Get(string key)

L’API précédente sert à récupérer une valeur du contexte de demande actuel.

Le stockage de sauvegarde pour RequestContext est un stockage local asynchrone. Quand un appelant (qu’il soit côté client ou dans Orleans) envoie une requête, le contenu du RequestContext de l’appelant est inclus avec le message Orleans pour la requête ; quand le code de grain reçoit la requête, ces métadonnées sont accessibles à partir du RequestContext local. Si le code de grain ne modifie pas le RequestContext, tout grain qui le demande recevra les mêmes métadonnées, et ainsi de suite.

Les métadonnées d’application sont également conservées quand vous planifiez un calcul à venir à l’aide de StartNew ou ContinueWith ; dans les deux cas, la continuation s’exécutera avec les mêmes métadonnées dont le code de planification disposait au moment où le calcul a été planifié (autrement dit, le système effectue une copie des métadonnées actuelles et les transmet à la continuation, si bien que les modifications postérieures à l’appel à StartNew ou ContinueWith ne seront pas vues par la continuation).

Important

Les métadonnées d’application ne sont pas retournées en même temps que les réponses ; autrement dit, le code qui s’exécute par suite d’une réponse reçue, que ce soit dans une continuation ContinueWith ou après un appel à Task.Wait() ou GetValue, continuera de s’exécuter dans le contexte actuel qui a été défini par la demande d’origine.

Par exemple, pour attribuer à un ID de trace du client un nouveau Guid, il suffit d’appeler :

RequestContext.Set("TraceId", Guid.NewGuid());

Dans le code de grain (ou dans tout autre code qui s’exécute dans Orleans sur un thread de planificateur), l’ID de trace de la requête cliente d’origine peut être utilisé, par exemple, lors de l’écriture d’un journal :

Logger.Info("Currently processing external request {0}", RequestContext.Get("TraceId"));

Bien que tout objet sérialisable puisse être envoyé comme métadonnées d’application, il est utile de préciser que les objets volumineux ou complexes peuvent ajouter une surcharge de temps conséquente lors de la sérialisation des messages. Cette pour cette raison qu’il est recommandé d’utiliser des types simples (chaînes, GUID ou types numériques).