Gibt es eine mögliche „Race Condition“, wenn Asp.Net MVC TempData über eine Weiterleitung verwendet wird?

StackOverflow https://stackoverflow.com/questions/235665

Frage

Bei der Verwendung von TempData gehe ich davon aus, dass alles, was Sie hineingeben, nur für eine einzige Anfrage gespeichert wird.Wenn Sie also TempData verwenden, um Daten über eine Umleitung hinweg beizubehalten (um das Post-Request-Get-Muster zu verwenden), ist es nicht möglich, dass zwischen der Antwort, die die Umleitung sendet, und der Antwort eine andere Anfrage des Benutzers beim Server eingeht Der Browser des Benutzers fordert die umgeleitete Seite an?In diesem Fall wären beim Get die TempData nicht mehr verfügbar, richtig?

Nun verstehe ich, dass so etwas sehr selten passieren würde, aber wenn man bedenkt, dass der Benutzer möglicherweise eine andere Seite in einem anderen Tab geöffnet hat und auf dieser Seite möglicherweise Ajax- oder zeitgesteuerte Rückrufanfragen auftreten, ist dies plötzlich nicht mehr der Fall scheint mir das alles unmöglich zu sein.Wird es im Allgemeinen einfach als zu weit entfernt angesehen, um sich darüber Sorgen zu machen, oder verstehe ich etwas falsch?

Bearbeiten:Um genauer auf das Szenario einzugehen, nach dem ich gefragt habe.

  1. In der Registerkarte 1 steigt der Benutzer zu einer Seite mit einem Postformular
  2. In Tab 2 Browser zu einer anderen Seite auf der Website, auf der Ajax -Rückrufe auf einem Timer durchgeführt werden
  3. In Tab 1 sendet der Benutzer das Formular an den Server
  4. Wenn der Server den Beitrag empfängt, speichert er einige Daten in Tempdata und sendet eine Wiederleitungsantwort zurück
  5. In Tab 2 erfolgt der zeitgesteuerte Ajax-Rückruf, bei dem eine GET-Anfrage an den Server gesendet wird.Die TempData werden aus der Sitzung entfernt
  6. In Tab 1 empfängt der Browser die Weiterleitung und gibt eine GET-Anfrage aus
  7. Der Server verarbeitet die GET-Anfrage und sucht nach den TempData, diese sind jedoch nicht mehr vorhanden
War es hilfreich?

Lösung

Nun, das Durchsuchen des ASP.NET MVC-Codes zeigt, dass TempData zwar in der Sitzung gespeichert, beim Laden jedoch aus der Sitzung entfernt wird.Und es wird in die ExecuteCore()-Methode des Controllers geladen.

Ich denke, das würde bedeuten, dass Sie durchaus in eine Race-Situation geraten könnten, bei der eine Anfrage von einem anderen Browser-Tab (Sie hatten ein ziemlich gutes Beispiel) dieses Problem verursachen könnte.Dies hängt jedoch vom Modell des jeweiligen Browsers für die Bearbeitung von Anfragen ab.Ein Browser serialisiert möglicherweise alle Anforderungen an denselben Server, sodass jeweils nur eine ausgeführt wird.In Wirklichkeit werden sie das jedoch nicht tun, sondern auf das Maximum begrenzen, das (glaube ich) bei 5 gleichzeitigen Anfragen an denselben Server liegt.

Angesichts der Tatsache, dass eine ASP.NET MVC-Site Dienstanfragen an jeden Browser senden kann (es ist schließlich das Web :)), handelt es sich um ein reales Szenario, wenn auch wahrscheinlich um ein seltenes, wie Sie sagten.

Andere Tipps

Es ist durchaus möglich, dass bei der Verwendung von TempData eine Racebedingung vorliegt.Allerdings müsste man natürlich „Pech“ haben, um es bei normaler Nutzung zu erleben.Um die Rennbedingung zu erfüllen, muss Folgendes zutreffen:

  1. Sie müssen zunächst TempData verwenden.
  2. Es müssen mehrere Browserfenster/Tabs/was auch immer geöffnet sein und dieselbe Browsersitzung teilen.
  3. Eine Anfrage vom zweiten Browser-Tab muss sich zwischen der Anfrage und Antwort des ersten Browser-Tabs „einschleichen“.

Beachten Sie, dass Punkt 2 stark davon abhängt, welchen Browser Sie verwenden.Je nachdem, wie Sie den IE eingerichtet haben, bedeutet die bloße Tatsache, dass Sie mehrere Fenster geöffnet haben, nicht, dass diese Browser-Cookies teilen, und daher teilen sie nicht unbedingt Sitzungen (die auf Cookies basieren).

Allerdings gibt es keine Rennbedingung in dem Sinne, dass etwas explodiert, wenn man darauf stößt.Das könnte Haacked meinen.Aber du dürfen Es ist eine Race-Bedingung in dem Sinne aufgetreten, dass Sie in einer Anfrage einige TempData festgelegt haben und diese dann in der nächsten Anfrage nicht zurückerhalten haben Gedanke Du würdest es bekommen.Es wird einfach leer sein.

Danke, Eilon

TempData nutzt das Session-Objekt, bei dem dieses Problem nicht auftritt, AFAIK.Sind Sie dabei auf ein bestimmtes Problem gestoßen?

Ich denke, dass es nie passieren wird, obwohl ich am Anfang die gleiche Verwirrung habe. Denken Sie darüber nach: Wenn Sie Ihre MVC-Webanwendung im Debug-Modus ausführen, legen Sie einen Haltepunkt in einer Umleitungsaktion fest. Und geben Sie Tempdata dann einen Wert Sie erhalten das Tempdate im Redirect ViewResult und in der anderen Ansicht werden Sie feststellen, dass die andere Anfrage nie beantwortet wird, bis die Umleitungsaktion abgeschlossen ist. Was bedeutet das also? Es hieß, dass die MVC-Anwendung im Single-Thread-Modus ausgeführt wird und a verarbeiten kann einzelne Anfrage auf einmal. Das oben erwähnte Szenario kann also niemals eintreten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top