2017-01-13 1 views
0

Ich übergebe Benutzerinformationen als Teil jedes Anrufs an einen zustandsbehafteten Dienst. Ich verwende diese Informationen für Prüfungszwecke im Service.Greifen Sie global auf Daten im Stateful-Service zu

Muss ich diese Informationen innerhalb des Service weitergeben, oder gibt es einen anderen Mechanismus wie einen Benutzerkontext, um die Daten zu behalten, auf die ich global zugreifen kann? Ich habe Thread-Speicher (Daten-Slots) in der Vergangenheit verwendet, um Daten zu halten, aber da der Code async ist, nehme ich an, dass das nicht funktioniert?

Antwort

1

Sie können diese Informationen nicht in einem Mitglied des Dienstes speichern, da Sie keine Kontrolle darüber haben, wie gleichzeitige Aufrufe asynchron für mehrere Threads ausgeführt werden. Die Art und Weise, wie die Laufzeit es Tasks und asynchronen Methoden ermöglicht, zwischen diesen zu "springen" bedeutet, dass ThreadStorage keine sichere Methode ist, diesen Kontext beizubehalten.

Was Sie brauchen, ist etwas, das den ganzen Weg von Ihrem ServiceRemotingDispatcher bis zur Ausführung Ihrer tatsächlichen Service-Methoden tragen kann und nicht durch gleichzeitige Aufrufe (möglicherweise die gleiche Methode) betroffen ist. Die Art und Weise, wie die zugrunde liegende Service-Fabric-Implementierung Ihre Methode ausführt, bedeutet, dass mehrere Tasks und asynchrone Methoden aufgerufen werden. Dies bedeutet auch, dass die Thread-ID einfach nicht als Option in Frage kommt, da ein Sprung fast garantiert ist Threads mindestens einmal, bevor Sie Ihren Code erreichen.

Ich schrieb this answer zu einer ähnlichen Frage (die gelöscht wurde, so fügte ich diese q selbst zurück). Es löst im Grunde Ihre Frage und es basiert auf CallContext als mentioned by @LoekD

Verwandte Themen