70-562: Using Server-Side State Management

Artykuł pochodzi w serii przygotowań do egzaminu 70-562 ASP.NET.

W poprzednim wpisie zostały opisane mechanizmy zarządzania stanem aplikacji po stronie klienta. Natomiast dzisiaj, przeczytasz o sposobach utrwalania stanu aplikacji po stronie serwera. Czasami bywają sytuacje, w których przechowywanie stanu aplikacji po stronie klienta jest złym rozwiązaniem. A to ilość danych przesyłanych do klienta jest zbyt duża, a to ze względów bezpieczeństwa dane lepiej nie powinny być przesyłane przez Internet lub po prostu część danych powinna być dostępna globalnie dla każdego użytkownika korzystającego z aplikacji.

ASP.NET udostępnia dwa mechanizmy przechowywania stanu aplikacji po stronie serwera, bez konieczności przesyłania ich do klienta. Application state (stan aplikacji) służy do przechowywania globalnych informacji, natomiast session state (stan sesji) służy do przechowywania danych specyficznych dla jednego, konkretnego użytkownika. Dodatkowo dane specyficzne dla konkretnego użytkownika można przechowywać za pomocą mechanizmu profilu ASP.NET, który szczegółowiej zostanie opisany w późniejszych artykułach.

Application state

Aby wykorzystać application state wystarczy skorzystać z właściwości Application klasy Page. Właściwość ta jest typu HttpApplicationState, który dziedziczy z NameObjectCollectionBase, dzięki czemu z właściwością Application możemy pracować jak z zwykłym słownikiem.

   1: Application["klucz"] = (object)"wartosc";
   2: string wartosc = (string)Application["klucz"];

Pracując z właściwością Application, trzeba pamiętać, że jest ona współdzielona przez wszystkie wątki pracujące w ramach danej aplikacji, dlatego podczas zapisu danych do niej, musimy ją blokować, aby nie utracić danych.

 

   1: Application.Lock();
   2: Application["klucz"] = (object)"wartosc";
   3: Application.UnLock();

Session state

Gdy potrzebujemy przechowywać dane specyficzne dla jednego klienta po stronie serwera, zamiast właściwość Application powinniśmy skorzystać z właściwości Session, która jest typu HttpSessionState. Praca w właściwością Session przebiega podobnie jak z właściwością Application.

   1: Session["klucz"] = (object) "wartosc";
   2: string wartosc = (string) Session["klucz"];

 

Aby wyłączyć obsługę sesji w całej aplikacji (np. w celu zwiększenia wydajności) można w pliku web.config dodać element <sessionState> z ustawionym atrybutem mode na wartość Off.

   1: <configuration>
   2:    <system.web>
   3:       <sessionState mode="Off"/>
   4:       </sessionState>
   5:    </system.web>
   6: </configuration>

 

Dodatkowo można wyłączać obsługę sesji dla poszczególnych stron (lub ustawiać tylko możliwość odczytu z właściwość Session). W tym celu w nagłówku strony ustawiamy atrybut EnableSessionState na False (lub na ReadOnly).

   1: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
   2: Inherits="WebApplication1._Default" EnableSessionState="False"%>
Wybór trybu działania Session State

ASP.NET umożliwia wybór różnego rodzaju przechowywania danych zapisanych w sesji, w zależności od potrzeb i wielkości aplikacji. Domyślnie dane są przechowywane w pamięci RAM ale między innymi w sytuacji, gdy np. wykorzystywany jest mechanizm load-balanced w celu rozdzielenia obsługi żądań na kilka serwerów, taki tryb pracy Session State nie jest dobry. ASP.NET umożliwia wybór jednego z poniższych trybów:

  • InProc – dane sesji są przechowywane w pamięci serwera (domyślne zachowanie). Oferuje najlepszą wydajność w stosunku do pozostałych trybów działania ale niestety przy wykorzystaniu mechanizmu load-balanced się nie sprawdza. Tryb ten jest dobry dla prostych aplikacji webowych. Dane sesji są tracone w trakcje restartu aplikacji.
  • StateServer – dane sesji są przechowywane przez usługę ASP.NET State Service. To rozwiązanie powoduje, że restart aplikacji nie powoduje utraty danych sesji oraz umożliwia współdzielenie przez kilka serwerów jednych danych sesji.
  • SQLServer – dane sesji są przechowywane w bazie danych SQL Server. Podobnie jak w przypadku StateServer dane nie są tracone podczas restartu aplikacji oraz z danych może korzystać kilka serwerów na raz.
  • Custom – umożliwia podpięcie specyficznego providera do przechowywania danych. W tym przypadku programista musi sam oprogramować sposób przechowywania danych sesji.
  • Off – mechanizm sesji jest wyłączony.

Tryb sesji (oraz wszelkie dodatkowe dane potrzebne do działania) są ustawiane za pomocą wspomnianego już elementu sessionState pliku konfiguracyjnego web.config.

   1: <sessionState mode="Off|InProc|StateServer|SQLServer"
   2:               cookieless="true|false"
   3:               timeout="number of minutes"
   4:               stateConnectionString="tcpip=server:port"
   5:               sqlConnectionString="sql connection string"
   6:               stateNetworkTimeout="number of seconds"/>

 

Global.asax

Aplikacja www stworzona w ASP.NET może wykorzystywać specjalną klasę Global, która dziedziczy z klasy HttpApplication. W klasie tej programista może obsłużyć kilka zdarzeń związanych z działaniem całej aplikacji. Najpopularniejsze z nich to:

  • Application_Start – zdarzenie jest wywoływane w czasie uruchamiania aplikacji.
  • Application_End – zdarzenie jest wywoływane w czasie zatrzymywania lub wyłączania aplikacji.
  • Application_Error – zdarzenie jest wywoływane w sytuacji, gdy nie zostanie obsłużony wyjątek na żadnym z poziomie aplikacji.
  • Session_Start – zdarzenie jest wywoływane, gdy rozpoczyna się nowa sesja dla użytkownika
  • Session_End – zdarzenie jest wywoływane, gdy sesja się kończy lub mija timeout

Tagi: , , , , , ,

Add comment




  Country flag
biuquote
  • Comment
  • Preview
Loading


Eastgroup.pl na facebooku