Contexto de solicitud

RequestContext es una característica de Orleans que permite que los metadatos de la aplicación, como un identificador de seguimiento, fluyan con las solicitudes. Los metadatos de la aplicación se pueden agregar en el cliente; fluirán con las solicitudes de Orleans al grano receptor. La característica se implementa mediante una clase estática pública, RequestContext, en el espacio de nombres de Orleans. Esta clase expone dos métodos simples:

void Set(string key, object value)

La API anterior se usa para almacenar un valor en el contexto de la solicitud. El valor puede ser cualquier tipo serializable.

Object Get(string key)

La API anterior se usa para recuperar un valor del contexto de solicitud actual.

El almacenamiento de respaldo para RequestContext es async-local. Cuando el autor de la llamada (ya sea del lado cliente o en Orleans) envía una solicitud, el contenido de RequestContext de este se incluye con el mensaje de Orleans de la solicitud; cuando el código de grano recibe la solicitud, esos metadatos son accesibles desde el objeto RequestContext local. Si el código de grano no modifica RequestContext, cualquier grano que solicite recibirá los mismos metadatos, etc.

Los metadatos de la aplicación también se mantienen cuando se programa un cálculo futuro mediante StartNew o ContinueWith; en ambos casos, la continuación se ejecutará con los mismos metadatos que tenía el código de programación en el momento en que se programó el cálculo (es decir, el sistema realiza una copia de los metadatos actuales y la pasa a la continuación, por lo que los cambios después de la llamada a StartNew o ContinueWith no se verán en la continuación).

Importante

Los metadatos de la aplicación no vuelven a fluir con respuestas; es decir, el código que se ejecuta como resultado de una respuesta que se recibe, ya sea dentro de una continuación ContinueWith o después de una llamada a Task.Wait() o GetValue, se seguirá ejecutando en el contexto actual que establece la solicitud original.

Por ejemplo, para establecer un id. de seguimiento en el cliente en un nuevo Guid, simplemente se llamaría a:

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

Dentro del código de grano (u otro código que se ejecuta en Orleans en un subproceso del programador), se puede usar el identificador de seguimiento de la solicitud de cliente original al escribir un registro, por ejemplo:

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

Aunque cualquier objeto serializable se puede enviar como metadatos de la aplicación, conviene mencionar que los objetos grandes o complejos pueden agregar una sobrecarga notable al tiempo de serialización de mensajes. Por este motivo, se recomienda el uso de tipos simples (cadenas, GUID o tipos numéricos).