Wspoldzielenie stanu sesji pomiedzy klasycznymi aplikacjami ASP a aplikacjami ASP NET sfor.doc

(93 KB) Pobierz
Współdzielenie stanu sesji pomiędzy klasycznymi aplikacjami ASP a aplikacjami ASP

Współdzielenie stanu sesji pomiędzy klasycznymi aplikacjami ASP a aplikacjami ASP.NET

Billy Yuen
Microsoft Corporation

Dotyczy:
Microsoft® ASP.NET

Streszczenie

W artykule wyjaśniono, w jaki sposób współdzielić stan sesji pomiędzy klasycznym ASP a ASP.NET, wykorzystując klasy Microsoft .NET Framework oraz funkcjonalność serializacji platformy .NET Framework. Współdzielenie stanu sesji pozwala na przeprowadzenie konwersji istniejących aplikacji ASP do ASP.NET etapami, gdy stara i nowa część aplikacji działają równolegle.
Długość dokumentu — 12 stron po wydrukowaniu

Pobierz przykładowy kod źródłowy do tego artykułu

Spis treści

Wstęp
Wstęp teoretyczny
Implementacja w ASP.NET
Implementacja w ASP
Program demonstracyjny
Włączanie obiektów COM w istniejącą aplikację ASP
Ograniczenia i możliwości rozwoju kodu
Podsumowanie

Wstęp

ASP.NET firmy Microsoft® jest najnowszą technologią do tworzenia aplikacji internetowych. Zalety ASP.NET w porównaniu z klasycznym ASP to: 1) lepsza struktura wdrożeniowa dzięki oddzieleniu warstwy prezentacyjnej (interfejs użytkownika) od logiki biznesowej; 2) kod ASP.NET jest w pełni kompilowany w przeciwieństwie do kodu klasycznego ASP, który jest interpretowany; 3) możliwość kompilowania kodu w połączeniu z buforowaniem oznacza znacznie większą wydajność witryn napisanych w ASP.NET w porównaniu z ich odpowiednikami utworzonymi w klasycznym ASP.

Konwersja aplikacji ASP do ASP.NET może przynieść wiele korzyści, jednak istnieje sporo aplikacji ASP o znaczeniu krytycznym. Aplikacje takie często są bardzo skomplikowane. Proces konwersji może wymagać zaangażowania dużych zasobów i może powodować niepoprawne działanie istniejącej aplikacji. Jednym ze sposobów na rozwiązanie tych problemów jest równoległe uruchamianie aplikacji ASP i ASP.NET oraz konwersja aplikacji moduł po module. Aby równolegle uruchomić starą i nową aplikację, wymagane jest współdzielenie stanu sesji pomiędzy klasycznym ASP i ASP.NET. W niniejszym artykule wyjaśniono, jak z użyciem kilku klas oraz funkcji serializacji Microsoft® .NET Framework współdzielić stan sesji pomiędzy aplikacjami.

Wstęp teoretyczny

Pliki cookie to najpopularniejszy sposób identyfikacji sesji użytkownika w aplikacjach internetowych, który może służyć do identyfikacji stanu sesji zarówno w ASP jak i w ASP.NET. Informacja o stanie sesji jest przechowywana w pamięci skryptu ASP i nie może być współdzielona z innymi aplikacjami, takimi jak ASP.NET. Jeśli natomiast stan sesji byłby przechowywany w standardowym formacie w bazie Microsoft® SQL Server, wówczas dostęp do niego mógłby być realizowany zarówno przez klasyczny kod ASP i jak i kod ASP.NET.

W niniejszym przykładzie do identyfikacji sesji użytkownika używany jest plik cookie o nazwie mySession. Gdy użytkownik wysyła żądanie do aplikacji internetowej, serwer tworzy unikatowy plik cookie identyfikujący sesję i wysyła go do użytkownika. Przy kolejnym żądaniu unikatowy plik cookie wysyłany jest z powrotem do serwera. Plik cookie umożliwia identyfikację sesji użytkownika i załadowanie z serwera SQL (za pomocą specjalnie przygotowanej klasy) danych o sesji użytkownika. Ta specjalnie przygotowana klasa zapewnia dostęp do całego stanu sesji w aplikacji internetowej. Po zakończeniu obsługi żądania, dane o sesji zostaną ponownie zapisane w bazie serwera SQL (patrz ilustracja 1).

Ilustracja 1. Przepływ danych

Implementacja w ASP.NET

Każda strona internetowa ASP.NET jest klasą pochodną klasy System.Web.UI.Page. Klasa Page zawiera instancję obiektu HttpSession, w którym przechowywane są dane sesji. W tym przykładzie opracowano niestandardową klasę pochodną System.Web.UI.Page — klasę o nazwie SessionPage, zapewniającą taką samą funkcjonalność co klasa Page. Jedyną różnicą pomiędzy klasami SessionPage oraz Page jest to, że domyślny obiekt HttpSession został zastąpiony niestandardowym obiektem sesji (w języku C# zastosowanie modyfikatora new do składowej klasy pozwala ukryć składową odziedziczoną po klasie podstawowej).

   public class SessionPage : System.Web.UI.Page

   {

      ...

      public new mySession Session = null;

      ...

   }

Niestandardowa klasa sesji do przechowywania stanu sesji w pamięci operacyjnej wykorzystuje obiekt HybridDictionary (obiekt HybridDictionary może sprawnie przechowywać nieograniczoną liczbę elementów sesji). Aby umożliwić współpracę z klasycznym ASP, typ danych przechowywanych wewnątrz stanu sesji został ograniczony do typu string (domyślny obiekt HttpSession dopuszcza przechowywanie danych dowolnego typu, nie jest to jednak zgodne z klasycznym ASP).

   [Serializable]

public class mySession

   {

      private HybridDictionary dic = new HybridDictionary();

 

      public mySession()

      {

      }

 

      public string this [string name]

      {

         get

         {

            return (string)dic[name.ToLower()];

         }

         set

         {

            dic[name.ToLower()] = value;

         }

      }

   }

Klasa Page umożliwia dostosowywanie działania różnych zdarzeń i metod. Metoda OnInit jest używana do inicjowania stanu obiektu Page. Jeżeli w żądaniu nie przesłano pliku cookie mySession, do przeglądarki, która przesłała żądanie, zostanie wysłany nowy plik cookie mySession. Jeśli plik cookie został przesłany w żądaniu, to jego zawartość wykorzystana jest do pobrania stanu sesji z serwera SQL. Służy do tego niestandardowy obiekt dostępu do danych o nazwie SessionPersistence. Nazwa źródła danych DSN oraz wartość SessionExpiration pobierane z pliku web.config.

      override protected void OnInit(EventArgs e)

      {

         InitializeComponent();

         base.OnInit(e);

      }

      private void InitializeComponent()

      {   

         cookie = this.Request.Cookies[sessionPersistence.SessionID];

 

         if (cookie == null)

         {

            Session = new mySession();

            CreateNewSessionCookie();

            IsNewSession = true;

         }

         else

            Session = sessionPersistence.LoadSession(

Server.UrlDecode(cookie.Value).ToLower().Trim(),

dsn,

SessionExpiration

);

...

Zgłoś jeśli naruszono regulamin