Контекст запроса

Это RequestContextOrleans функция, которая позволяет метаданным приложения, таким как идентификатор трассировки, передавать запросы. Метаданные приложения могут быть добавлены на клиент; он будет передаваться с Orleans запросами на получение зерна. Функция реализуется общедоступным статическим классом RequestContextв Orleans пространстве имен. Этот класс предоставляет два простых метода:

void Set(string key, object value)

Предыдущий API используется для хранения значения в контексте запроса. Значение может быть любым сериализуемым типом.

Object Get(string key)

Предыдущий API используется для получения значения из текущего контекста запроса.

Резервное хранилище для RequestContext асинхронного локального хранилища. Когда вызывающий объект (независимо от клиента или внутри Orleans) отправляет запрос, содержимое RequestContext вызывающего объекта включается в Orleans сообщение для запроса; когда код зерна получает запрос, доступ к метаданным осуществляется из локального объекта RequestContext. Если код зерна не изменяет RequestContext, то все запросы на получение одинаковых метаданных и т. д.

Метаданные приложения также сохраняются при планировании будущих вычислений с помощью или StartNewContinueWithв обоих случаях продолжение будет выполняться с теми же метаданными, что и код планирования в момент запланированного вычисления (то есть система создает копию текущих метаданных и передает ее в продолжение, поэтому изменения после вызова StartNew или ContinueWith не будут отображаться продолжением).

Внимание

Метаданные приложения не возвращаются с ответами; То есть код, который выполняется в результате получения ответа в ContinueWith рамках продолжения или после вызова Task.Wait() или GetValueпо-прежнему будет выполняться в текущем контексте, заданном исходным запросом.

Например, чтобы задать идентификатор трассировки в клиенте новым Guid, просто вызовет:

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

В коде зерна (или другом коде, который выполняется в Orleans потоке планировщика), можно использовать идентификатор трассировки исходного клиентского запроса, например при написании журнала:

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

Хотя любой сериализуемый объект может быть отправлен в виде метаданных приложения, стоит упоминание, что большие или сложные объекты могут добавлять заметные издержки во время сериализации сообщений. По этой причине рекомендуется использовать простые типы (строки, идентификаторы GUID или числовые типы).