Контекст запроса
Это 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 или числовые типы).
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по