Langbahn Team – Weltmeisterschaft

ASP.NET

ASP.NET (ang. Active Server Pages Network Enabled Technologies) – zbiór technologii opartych na frameworku zaprojektowanym przez firmę Microsoft. Przeznaczony jest do budowy różnorodnych aplikacji internetowych, a także aplikacji typu XML Web Services. ASP.NET rozszerza platformę deweloperską .NET o narzędzia i biblioteki przeznaczone specjalnie do tworzenia aplikacji internetowych.

Strony ASP.NET są uruchamiane przy użyciu serwera, który umożliwia wygenerowanie treści HTML (wraz z CSS), WML lub XML – rozpoznawanych oraz interpretowanych przez przeglądarki internetowe. ASP.NET jest wspierany przez separujący warstwę logiki od warstwy prezentacji, wątkowo-kierowany model programistyczny, co poprawia wydajność działania aplikacji. Logika stron ASP.NET oraz XML Web Services może być tworzona w językach Visual Basic .NET, C# lub w dowolnym innym języku wspierającym technologię Microsoft .NET Framework lub .NET Core.

Historia

Po publikacji Internet Information Services (IIS) 4.0, w roku 1997, Microsoft zaczął poszukiwać nowych możliwości w tworzeniu efektywnych stron internetowych z użyciem przejrzystego kodu – umożliwiającego separację warstwy logiki od warstwy prezentacji. Mark Anders (menadżer zespołu IIS) oraz Scott Guthrie (absolwent Uniwersytetu Duke’a – najbardziej prestiżowego uniwersytetu w Stanach Zjednoczonych[potrzebny przypis]) postanowili odpowiedzieć na pytanie, jak taki model programistyczny mógłby wyglądać w rzeczywistości. Na odpowiedź nie trzeba było zbyt długo czekać, bo w ciągu następnych dwóch miesięcy – w czasie Świąt Bożego Narodzenia w roku 1997 - powstała prototypowa wersja – nazywana początkowo XSL.

Początkowa wersja została utworzona przy użyciu Javy, jednak niedługo potem zdecydowano się utworzyć nową platformę przy użyciu Common Language Runtime (CLR), które oferowało obiektowo-zorientowane środowisko programistyczne wraz z narzędziami takimi jak garbage collector. Reimplementacja została dokonana przy użyciu języka C#. Przyjęto nazwę „Project Cool”, jednak dane określenie nie przyjęło się i postanowiono zmienić ją na ASP+, co miało kojarzyć się z łagodnym przystosowaniem dla developerów ASP.

Pierwsza prezentacja ASP+ została dokonana przez Marka Andersa w czasie konferencji ASP Connections w Phoenix (Arizona) w maju 2000 roku. Demonstracja dla szerokiego grona zainteresowanych oraz wydanie wersji inicjalizacyjnej ASP+ Beta zostały dokonane w czasie „Professional Developers Conference” 11 lipca 2000 roku w Orlando (Floryda).

W drugiej połowie roku 2000 postanowiono zastąpić nazwę ASP+ nazwą ASP.NET. W ciągu kolejnych kilkunastu miesięcy opublikowano kilka wersji beta, aż w końcu 5 września 2002 roku opublikowano ASP.NET w wersji 1.0 jako część .NET Framework 1.0. Niecały rok później, 2 kwietnia 2003 roku, wydano kolejną wersję ASP.NET 1.1. Stanowiła ona część Windows Server 2003, co jako pewna innowacyjność miało zapoczątkować wsparcie w oprogramowywaniu i użytkowaniu urządzeń mobilnych.

Charakterystyka

Pliki

Pliki zawierające treść stron internetowych ASP.NET posiadają rozszerzenie .aspx. Dokumenty tego typu zawierają statyczną treść (X)HTML. Dodatkowo w ramach kodu statycznego istnieje możliwość dodania fragmentów dynamicznych, np. <% -- dynamic code -- %>, podobnie jak to się ma w przypadku technologii PHP lub JSP. Dodatkowo wraz z wprowadzeniem ASP.NET Framework 2.0 Microsoft postanowił rozdzielić warstwę prezentacji od logiki, umieszczając obie części w osobnych plikach. Dane udogodnienie zostało określone nazwą „Code-Behind” i charakteryzuje się tym, że plik z treścią statyczną nazwiemy przykładowo MyPage.aspx, zaś dokument z logiką (w Microsoft Visual Studio stanowiący jednocześnie podwęzeł pliku .aspx) analogicznie MyPage.aspx.cs lub MyPage.aspx.vb (rozszerzenie zależne od języka, w którym programujemy np. C# lub Visual Basic). W praktyce separacja warstw oznacza większą przejrzystość kodu oraz możliwość wielokrotnego wykorzystania implementowanych klas oraz ich zawartości.

Dyrektywy

Dyrektywy są informacją dla ASP.NET, w jaki sposób przetworzyć daną stronę internetową. Przykładową dyrektywą może być <%@ Page Language="C#" %>, która mówi o tym, jaki język programowania został użyty i – odpowiednio – w jaki sposób należy interpretować kod.

Inline-code vs. Behind-code

Inline-coding oznacza pisanie statycznego kodu, w ramach którego jako skrypt umieszczany jest kod dynamiczny. Przykład prezentowany jest poniżej.

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "---//W3C//DTD XHTML 1.0 //EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
  protected void Page_Load(object sender, EventArgs e)
  {
    // Assign the datetime to label control
    lbl1.Text = DateTime.Now.ToLongTimeString();
 
  }
</script>
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>Sample page</title>
</head>
<body>
  <form id="form1" runat="server">
    <div>
      The current time is: <asp:Label runat="server" id="lbl1" />
    </div>
  </form>
</body>
</html>

W przykładzie zauważmy kontrolkę Label, zaimplementowaną w ramach treści statycznej, jednakże logika strony, a mianowicie przypisanie kontrolki Label i jej właściwości Text aktualnego czasu odbywa się dynamicznie, poprzez funkcję Page_Load umieszczoną między znacznikami <script>. W przypadku posługiwania się code-behind treść statyczną oraz dynamiczną rozdzielamy między osobne pliki. Na początku pliku z treścią statyczną (.aspx) umieszczamy znacznik <%@ Page %> przykładowo:

<%@ Page Language="C#" CodeFile="SampleCodeBehind.aspx.cs" Inherits="Website.SampleCodeBehind" AutoEventWireup="true" %>

Dyrektywa @Page oznacza, że istnieje dodatkowy plik(code-behind) z treścią odpowiedzialną za logikę programu. Obydwa pliki, analogicznie do poprzedniego przykładu mogłyby wyglądać następująco: MyPage.aspx

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "---//W3C//DTD XHTML 1.0 //EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>Sample page</title>
</head>
<body>
  <form id="form1" runat="server">
    <div>
      The current time is: <asp:Label runat="server" id="lbl1" />
    </div>
  </form>
</body>
</html>

oraz MyPage.aspx.cs czyli nasz code-behind:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Website
{
  public partial class _MyPage : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      // Assign the datetime to label control
      lbl1.Text = DateTime.Now.ToLongTimeString();
    }
  }
}

Jak widać, drugie rozwiązanie wydaje się być o wiele bardziej klarowne.

Zarządzanie stanem

Aplikacje ASP.net są hostowane przez serwer webowy oraz udostępniane dzięki bezstanowemu protokołowi HTTP, co oznacza, że każde kolejne żądanie nie jest kojarzone z żadnym poprzednim. W takim wypadku zarządzanie stanem sesji musi być dokonywane przez samą aplikację. Tu natomiast ASP.net posiada kilka rodzajów zarządzania stanem, które możemy podzielić ze względu na zasięg, czas życia oraz rozmiar przechowywanych danych i tego, po jakiej stronie są one przechowywane.

Stan aplikacji

Utrzymanie stanu aplikacji jest możliwe dzięki klasie HttpApplicationState. Zawiera ona mechanizm kolekcji par zmiennych typu klucz-wartość. Zmienne te są widoczne w czasie całego trwania aplikacji ASP.NET. Tworzenie zmiennych stanu aplikacji jest możliwe dzięki obiektowi Application. Przykładowo:

Application["Rower"]="Pojazd dwukołowy";

tworzy klucz „Rower” i przypisuje mu wartość „Pojazd dwukołowy”. Pobieranie tak utworzonej zmiennej może wyglądać następująco:

string infoRower = (string) Application["Rower"];

Stan sesji

W przypadku chęci przechowywania zmiennych na zasadzie koszyka sklepu internetowego potrzebne nam będą zmienne stanu sesji. Za ich implementację oraz przechowywanie jest odpowiedzialny obiekt Session. Przykładowe wykorzystanie:

Session["Rower"] = "Pojazd dwukołowy";
string infoRower = (string)Session["Rower"];

Poza typami prostymi można również przechowywać obiekty złożone, czyli przykładowo wspomniana przez nas instancja klasy Koszyk:

Koszyk koszyk = new Koszyk();
Session["NaszKoszyk"] = koszyk;
koszyk = (Koszyk) Session["NaszKoszyk"];

Stan widoku

Stan widoku (View state) nawiązuje do zachowania informacji w ramach pojedynczego formularza. Dodatkowym wymogiem jest aby formularz zawierał atrybut runat="server". W sytuacji gdy przeładujemy stronę, dane stanu poprzedniej sesji zostają utracone. W takiej sytuacji należy skorzystać z innego mechanizmu – przykładowo wyżej wspomnianego obiektu Session. W przypadku stanu widoku przechowywanie zmiennych odbywa się na zasadzie analogicznej do poprzednio omawianych stanów. Używanym tutaj obiektem jest ViewState, a jego wykorzystanie może wyglądać następująco.

ViewState["Rower"] = "Pojazd dwukołowy";

Możliwe jest również przechowywanie obiektów złożonych np:

ViewState["Rower"] = new Rower();

Jednak warunkiem jest umieszczenie atrybutu [Serializable] przed nazwą klasy Rower, której instancja będzie wykorzystywana jako wartość pary klucz-wartość .

Bibliografia

Linki zewnętrzne