İ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, RequestContext
ad 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 RequestContext
yapmazsa, 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() GetValue
sonra 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 Guid
bir 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
HelloGrain
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, 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.