Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O RequestContext é um Orleans recurso que permite que os metadados do aplicativo, como uma ID de rastreamento, fluam com solicitações. Você pode adicionar metadados da aplicação no cliente; isso flui com os pedidos de Orleans para o módulo recetor. O recurso é implementado por uma classe estática pública, RequestContext, no Orleans namespace. Esta classe expõe dois métodos simples:
void Set(string key, object value)
Use a API anterior para armazenar um valor no contexto de solicitação. O valor pode ser qualquer tipo serializável.
object Get(string key)
Use a API anterior para recuperar um valor do contexto de solicitação atual.
O armazenamento de backup para RequestContext é async-local. Quando um chamador (no lado do cliente ou dentro de Orleans) envia uma solicitação, o conteúdo de RequestContext do chamador é adicionado à mensagem Orleans para a solicitação. Quando o código grain recebe a solicitação, esses metadados são acessíveis a partir do local RequestContext. Se o código de grão não modificar o RequestContext, qualquer grão solicitado receberá os mesmos metadados e assim por diante.
Os metadados do aplicativo também são mantidos quando você agenda um cálculo futuro usando StartNew ou ContinueWith. Em ambos os casos, a continuação é executada com os mesmos metadados que o código de agendamento tinha quando o cálculo foi agendado. Ou seja, o sistema copia os metadados atuais e os passa para a continuação, de modo que a continuação não verá alterações feitas após a chamada para StartNew ou ContinueWith.
Importante
Os metadados do aplicativo não fluem de volta com as respostas. O código que é executado como resultado do recebimento de uma resposta (dentro de uma ContinueWith continuação ou após uma chamada para Task.Wait() ou GetValue) ainda é executado dentro do contexto atual definido pela solicitação original.
Por exemplo, para definir um ID de rastreamento no cliente para um novo Guid, chame:
RequestContext.Set("TraceId", Guid.NewGuid());
Dentro do código grain (ou outro código em execução Orleans em um thread do agendador), você pode usar o ID de rastreamento da solicitação original do cliente, por exemplo, ao escrever um log:
Logger.LogInformation(
"Currently processing external request {TraceId}",
RequestContext.Get("TraceId"));
Embora você possa enviar qualquer serializável object como metadados de aplicativo, vale a pena mencionar que objetos grandes ou complexos podem adicionar sobrecarga percetível ao tempo de serialização de mensagens. Por esse motivo, recomendamos o uso de tipos simples (strings, GUIDs ou tipos numéricos).
Exemplo de código de grão
Para ajudar a ilustrar o uso do contexto de solicitação, considere o seguinte exemplo de código de grão:
using GrainInterfaces;
using Microsoft.Extensions.Logging;
namespace Grains;
public class HelloGrain(ILogger<HelloGrain> logger) : Grain, IHelloGrain
{
ValueTask<string> IHelloGrain.SayHello(string greeting)
{
_logger.LogInformation("""
SayHello message received: greeting = "{Greeting}"
""",
greeting);
var traceId = RequestContext.Get("TraceId") as string
?? "No trace ID";
return ValueTask.FromResult($"""
TraceID: {traceId}
Client said: "{greeting}", so HelloGrain says: Hello!
""");
}
}
public interface IHelloGrain : IGrainWithStringKey
{
ValueTask<string> SayHello(string greeting);
}
O SayHello método registra o parâmetro de entrada greeting e, em seguida, recupera a ID de rastreamento do contexto da solicitação. Se nenhum ID de rastreamento for encontrado, o grão regista a mensagem "Sem ID de rastreamento".
Exemplo de código de cliente
O cliente pode definir a ID de rastreamento no contexto da solicitação antes de chamar o SayHello método no HelloGrain. O código de cliente a seguir demonstra como definir uma ID de rastreamento no contexto da solicitação e chamar o SayHello método no HelloGrain:
using GrainInterfaces;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using var host = Host.CreateDefaultBuilder(args)
.UseOrleansClient(clientBuilder =>
clientBuilder.UseLocalhostClustering())
.Build();
await host.StartAsync();
var client = host.Services.GetRequiredService<IClusterClient>();
var grain = client.GetGrain<IHelloGrain>("friend");
var id = "example-id-set-by-client";
RequestContext.Set("TraceId", id);
var message = await friend.SayHello("Good morning!");
Console.WriteLine(message);
// Output:
// TraceID: example-id-set-by-client
// Client said: "Good morning!", so HelloGrain says: Hello!
Neste exemplo, o cliente define o identificador de rastreamento como "example-id-set-by-client" antes de chamar o método SayHello no HelloGrain. O grão recupera o ID de rastreamento do contexto da solicitação e o registra.