Anforderungskontext
Der RequestContext ist ein Orleans-Feature, mit dem Anwendungsmetadaten, z. B. eine Ablaufverfolgungs-ID, mit Anforderungen übertragen werden können. Anwendungsmetadaten können auf dem Client hinzugefügt werden. Sie werden mit Orleans-Anforderungen an das empfangende Grain übertragen. Das Feature wird von einer öffentlichen statischen Klasse, RequestContext
, im Orleans-Namespace implementiert. Diese Klasse macht zwei einfache Methoden verfügbar:
void Set(string key, object value)
Die vorherige API wird verwendet, um einen Wert im Anforderungskontext zu speichern. Der Wert kann ein beliebiger serialisierbarer Typ sein.
Object Get(string key)
Die vorherige API wird verwendet, um einen Wert aus dem aktuellen Anforderungskontext abzurufen.
Der Sicherungsspeicher für RequestContext
ist asynchron-lokal. Wenn ein Aufrufer (egal ob clientseitig oder innerhalb von Orleans) eine Anforderung sendet, wird der Inhalt des RequestContext
des Aufrufers in die Orleans-Nachricht für die Anforderung aufgenommen. Wenn der Graincode die Anforderung empfängt, sind diese Metadaten vom lokalen RequestContext
aus zugänglich. Wenn der Graincode den RequestContext
nicht ändert, erhält jedes Grain, das er anfordert, die gleichen Metadaten usw.
Anwendungsmetadaten werden auch beibehalten, wenn Sie eine zukünftige Berechnung mithilfe von StartNew oder ContinueWith planen. In beiden Fällen wird die Fortsetzung mit denselben Metadaten ausgeführt, die dem Planungscode zum Zeitpunkt der Planung der Berechnung vorlagen (d. h. das System erstellt eine Kopie der aktuellen Metadaten und gibt sie an die Fortsetzung weiter, sodass Änderungen nach dem Aufruf von StartNew
oder ContinueWith
für die Fortsetzung nicht sichtbar sind).
Wichtig
Die Metadaten der Anwendung fließen nicht mit den Antworten zurück, d. h. Code, der als Folge einer empfangenen Antwort ausgeführt wird, entweder innerhalb einer ContinueWith
-Fortsetzung oder nach einem Aufruf von Task.Wait() oder GetValue
, wird immer noch innerhalb des aktuellen Kontexts ausgeführt, der durch die ursprüngliche Anforderung festgelegt wurde.
Wenn Sie z. B. eine Ablaufverfolgungs-ID im Client auf eine neue Guid
festlegen möchten, rufen Sie einfach Folgendes auf:
RequestContext.Set("TraceId", Guid.NewGuid());
Innerhalb von Graincode (oder anderem Code, der innerhalb von Orleans auf einem Planerthread ausgeführt wird) kann die Ablaufverfolgungs-ID der ursprünglichen Clientanforderung verwendet werden, z. B. beim Schreiben eines Protokolls:
Logger.Info("Currently processing external request {0}", RequestContext.Get("TraceId"));
Zwar kann jedes serialisierbare Objekt als Metadaten der Anwendung gesendet werden, aber es ist erwähnenswert, dass große oder komplexe Objekte die Zeit für die Serialisierung von Nachrichten spürbar verlängern können. Aus diesem Grund wird die Verwendung von einfachen Typen (Zeichenfolgen, GUIDs oder numerische Typen) empfohlen.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für