Aracılığıyla paylaş


İstek bağlamı

RequestContext, izleme kimliği gibi uygulama meta verilerinin isteklerle akışına olanak tanıyan bir Orleans özelliktir. İstemciye uygulama meta verileri ekleyebilirsiniz; bu meta veriler Orleans istekleriyle alıcı taneye akar. Ö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)

bir değeri istek bağlamında depolamak için önceki API'yi kullanın. Değer herhangi bir serileştirilebilir tür olabilir.

object Get(string key)

Geçerli istek bağlamından bir değer almak için önceki API'yi kullanın.

için RequestContext yedekleme depolama alanı async-local'dır. Arayan (istemci tarafı veya Orleans içinde) bir istek gönderdiğinde, arayanın RequestContext içeriği isteğin iletisine Orleans dahil edilir. Tahıl kodu isteği aldığında, bu meta verilere yerel RequestContext öğesinden erişilebilir. Eğer tanecik kodu RequestContext üzerinde değişiklik yapmazsa, istediği herhangi bir tanecik aynı meta verilerini alır ve bu durum böyle devam eder.

StartNew veya ContinueWith kullanarak gelecekteki bir hesaplamayı zamanladığınızda uygulama meta verileri de korunur. Her iki durumda da işlem, hesaplama zamanlandığında zamanlama kodunun sahip olduğu aynı meta verilerle devam eder. Yani, sistem geçerli meta verileri kopyalar ve devama aktarır, bu yüzden devamın StartNew veya ContinueWith çağrısından sonra yapılan değişiklikleri görmemesi sağlanır.

Önemli

Uygulama meta verileri yanıtlarla geri akmıyor. Yanıt alma işleminin sonucu olarak çalışan kod (ya bir ContinueWith devamlılığı içinde ya da Task.Wait() veya GetValue çağrısından sonra) orijinal istek tarafından ayarlanan mevcut bağlam içinde çalışmaya devam eder.

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

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

Grain kodu (veya bir zamanlayıcı iş parçacığı üzerinde Orleans çalışan diğer kodlar) içinde, örneğin bir günlük yazarken orijinal istemci isteğinin izleme kimliğini kullanabilirsiniz:

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

Herhangi bir serileştirilebilir object uygulamayı uygulama meta verileri olarak gönderebilmenize karşın, büyük veya karmaşık nesnelerin ileti serileştirme süresine belirgin ek yük ekleyebileceğini belirtmek faydalı olabilir. Bu nedenle, basit türler (dizeler, GUID'ler veya sayısal türler) kullanmanızı öneririz.

Örnek tanecik kodu

İstek bağlamının kullanımını göstermeye yardımcı olmak için aşağıdaki örnek tahıl kodunu 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 adlı parametreyi günlüğe kaydeder ve ardından istek bağlamından izleme kimliğini elde eder. İzleme kimliği bulunmazsa, sistem "İzleme kimliği yok" ifadesini günlüğe kaydeder.

Örnek istemci kodu

İstemci, SayHello üzerinde HelloGrain yöntemini çağırmadan önce, istek bağlamında izleme kimliğini ayarlayabilir. Aşağıdaki istemci kodu, istek bağlamında bir izleme kimliği ayarlamayı ve SayHello üzerinde HelloGrain yöntemini çağırmayı gö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 SayHello üzerindeki HelloGrain yöntemini çağırmadan önce izleme ID'sini "example-id-set-by-client" olarak ayarlar. Tanecik, istek bağlamından izleme ID’sini alır ve günlüğe kaydeder.