Warum ist der "Kontext" meiner statischen ASP.Net-Funktion zwischen Benutzersitzungen?

7

Ich denke, ich brauche Hilfe, um zu verstehen, wie statische Objekte in einer ASP.Net-Anwendung bestehen bleiben. Ich habe dieses Szenario:

someFile.cs in einer Klassenbibliothek:

%Vor%

someOtherFile.cs in einer Klassenbibliothek:

%Vor%

Einige ASP.Net-Seite:

%Vor%

Die Idee ist, dass ich ein Business-Objekt habe, das auf Basis einer Callback-Funktion auf UI-Ebene eine Operation ausführt. Ich setze die Callback-Funktion auf eine statische Variable auf Page_Init (in der tatsächlichen Codeversion auf der Masterseite, wenn das einen Unterschied macht). Ich dachte, dass jede Ausführung der Seite, unabhängig davon, aus welcher Benutzersitzung sie stammt, die Logik dieser Funktion durchläuft, aber auf ihrer eigenen Datenmenge operiert. Was stattdessen zu geschehen scheint, ist ein Nebenläufigkeitsproblem.

Wenn ich eine Benutzersitzung ausfühle, während sie zwischen den Anrufen für diese Rückruffunktion schläft, starte eine andere Benutzersitzung. Wenn die erste Sitzung aus dem Ruhezustand zurückkehrt, wird die Sitzungs-ID aus der zweiten Benutzersitzung übernommen. Wie kann das möglich sein?

Ausgabe von mydebug.txt:

%Vor%

Warum wird der Kontext der Funktion (dh ihre lokalen Daten usw.) von einer Benutzersitzung in eine andere überschrieben?

    
Matt Hamsmith 16.09.2009, 19:44
quelle

5 Antworten

2

Eine Lösung, die Sie in Betracht ziehen könnten, ist [ThreadStatic].

Ссылка

Es macht deine Statik pro Thread. Es gibt jedoch Cavaets, also sollten Sie testen.

    
Keith Adler 16.09.2009, 19:51
quelle
11

Jede Anfrage an eine asp.net-Seite kommt herein und wird auf ihrem eigenen Thread bearbeitet. Aber jeder dieser Threads gehört zu derselben Anwendung. Das heißt, alles, was Sie als statisch markieren, wird für alle Anfragen und damit auch für alle Sitzungen und Benutzer freigegeben.

In diesem Fall wird die MyFunc -Funktion, die Teil Ihrer Seitenklasse ist, über das statische Func -Member in A mit jeder page_init kopiert, und jedes Mal, wenn ein Benutzer eine page_init ausführt, ist er Ersetze die von alle Anfragen verwendete A.Func .

    
Joel Coehoorn 16.09.2009 19:49
quelle
4

Statische Daten werden unter der gesamten Anwendungsdomäne Ihres Unternehmens geteilt Web-App. Kurz gesagt, es wird von allen Threads geteilt, die Anfragen in Ihrer Webanwendung bedienen, es ist nicht an eine Sitzung / einen Thread / Benutzer gebunden, sondern an die Webapp als Ganzes (anders als zB PHP, wo jede Anfrage in ihrer eigenen isolierten Umgebungsleiste lebt) ein paar Knöpfe zur Verfügung gestellt - wie die Session-Variable.)

    
nos 16.09.2009 19:50
quelle
4

Ich werde nicht versuchen, die Erklärungen der anderen Antworten zu statischen Mitgliedern zu verbessern, sondern möchte Ihnen einen anderen Weg zeigen, um Ihr unmittelbares Problem zu kodieren.

Als Lösung können Sie eine instanzorientierte Version Ihrer Klasse A erstellen, sie in einer Variable auf Seitenebene speichern und sie beim Laden der Seite an den Konstruktor von Q übergeben:

%Vor%

Wenn Sie vorher noch nicht A2 deklarieren müssen, können Sie es instanziieren, wenn Sie Ihre Instanz von Q in Page_Load erstellen.

Bearbeiten: Um die Frage zu beantworten, die Sie in anderen Kommentaren gestellt haben, teilen die Anfragen denselben Delegaten mit, der nur eine einzige Kopie seiner Variablen hat. Siehe Jon Skeets The Beauty of Closures für weitere Details.

    
Jeff Sternal 16.09.2009 20:03
quelle
1

Wenn die Daten nur für die aktuelle Anfrage beibehalten werden sollen, verwenden Sie HttpContext.Items : Ссылка

Wenn die Daten für die Sitzung des aktuellen Benutzers beibehalten werden sollen (vorausgesetzt, Sie haben den Sitzungsstatus aktiviert), verwenden Sie HttpContext.Session : Ссылка

    
Brannon 16.09.2009 20:27
quelle

Tags und Links