Freigeben über


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.