2011-02-04 8 views
5

Czy jest miejsce do wydania w następującym kodzie pod względem wielu użytkowników tej samej aplikacji internetowej? To znaczy, wiem, że ciąg czysto statyczny będzie współdzielony przez wszystkie sesje dla pojedynczej aplikacji ASP.NET, ale biorąc pod uwagę, że to wyraźnie odnosi się do Current.Session, nawet jeśli jest statyczny, wydaje się, że zawsze odnosi się do instancji sesji "bieżącego użytkownika".Czy statyczne odwołanie do HttpContext.Current.Session zwraca tę samą sesję dla wszystkich użytkowników?

Ale wystąpił błąd, który można wytłumaczyć przez wszystkich, którzy dzielą bieżącą wartość Mode, a co za tym idzie, ostatnią zmianę nadpisującą wartość trybu innej osoby.

(w tle. Ten napis jest w Helpers klasy, który jest używany w całej aplikacji nie chcę, aby ciężko zakodowanych odwołań do Session["Mode"] całej aplikacji i nie chcą zdać Session["Mode"] w każdej metodzie zadzwoń od strony aspx.cs.)

public static string Mode 
{ 
    get 
    { 
     var value = HttpContext.Current.Session["Mode"]; 
     return (value ?? string.Empty).ToString(); 
    } 
    set 
    { 
     HttpContext.Current.Session["Mode"] = value; 
    } 
} 
+0

"Pobiera lub ustawia obiekt HttpContext dla bieżącego żądania HTTP." http://msdn.microsoft.com/en-us/library/system.web.httpcontext.current.aspx –

Odpowiedz

8

HttpContext.Current zawsze zwraca kontekst bieżącego żądania (jeśli jest prąd żądanie).

Ponieważ każdy użytkownik będzie wykonywał inne żądanie, każdy kontekst będzie inny.

0

Twoja nieruchomość to static. Jest to w rzeczywistości przyczyna dzielenia się własnością między użytkownikami.

Aby uzyskać więcej informacji, patrz Scope of static Variable in multi-user ASP.NET web application.

+0

Właściwość jest w tym przypadku fasadą dla metod 'get' i' set'. Zatem fakt, że pobierane dane pochodzą z sesji lokalnej, odwołuje się do tej sesji zależnej i dlatego nie jest dzielony między użytkowników. –

+0

Ponieważ nie można wywoływać członków instancji z poziomu elementu statycznego, przejrzałbym 'HttpContext.Current.Session', aby zobaczyć, jak dokładnie to obchodzą i czynią go specyficznym dla użytkownika. Jeśli będę mieć czas, sprawdzę to, ale odpowiedź będzie interesująca. – toddmo