Aracılığıyla paylaş


İstek bağlamı

RequestContext, Orleans izleme kimliği gibi uygulama meta verilerinin isteklerle akmasını sağlayan bir özelliktir. Uygulama meta verileri istemciye eklenebilir; alıcı hub'a isteklerle birlikte Orleans akacaktır. Özellik, RequestContextad alanında Orleans genel statik sınıfı tarafından uygulanır. Bu sınıf iki basit yöntemi kullanıma sunar:

void Set(string key, object value)

Yukarıdaki API, bir değeri istek bağlamında depolamak için kullanılır. Değer herhangi bir serileştirilebilir tür olabilir.

object Get(string key)

Önceki API, geçerli istek bağlamından bir değer almak için kullanılır.

için RequestContext yedekleme depolama alanı async-local'dır. Arayan (ister istemci tarafı ister içinde Orleans) bir istek gönderdiğinde, arayanın RequestContext içeriği isteğin Orleans iletisine eklenir; gren kodu isteği aldığında, bu meta verilere yerel RequestContextöğesinden erişilebilir. Tanecik kodu üzerinde değişiklik RequestContextyapmazsa, istediği herhangi bir tanecik aynı meta verileri alır ve bu şekilde devam eder.

Veya kullanarak StartNew ContinueWithgelecekteki bir hesaplama zamanladığınızda da uygulama meta verileri korunur; her iki durumda da, devamlılık, hesaplamanın zamanlandığı anda zamanlama koduyla aynı meta verilerle yürütülür (yani sistem geçerli meta verilerin bir kopyasını alır ve devama geçirir; bu nedenle çağrısından StartNew sonra yapılan değişiklikler devamlılık tarafından görülmez).ContinueWith

Önemli

Uygulama meta verileri yanıtlarla geri akmıyor; yani, bir devamlılık içinde ContinueWith veya veya çağrısından Task.Wait() GetValuesonra alınan bir yanıt sonucu olarak çalışan kod, özgün istek tarafından ayarlanan geçerli bağlam içinde çalışmaya devam eder.

Örneğin, istemcide yeni Guidbir izleme kimliği ayarlamak için şunu çağırırsınız:

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

Tahıl kodu (veya zamanlayıcı iş parçacığında çalışan başka bir kod) içinde Orleans , örneğin bir günlük yazarken özgün istemci isteğinin izleme kimliği kullanılabilir:

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

Herhangi bir seri hale getirilebilir object veri uygulama meta verileri olarak gönderilebilir olsa da, büyük veya karmaşık nesnelerin ileti serileştirme süresine belirgin ek yük ekleyebileceğini belirtmek önemlidir. Bu nedenle, basit türlerin (dizeler, GUID'ler veya sayısal türler) kullanılması önerilir.

Örnek tanecik kodu

İstek bağlamının kullanımını göstermeye yardımcı olmak için aşağıdaki örnek ayrıntılı kodu göz önünde bulundurun:

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);
}

SayHello yöntemi gelen greeting parametreyi günlüğe kaydeder ve ardından istek bağlamından izleme kimliğini alır. İzleme kimliği bulunmazsa, tanecik "İzleme kimliği yok" değerini günlüğe kaydeder.

Örnek istemci kodu

İstemci, yöntemini üzerinde HelloGrainçağırmadan SayHello önce istek bağlamında izleme kimliğini ayarlayabilir. Aşağıdaki istemci kodu, istek bağlamında izleme kimliği ayarlamayı ve üzerinde yöntemini çağırmayı SayHello HelloGraingösterir:

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!

Bu örnekte istemci, yöntemini üzerinde HelloGrainçağırmadan SayHello önce izleme kimliğini "example-id-set-by-client" olarak ayarlar. Tanecik, istek bağlamından izleme kimliğini alır ve günlüğe kaydeder.