Contesto della richiesta

RequestContext è una Orleans funzionalità che consente ai metadati dell'applicazione, ad esempio un ID di traccia, di fluire con le richieste. I metadati dell'applicazione possono essere aggiunti nel client; scorrerà con le richieste Orleans al livello di granularità di ricezione. La funzionalità viene implementata da una classe statica pubblica, RequestContext, nello spazio dei nomi Orleans. Questa classe espone due metodi semplici:

void Set(string key, object value)

L'API precedente viene usata per archiviare un valore nel contesto della richiesta. Il valore può essere qualsiasi tipo serializzabile.

Object Get(string key)

L'API precedente viene usata per recuperare un valore dal contesto di richiesta corrente.

L'archiviazione di backup per RequestContext è asincrona locale. Quando un chiamante (lato client o all'interno di Orleans) invia una richiesta, il contenuto di RequestContext del chiamante viene incluso nel messaggio Orleans per la richiesta; quando il codice granulare riceve la richiesta, i metadati sono accessibili da RequestContext locale. Se il codice granulare non modifica il RequestContext, qualsiasi granularità a cui fa richiesta riceverà gli stessi metadati e così via.

I metadati dell'applicazione vengono mantenuti anche quando si pianifica un calcolo futuro usando StartNew o ContinueWith. In entrambi i casi, la continuazione verrà eseguita con gli stessi metadati del codice di pianificazione nel momento in cui il calcolo è stato pianificato, ovvero il sistema crea una copia dei metadati correnti e lo passa alla continuazione, quindi le modifiche dopo la chiamata a StartNew o ContinueWith non verranno visualizzate dalla continuazione.

Importante

I metadati dell'applicazione non vengono restituiti con risposte; ovvero, il codice eseguito come risultato della ricezione di una risposta, all'interno di una continuazione ContinueWith o dopo una chiamata a Task.Wait() o GetValue, verrà comunque eseguito all'interno del contesto corrente impostato dalla richiesta originale.

Ad esempio, per impostare un ID di traccia nel client su un nuovo Guid, è sufficiente chiamare:

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

All'interno del codice granulare (o di altro codice eseguito all'interno di Orleans in un thread dell'utilità di pianificazione), è possibile usare l'ID di traccia della richiesta client originale, ad esempio durante la scrittura di un log:

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

Anche se qualsiasi oggetto serializzabile può essere inviato come metadati dell'applicazione, vale la pena ricordare che oggetti di grandi dimensioni o complessi possono aggiungere un sovraccarico notevole al tempo di serializzazione dei messaggi. Per questo motivo, è consigliabile usare tipi semplici (stringhe, GUID o tipi numerici).