Lezen in het Engels

Delen via


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, RequestContextin 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 RequestContextkorrelcode 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.

Voorbeeld van graancode

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.

Voorbeeldclientcode

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 HelloGrainclient wordt aangeroepen. De grain haalt de tracerings-id op uit de aanvraagcontext en registreert deze.