Synchronizacja i przechowywanie sesji może być bardzo niekorzystne dla wydajności aplikacji webowej. Wyobraźmy sobie, że użytkownik wywołuje kontroler kilkukrotnie w ramach tej samej sesji. ASP.NET MVC musi zadbać o to, aby sesja zawsze miała prawidłową wartość. Niestety jest to osiągane poprzez kolejkowanie zapytaniach w ramach tej samej sesji. Jeśli zatem wywołujemy dwukrotnie metodę A, nie zostanie to wykonane współbieżnie. Dobrą stroną takiego mechanizmu jest fakt, że zapis i odczyt sesji jest bezpieczny.
W wielu przypadkach jednak, aplikacje webowe są bezstanowe. Programiści generalnie unikają sesji ponieważ zawsze wpływają one niekorzystnie na skalowalność aplikacji. W takich przypadkach warto zablokować dostęp do niej poprzez atrybut, umieszczony np. nad kontrolerem:
[SessionState(SessionStateBehavior.Disabled)] public class SampleController : Controller { public ActionResult Index() { Thread.Sleep(1000); return new HttpStatusCodeResult(HttpStatusCode.OK); } }
Możliwe wartości SessionStateBehavior to Default, ReadOnly, Required, Disabled. W powyższym przykładzie blokujemy sesje co powinno zwiększyć wydajność, gdy kilka zapytań jest wykonywanych jednocześnie w ramach tej samej sesji.
Próba dostępu do sesji, gdy jest ona zablokowana, zakończy się wyjątkiem NullReferenceException:
public ActionResult Index() { Session["test"] = "test"; // Exception! return new HttpStatusCodeResult(HttpStatusCode.OK); }
Warto zauważyć, że przedstawiony scenariusz jest bardzo powszechny w Ajax – wywołujemy kilka asynchronicznych zapytań, w celu załadowania różnych fragmentów strony.
W następnym poście, napiszemy prostą aplikację, prezentującą powyższe rozważania.