Aanvraagcontext
Het RequestContext is een Orleans functie waarmee toepassingsmetagegevens, zoals een tracerings-id, kunnen stromen met aanvragen. Toepassingsmetagegevens kunnen op de client worden toegevoegd; het zal stromen met Orleans aanvragen naar het ontvangende graan. De functie wordt geïmplementeerd door een openbare statische klasse, RequestContext
in de Orleans naamruimte. In deze klasse worden twee eenvoudige methoden weergegeven:
void Set(string key, object value)
De voorgaande API wordt gebruikt om een waarde op te slaan in de aanvraagcontext. De waarde kan elk serialiseerbaar type zijn.
object Get(string key)
De voorgaande API wordt gebruikt om een waarde op te halen uit de huidige aanvraagcontext.
De back-upopslag voor RequestContext
is asynchroon lokaal. Wanneer een aanroeper (ongeacht of deze aan de clientzijde of binnen Orleans) een aanvraag verzendt, wordt de inhoud van de aanroeper RequestContext
opgenomen in het Orleans bericht voor de aanvraag. Wanneer de graancode de aanvraag ontvangt, zijn die metagegevens toegankelijk vanuit het lokale RequestContext
. Als de graancode de RequestContext
korrelcode niet wijzigt, ontvangt elke korrel die het aanvraagt dezelfde metagegevens, enzovoort.
Toepassingsmetagegevens worden ook bijgehouden wanneer u een toekomstige berekening plant met behulp StartNew van of ContinueWith; in beide gevallen wordt de voortzetting uitgevoerd met dezelfde metagegevens als de planningscode op het moment dat de berekening is gepland (dat wil gezegd: het systeem maakt een kopie van de huidige metagegevens en geeft deze door aan de voortzetting, zodat wijzigingen na de aanroep naar StartNew
of ContinueWith
niet worden gezien door de voortzetting).
Belangrijk
De metagegevens van de toepassing stromen niet terug met antwoorden; Dat wil gezegd: code die wordt uitgevoerd als gevolg van een antwoord dat wordt ontvangen, binnen een ContinueWith
vervolg of na een aanroep naar Task.Wait() of GetValue
, wordt nog steeds uitgevoerd binnen de huidige context die is ingesteld door de oorspronkelijke aanvraag.
Als u bijvoorbeeld een tracerings-id in de client wilt instellen op een nieuwe Guid
, roept u het volgende aan:
RequestContext.Set("TraceId", Guid.NewGuid());
Binnen graancode (of andere code die binnen Orleans een scheduler-thread wordt uitgevoerd), kan de tracerings-id van de oorspronkelijke clientaanvraag worden gebruikt, bijvoorbeeld bij het schrijven van een logboek:
Logger.LogInformation(
"Currently processing external request {TraceId}",
RequestContext.Get("TraceId"));
Hoewel serializeerbaar object
kan worden verzonden als metagegevens van toepassingen, is het de moeite waard om te vermelden dat grote of complexe objecten merkbare overhead kunnen toevoegen aan de serialisatietijd van berichten. Daarom wordt het gebruik van eenvoudige typen (tekenreeksen, GUID's of numerieke typen) aanbevolen.
Bekijk de volgende voorbeeldkorrelcode om het gebruik van een aanvraagcontext te illustreren:
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);
}
De SayHello
methode registreert de binnenkomende greeting
parameter en haalt vervolgens de tracerings-id op uit de aanvraagcontext. Als er geen tracerings-id wordt gevonden, registreert de graanlogboeken geen tracerings-id.
De client kan de tracerings-id instellen in de aanvraagcontext voordat de SayHello
methode wordt aangeroepen op de HelloGrain
. De volgende clientcode laat zien hoe u een tracerings-id instelt in de aanvraagcontext en de SayHello
methode aanroept op de 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!
In dit voorbeeld stelt de client de tracerings-id in op 'example-id-set-by-client' voordat de SayHello
methode op de HelloGrain
client wordt aangeroepen. De grain haalt de tracerings-id op uit de aanvraagcontext en registreert deze.
.NET-feedback
.NET is een open source project. Selecteer een koppeling om feedback te geven: