Billy YuenMicrosoft 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
WstępWstęp teoretycznyImplementacja w ASP.NETImplementacja w ASPProgram demonstracyjnyWłączanie obiektów COM w istniejącą aplikację ASPOgraniczenia i możliwości rozwoju koduPodsumowanie
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.
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
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 są 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
);
szatanizacja