Download as pdf or txt
Download as pdf or txt
You are on page 1of 331

Rozdzia 11.

Uycie XML w ASP.NET


Aktualnie powiniene ju doskonale zna metody dostpu do danych wykorzystywane w
technologii ASP.NET. Wiesz jak uzyska dostp i jak wywietla dane przy uyciu ADO.NET
oraz jak je modyfikowa; a co wicej, potrafisz to zrobi na kilka rnych sposobw. Jednak
adne rozwaania na temat baz danych oraz Internetu nie bd kompletne bez choby pobienego
przedstawienia jzyka XML Extensible Markup Language (rozszerzalnego jzyka
znacznikw).
XML jest nowym, uniwersalnym jzykiem sucym do reprezentacji danych na Sieci. Ostatnio
powicano mu bardzo wiele uwagi, gdy eliminuje on duo typowych problemw zwizanych z
dostpem do danych i ich rozpowszechnianiem, takich jak bezpieczestwo, moliwo
odczytania i rozumienia informacji oraz ich konwersji.
ASP.NET oraz rodowisko .NET zostay, w znacznej mierze, zaprojektowane pod ktem
wykorzystania XML-a. Fakt ten nie tylko poszerza ich moliwoci lecz take czyni je prostszymi
w uyciu. W tym rozdziale zajmiemy si wanie XML-em oraz jego miejscem w rodowisku
.NET, duo uwagi powicimy odczytywaniu, zapisywaniu oraz konwersji danych XML.
W tym rozdziale omwione zostan nastpujce zagadnienia:
Czym jest XML?
Odczyt, zapis oraz sprawdzanie poprawno dokumentw XML przy wykorzystaniu
obiektw XmlTextReader oraz XmlTextWriter.
Wykorzystanie modelu obiektw dokumentu XML.
Sposoby uycia jzyka XML do reprezentacji danych relacyjnych.

Wprowadzenie do jzyka XML


XML jest tekstowym formatem sucym do reprezentacji danych. Niesie on z sob nowe sposoby
dostarczania informacji do aplikacji internetowych, dajc moliwo przesyania ich w dowolne
miejsce i wykorzystania danych niemal kadego rodzaju. Mona by przypuszcza, e XML to
niemal czarodziejska rdka, jednak jego niezwyka przydatno wynika z dwch prostych
cech. Po pierwsze, jzyk XML jest rozszerzalny (std te pochodzi jego nazwa rozszerzalny
jzyk znacznikw); co oznacza, e bardzo atwo mona go rozbudowywa dodajc wasne
znaczniki i struktur dokumentu. Po drugie, XML jest jzykiem tekstowym, czyli dokumenty
XML mona tworzy w kadym edytorze tekstowym, na przykad w programie Notatnik.
XML podobnie jak jzyk HTML opisuje zawarto przy uyciu prostych znacznikw. Jednak w
XML-u mona tworzy wasne znaczniki, co odrnia go od jzyka HTML, w ktrym
udostpniana jest pewna grupa standardowych znacznikw. I wanie na tym polega caa potga
XML-a jzyk ten pozwala na tworzenie wasnych znacznikw, dziki czemu istnieje
moliwo reprezentacji dowolnych danych. Poza tym, fakt i s to dokumenty tekstowe
zawierajce znaczniki sprawia, i dokumenty XML s atwe do odczytania i modyfikacji.
Na przykad, mona stworzy nastpujce znaczniki, ktre XML, w odrnieniu od przegldarki
WWW, bez trudu zrozumie:
<Nazwisko>...</Nazwisko>
<Zawod>...</Zawod>
<UlubRestauracja>...</UlubRestauracja >

Kod XML jest zapisywany w postaci zwyczajnego tekstu jeli tylko chcesz, moesz tworzy
dokumenty XML w programie Notatnik. Takie informacje mona bez trudu przesya w dowolne
miejsca. W przewaajcej wikszo baz danych wewntrzne informacje zapisywane s w
pewnym specyficznym formacie. Jeli w jednym projekcie wykorzystywane s rne rda
danych (lub rda dziaajce na rnych platformach komputerowych), to zazwyczaj konieczne
jest przeprowadzanie zoonych konwersji pomidzy rnymi typami danych. W XML-u dane
prezentowane s w strukturalnej, tekstowej postaci, dziki czemu nie ma potrzeby wykonywania
jakichkolwiek archaicznych konwersji. Ta tekstowa natura sprawia, e uytkownicy nie maj
wikszych problemw z odczytywaniem i zrozumieniem zawartoci dokumentw XML. Jzyk ten
pozwala take na omijanie wyrafinowanych mechanizmw zabezpieczajcych, ktre
niejednokrotnie uniemoliwiaj uycie innych sposobw przesyu informacji lub stwarzaj
konieczno stosowania zoonych rozwiza umoliwiajcych transmisj danych. Te
mechanizmy zabezpieczajce bardzo czsto pozwalaj na przesyanie zwyczajnych plikw
tekstowych, a zatem XML doskonale nadaje si do przesyania danych.

Notatka
Aplikacje internetowe bardzo czsto wykorzystuj wiele rde danych, dziaajcych na rnych
platformach. W takich aplikacjach, XML jest doskonaym sposobem reprezentacji danych.

Model danych XML


Listing 11.1 przedstawia przykad pliku XML prezentujcego ksiki dostpne ksigarni.

Listing 11.1 Ksiki dostpne w ksigarni zapisane w formie dokumentu XML


1 <bookstore>
2 <book genre="novel" style="hardcover">
3 <title>The Handmaid's Tale</title>
4 <price>19.95</price>
5 <author>
6 <first-name>Margaret</first-name>
7 <last-name>Atwood</last-name>
8 </author>
9 </book>
10 <book genre="novel" style="paperback">
11 <title>The Poisonwood Bible</title>
12 <price>11.99</price>
13 <author>
14 <first-name>Barbara</first-name>
15 <last-name>Kingsolver</last-name>
16 </author>
17 </book>
18 <book genre="novel" style="hardback">
19 <title>Hannibal</title>
20 <price>27.95</price>
21 <author>
22 <first-name>Richard</first-name>
23 <last-name>Harris</last-name>
24 </author>
25 </book>
26 <book genre="novel" style="hardback">
27 <title>Focault's Pendulum</title>
28 <price>22.95</price>
29 <author>
30 <first-name>Umberto</first-name>
31 <last-name>Eco</last-name>
32 </author>
33 </book>
34 </bookstore>

Nowe okrelenie
Zapisz ten plik pod nazw books.xml. Wicej szczegowych informacji na temat konstrukcji tego
pliku znajdziesz w dalszej czci rozdziau, w podrozdziale powiconym schematom XML. Jak
na razie wystarczy, aby zwrci uwag, e XML skada si ze strukturalnych, hierarchicznych
znacznikw. W naszym przykadowym dokumencie znajduj si cztery znaczniki <book>, z
ktrych kady posiada wasne atrybuty (genre oraz style) i kilka podelementw (title,
author, price). Cay ten zbir zosta zapisany wewntrz znacznikw <bookstore>, ktre
opisuj zawarto dokumentu. Ten sposb reprezentacji danych, okrelany jest czsto mianem
drzewa dokumentu lub drzewa danych.
W tradycyjnych bazach danych, takich jak Microsoft Access, dane wygldaj, mniej wicej, w
sposb przedstawiony na rysunku 11.1

Genre Style Title AuFurstName AuLastName Price


novel hardcover The Handmaid's Tale Margaret Atwood 19.95
novel paperback The Poisonwood Bible Barbara Kingsolver 11.99
novel hardcover Hannibal Richard Harris 27.95
novel hardcover Focault's Pendulum Umberto Eco 22.95
Rysunek 11.1. Dane XML pochodzce z dokumentu przedstawionego na listingu 11.1,
wywietlone w programie Microsoft Access

Informacje zapisane w jzyku XML s atwiejsze do przenoszenia, ich odczytanie i zrozumienie


jest prostsze, a co wicej, ich stworzenie nie wymaga uycia adnych zoonych mechanizmw.
Zapisz te dane w pliku tekstowym o nazwie books.xml i umie go w folderze
C:\inetpub\wwwroot\aspnetdlakazdego\rozdzial11 (lub w dowolnym innym miejscu, ktrego
nazw z atwoci zapamitasz). A teraz sprbuj wywietli ten plik w swojej przegldarce. Jeli
korzystasz z ktrej z nowszych wersji przegldarek (Internet Explorer 5.5 lub z wersji
pniejszej) to, to zawarto dokumentu zostanie zaprezentowana w sposb przedstawiony na
rysunku 11.2.
Rysunek 11.2. Dokument XML wywietlony w przegldarce WWW.

Internet Explorer jest w stanie automatycznie przetworzy dokument XML i wywietli jego
zawarto w formie hierarchicznej listy. Gazie tej listy mona zwija klikajc znaki -
wywietlone z lewej strony znacznikw, oraz rozwija klikajc znaki +. XML udostpnia
wspaniay mechanizm sucy do reprezentacji danych.

Schematy XML
Jeli zdefiniujesz swoje wasne znaczniki, to w jaki sposb inne osoby bd wiedzie jaki rodzaj
informacji chcesz przedstawi? Ot format informacji zapisanych w pliku XML definiuj, tak
zwane, schematy XML. Przyjrzyjmy si schematowi definiujcemu informacje przedstawione na
listingu 11.1.

Listing 11.2 Schemat XML dla dokumentu z listingu 11.1


1 <?xml version="1.0"?>
2 <Schema xmlns="urn:schemas-microsoft-com:xml-data"
3 xmlns:dt="urn:schemas-microsoft-com:datatypes">
4 <ElementType name="first-name" content="textOnly"/>
5 <ElementType name="last-name" content="textOnly"/>
6 <ElementType name="name" content="textOnly"/>
7 <ElementType name="price" content="textOnly"
8 dt:type="fixed.14.4"/>
9 <ElementType name="author" content="eltOnly" order="one">
10 <group order="seq">
11 <element type="name"/>
12 </group>
13 <group order="seq">
14 <element type="first-name"/>
15 <element type="last-name"/>
16 </group>
17 </ElementType>
18 <ElementType name="title" content="textOnly"/>
19 <AttributeType name="genre" dt:type="string"/>
20 <AttributeType name="style" dt:type="enumeration"
21 dt:values="paperback hardcover"/>
22 <ElementType name="book" content="eltOnly">
23 <attribute type="genre" required="yes"/>
24 <attribute type="style" required="yes"/>
25 <element type="title"/>
26 <element type="author"/>
27 <element type="price"/>
28 </ElementType>
29 <ElementType name="bookstore" content="eltOnly">
30 <element type="book"/>
31 </ElementType>
32 </Schema>

Analiza
Zapisz ten dokument w pliku o nazwie books-schema.xdr i umie go w tym samym folderze, w
ktrym znajduje si plik books.xml. Zawarto tego dokumentu take przypomina zwyczajny kod
HTML, jest jednak czym wicej. Przyjrzyjmy si jej dokadniej. W wierszu 1. okrelany jest typ
tworzonego dokumentu XML w tym przypadku uywamy XML w wersji 1.0. Wiersz tej jest
konieczny, aby nasze przykady mogy dziaa poprawnie. W wierszu 2. otwierany jest znacznik
<schema>. xmlns to okrelenie przestrzeni nazw XML, stanowicej standardow grup
znacznikw XML, ktre kto zebra by uatwi ich dalsz standaryzacj. W tej chwili nie musisz
wiedzie niczego wicej na temat przestrzeni nazw XML zazwyczaj, jeli w ogle bdziesz z
jakiej korzysta, to bdzie to ktra ze standardowych przestrzeni, na przykad schemas-
microsoft-com:xml-data (jak w powyszym przykadzie).

Znaczniki <ElementType> s stosowane do definiowania formatu danych. Wiersze do 4. do 7.


definiuj elementy first-name, last-name, name oraz price, ktre zostan uyte w dalszej
czci schematu. Umieszczenie tych definicji na pocztku dokumentu, przypomina deklarowanie
zmiennych na samym pocztku stron ASP.NET.
Atrybut content znacznikw <ElementType> okrela rodzaj informacji jakie mog by
umieszczane wewntrz definiowanego znacznika; natomiast atrybut dt:type podaje kilka
dodatkowych cech, takich jak typ danych zawartoci znacznika oraz jej format.
Wiersze od 9. do 17. definiuj kolejny element author. Take ten element zawiera kilka
innych znacznikw, zdefiniowanych wczeniej w wierszach od 4. do 7. Wiersze od 18. do 21.
definiuj kilka kolejnych elementw i atrybutw, ktre mona uywa w schemacie.
I w kocu, w wierszu 22. definiowany jest element book, ktry zawiera wszystkie zdefiniowane
wczeniej elementy. Ta cz schematu powinna odpowiada formatowi dokumentu XML. W
wierszu 29. zosta zdefiniowany ostatni element, ktry zawiera elementy book.

Notatka
Nie trzeba definiowa elementw przed ich uyciem w schemacie rwnie dobrze mona
zdefiniowa je wszystkie wewntrz elementu book. Niemniej jednak, wczeniejsze definiowanie
elementw jest lepszym sposobem tworzenia schematw; podobnie jak definiowanie
zmiennych nim zostan po raz pierwszy uyte w dokumencie ASP.NET.

Schemat books-schema.xdr definiuje kolumny tabeli bazy danych, natomiast plik books.xml
definiuje jej wiersze. Dziki temu, te dwa pliki mog reprezentowa niemal kady rodzaj
informacji.

Nowe okrelenie
Plik XML zgodny ze schematem, zawierajcy znaczniki zapisane w poprawny sposb (czyli
zgodnie ze standardem jzyka XML okrelonym przez konsorcjum W3C), nazywany jest
poprawnie sformuowanym dokumentem XML. Tworzenie poprawnie sformuowanych
dokumentw XML gwarantuje, e wszystkie aplikacje wykorzystujce jzyk XML bd w stanie
je odczyta. Oglnie rzecz biorc, poprawnie sformuowany dokument XML musi spenia
nastpujce warunki:
musi zawiera przynajmniej jeden element,
musi zawiera unikalny znacznik otwierajcy i zamykajcy, wewntrz ktrych jest
zapisana caa zawarto dokumentu,
wszystkie znaczniki musz by zagniedone, a poszczeglne znaczniki otwierajce i
zamykajce nie mog na siebie nachodzi.
Wicej informacji o dokumentacjach standardw W3C znajdziesz pod adresem
http://webreference.com/xml/reference/standards.html.

Dostp do danych XML w dokumentach


ASP.NET
Korzystanie z danych XML przypomina operowanie na informacjach przechowywanych w bazach
danych przy wykorzystaniu ADO.NET. rodowisko .NET udostpnia wiele obiektw, ktre
zapewniaj rny stopie kontroli nad danymi, a kady z nich ma swoje zalety i wady. W tej
czci rozdziau przedstawi dwa najprostsze obiekty suce do operowania na danych XML
XmlTextReader oraz XmlTextWriter, oba zostay zdefiniowane w przestrzeni nazw
System.Xml.

Odczyt danych XML


Klasa XmlTextReader udostpnia prosty i szybki mechanizm dostpu do nieprzetworzonej
zawartoci dokumentw XML. Ze wzgldu na moliwo jednokierunkowego odczytu informacji
(od pocztku ku kocowi dokumentu) i brak nadmiernych kosztw wystpujcych przy
stosowaniu obiektw DataSet, klasa XmlTextReader przypomina nieco klas
OleDbDataReader.

Aby otworzy plik XML wystarczy stworzy nowy obiekt XmlTextReader i przekaza do niego
nazw pliku XML. Przykadowo, jeli stworzymy stron ASP.NET o nazwie XMLReader.aspx i
umiecimy j w folderze zawierajcym pliki XML, to bdzie mona je otwiera przy
wykorzystaniu nastpujcej instrukcji:
Dim reader As new XmlTextReader(nazwa_pliku_ze_sciezka)

W tym przypadku nie istniej adne acuchy poczenia ani nazwy DNS, ktrymi trzeba by si
przejmowa. Naley jednak poda pen ciek dostpu do pliku. Mona j uzyska przy
wykorzystaniu metody Server.MapPath (patrz rozdzia 4., pt.: Stosowanie obiektw ASP.NET
w jzykach C# i VB.NET). Dostp do danych XML zapewnia metoda Read, przypominajca
analogiczn metod klasy OleDbDataReader. Oto przykad:
Do While (reader.Read())
'zrb co z danymi
Loop

Kade wywoanie metody Read powoduje automatyczne przejcie do nastpnego elementu pliku
XML. Na listingu 11.3 przedstawiem stron ASP.NET, ktra wykorzystujc moliwoci klasy
XmlTextReader odczytuje i wywietla zawarto pliku books.xml.
Listing 11.3. Odczyt danych XML przy wykorzystaniu obiektu XmlTextReader
(XMLReader.aspx)
1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Xml" %>
3
4 <script runat=server>
5 sub Page_Load(obj as object, e as eventargs)
6 dim reader as XMLTextReader
7
8 try
9 reader = new XMLTextReader(Server.MapPath("books.xml"))
10 While reader.Read()
11 Response.Write("<b>" & reader.Name & "</b> " & _
12 reader.Value & "<br>")
13
14 End While
15 catch ex as Exception
16 Response.Write("Bd dostpu do pliku XML!")
17 finally
18 reader.close
19 end try
20 end sub
21 </script>
22
23 <html><body>
24
25 </body></html>

Analiza
Zapisz kod przedstawiony na powyszym listingu w pliku XMLReader.aspx. Pierwsz now
rzecz na ktr naley zwrci uwag, jest instrukcja Import umieszczona w 2. wierszu.
Instrukcja ta importuje przestrze nazw System.Xml, dziki czemu moliwe bdzie
wykorzystanie klas zwizanych z obsug jzyka XML, takich jak na przykad XmlTextReader.
Nastpnie, w wierszu 6. deklarowany jest obiekt XmlTextReader. Caa dalsza cz kodu, ktra
bdzie odczytywa zawarto pliku XML zostaa zapisana wewntrz bloku try. (Pamitaj, e za
kadym razem gdy korzystasz z zasobw pochodzcych spoza ASP.NET, fragment kodu
operujcy na nich naley umieci wewntrz bloku try.) W wierszu 9. tworzony jest obiekt
czytelnika, ktry odczyta zawarto naszego pliku XML. Przy tworzeniu tego obiektu konieczne
jest podanie penej cieki dostpu do pliku, ktr mona okreli przy uyciu metody
Server.MapPath. Konkretnie rzecz biorc wywoanie tej metody zwrci ciek
c:\inetpub\wwwroot\aspnetdlakazdego\rozdzial11\books.xml.
I w kocu, przy uyciu metody Read cyklicznie pobierane s wszystkie elementy dokumentu
XML, a w przegldarce zostaj wywietlone ich nazwy (Name) i wartoci (Value). Nie naley
zapomina o zamkniciu obiektu czytelnika stosowne czynnoci s wykonywane w bloku
finally zapisanym w wierszach 17. i 18. Wyniki wykonania strony z listingu 11.3 zostay
przedstawione na rysunku 11.3
Rysunek 11.3 Prezentacja zawartoci pliku books.xml

Na rysunku 11.3 zostay wywietlone wszystkie znaczniki zapisane w pliku books.xml nie tylko
znaczniki otwierajce lecz take zamykajce. Nie zawsze rozwizanie takie bdzie podane.
Niestety moliwoci funkcjonalne klasy XmlTextReader s bardzo ograniczone klasa ta nie
przykada znaczenia do tego jakie znaczniki s zwracane i dlatego zwraca je wszystkie!
Aby rozwiza ten problem, klasa XmlTextReader udostpnia waciwo NodeType, ktra
okrela typ aktualnie analizowanych informacji. Wybrane, najczciej spotykane typy wzw
zostay podane w tabeli 11.1.

Tabela 11.1 Wartoci waciwoci NodeType stosowane w klasie XmlTextReader.


Typ Opis
All wszystkie wzy;
Attribute atrybut;
CDATA te fragmenty zawieraj tekst, ktry w inaczej zostaby rozpoznany jako kod
zapisany w jakim jzyku znacznikw, na przykad w HTML-u;
Comment komentarze zapisane pomidzy znacznikami <!-- oraz -->;
Document element gwny drzewa danych XML;
Element element, zazwyczaj s to faktyczne dane zapisane w pliku XML;
EndTag znacznik zamykajcy elementu;
None aktualnie nie jest analizowany aden wze;
Text zwracana jest tekstowa zawarto elementu;
XMLDeclaration wze zawierajcy deklaracj XML, tak jak
<?XML version='1.0'?>.

Wykorzystajmy teraz waciwo NodeType i zmodyfikujmy przykad z listingu 11.3 tak, aby
zwracane byy tylko interesujce nas informacje.

Listing 11.4 Zwracanie informacji przy wykorzystaniu waciwoci NodeType


(XMLReader2.aspx).
1 <%@ Import Namespace="System.Xml" %>
2
3 <script language="VB" runat=server>
4 sub Page_Load(obj as object, e as eventargs)
5 dim reader as XMLTextReader
6 dim i as integer
7 dim curPrice as Decimal
8
9 try
10 reader = new XMLTextReader(Server.MapPath("books.xml"))
11
12 While reader.Read()
13 Select Case reader.NodeType
14 Case XMLNodeType.Element
15 if reader.HasAttributes then
16 for i = 0 to reader.AttributeCount - 1
17 Response.Write(reader.GetAttribute(i) _
18 & " ")
19 next
20 Response.Write("<br>")
21 end if
22 Case XMLNodeType.Text
23 Response.Write(reader.Value & "<br>")
24 End Select
25 End While
26 catch ex as Exception
27 Response.Write("Bd dostpu do pliku XML!")
28 finally
29 reader.close
30 end try
31 end sub
32 </script>
33
34 <html><body>
35
36 </body></html>

Analiza
W wierszu 13. zostaa wstawiona instrukcja select, ktra przed wywietleniem jakichkolwiek
informacji sprawdza typ aktualnie przetwarzanego wza. Pierwszy blok case, rozpoczynajcy si
w wierszu 14., jest wykonywany gdy waciwoci NodeType ma warto Element. Jeli wze
ma jakiekolwiek atrybuty, to s one kolejno pobierane, a do okrelenia ich wartoci uywana jest
metoda GetAttribute. Jeli wze jest zwyczajnym fragmentem tekstu to jest on wywietlany w
wierszu 23. Wyniki wykonania strony z listingu 11.4 przedstawiem na rysunku 11.4
Rysunek 11.4 Wywietlenie zawartoci pliku books.xml przy wykorzystaniu waciwoci
NodeType

Jeli struktura pliku XML jest znana (przy czym chodzi tu, na przykad, o nazwy elementw oraz
ich atrybutw) to mona jeszcze bardziej zmodyfikowa kod odczytujcy zawarto pliku i
wywietla wycznie te informacje, ktre nas interesuj. Na przykad, gdyby interesowa nas
wycznie gatunek ksiki (atrybut genre), to zamiast instrukcji select zapisanej w wierszach
od 16. do 20., moglibymy wykorzysta nastpujcy fragment kodu:
Response.Write(reader.Item("genre") & "<br>")

Zapis danych XML


Dziki klasie XmlTextWriter zapisywanie plikw XML jest rwnie atwe jak ich odczytywanie
przy uyciu obiektw klasy XmlTextReader. Klasa XmlTextWriter udostpnia metod Write,
ktra generuje odpowiednie dane wyjciowe.
Na przykad, strona ASP.NET przedstawiona na listingu 11.5 tworzy now wersj pliku XML
zawierajcego informacje o ksigarni.

Listing 11.5 Zapis plikw XML przy wykorzystaniu obiektu XmlTextWriter


(XMLWriter.aspx)
1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Xml" %>
3
4 <script runat=server>
5 sub Page_Load(obj as object, e as eventargs)
6 dim writer as XMLTextWriter
7
8 try
9 writer = new XMLTextWriter(Server.MapPath _
10 ("books2.xml"), nothing)
11
12 writer.WriteStartDocument
13 writer.Formatting = Formatting.Indented
14 writer.Indentation = 3
15 writer.WriteStartElement("bookstore")
16 writer.WriteStartElement("book")
17 writer.WriteAttribute("genre", "history")
18 writer.WriteAttribute("style", "hardcover")
19
20 writer.WriteElementString("title", "Vietnam")
21
22 writer.WriteStartElement("author")
23 writer.WriteElementString("first-name", _
24 "Michael")
25 writer.WriteElementString("last-name", _
26 "Avery")
27 writer.WriteEndElement()
28
29 writer.WriteElementString("price", _
30 "6.99")
31 writer.WriteEndElement()
32 writer.WriteEndElement()
33
34 writer.Flush
35 catch ex as Exception
36 Response.Write("Bd dostpu do pliku XML!")
37 finally
38 writer.Close
39 Response.Write("Zakoczono generacj pliku")
40 end try
41 end sub
42 </script>
43
44 <html><body>
45
46 </body></html>

Analiza
Struktura kodu przedstawionego na powyszym listingu przypomina struktur przykadw
wykorzystujcych obiekty klasy XmlTextReader. Obiekt pisarza (XmlTextWriter) jest
deklarowany w wierszu 6., a pozostaa cz kodu zostaa umieszczona wewntrz bloku try.
Obiektu pisarza jest tworzony w wierszu 9. Pierwszym argumentem przekazywanym w
wywoaniu konstruktora jest nazwa tworzonego pliku XML, a drugim sposb kodowania jaki
ma zosta uyty (domylnie stosowany jest kod UTF-8). Jeli plik o podanej nazwie nie istnieje, to
ASP.NET go utworzy; w przeciwnym przypadku zostanie uyty istniejcy plik.

Ostrzeenie
Wykorzystanie tego sposobu tworzenia plikw XML sprawi, e zawarto istniejcego pliku o
podanej nazwie zostanie usunita. Oznacza to, e zawarto istniejcego pliku books2.xml
zostanie bezpowrotnie utracona. A zatem, zanim co zapiszesz, upewnij si, e nie usuniesz
adnych wanych informacji!

W wierszu 12. w tworzonym pliku XML zapisywany jest znacznik deklaracji XML <?XML
version='1.0'?>. Jest on elementem, ktry musi si znale we wszystkich poprawnie
sformuowanych dokumentach XML. W wierszach 13. i 14. definiowany jest sposb, w jaki ma
by zapisywany generowany kod XML. Wiersz 13. informuje ASP.NET, i naley stosowa
wcicia, a wiersz 14. e pojedyncze wcicie ma mie wielko 3 znakw odstpu. Dziki
wykorzystaniu wci, odczytanie i analiza zawartoci pliku XML bdzie znacznie atwiejsza.
Waciwoci Formatting mona przypisa warto Indented bd None. Znak stosowany przy
tworzeniu wci mona okreli przy wykorzystaniu waciwoci IndentChar.
Generacja danych rozpoczyna si w wierszu 15. Znaczniki otwierajce i zamykajce elementw
generowane s odpowiednio przy uyciu metod WriteStartElement oraz WriteEndElement.
W wierszu 15. w pliku zapisywany jest znacznik otwierajcy <bookstore>, natomiast w wierszu
32. odpowiadajcy mu znacznik zamykajcy </bookstore>. W wierszu 16. generowany jest
otwierajcy znacznik <book>, a w wierszu 31. odpowiadajcy mu znacznik zamykajcy.
W wierszach 17. i 18. generowane s atrybuty genre oraz style znacznika <book> oraz ich
wartoci. Metoda WriteElementString daje moliwo wygenerowania prostego elementu
skadajcego si ze znacznika otwierajcego, zamykajcego oraz pewnej, podanej zawartoci.
Metoda ta zostaa wykorzystana w wierszu 20.
writer.WriteElementString("title", "Vietnam")

Jej uycie powoduje wygenerowanie poniszego fragmentu kodu XML:


<title>Vietnam</title>

Jak wida metoda ta generuje dwa znacznik otwierajcy i zamykajcy okrelone za pomoc
pierwszego argumentu, a wewntrz nich umieszcza acuch znakw podany jako drugi argument.
Po zamkniciu wszystkich wygenerowanych wczeniej znacznikw otwierajcych, zawarto
pliku jest oprniana (wiersz 32.). Proces ten przypomina nieco oprnianie bufora
wyjciowego (patrz rozdzia 5., pt.: Podstawowe wiadomoci o tworzeniu formularzy
internetowych), z t rnic, i dane s zapisywane w pliku, a nie przekazywane do przegldarki.
I w kocu, w wierszu 38., obiekt pisarza jest zamykany.

Notatka
Standardowo, wywoanie metody Close spowoduje zapisanie wygenerowanego kodu XML w
pliku. Wywoywanie metody Flush nie jest konieczne, chyba e ten sam obiekt ma by
ponownie wykorzystany do stworzenia innego pliku.

Wywoanie metody Close powoduje take automatyczne zamknicie wszystkich otworzonych


znacznikw elementw i atrybutw; jednak zaleca si, aby zawsze robi to wasnorcznie.

Wyniki wykonania strony z listingu 11.5 zostay przedstawione na rysunku 11.5.

Rysunek 11.5 Plik books2.xml wygenerowany przez stron ASP.NET z listingu 11.5
Walidacja dokumentw XML
Dokumenty XML musz by poprawnie sformuowane w kocu ma to by uniwersalny jzyk
sucy do reprezentacji danych. Gdyby dokument XML nie by poprawnie sformuowany, to
osignicie tego standardu byoby niezwykle trudne.
Wyobra sobie dwie firmy prbujce wymieni informacje zapisane w pliku XML. Plik
niepoprawnie sformuowany umoliwiaby rn interpretacj danych, co mogoby doprowadzi
do tragicznych skutkw; zwaszcza gdyby obie firmy faktycznie zinterpretoway zawarto pliku
w odmienny sposb.
ASP.NET pozwala na walidacj danych XML na podstawie schematu lub definicji typu
dokumentu (ang.: Document Type Definition, w skrcie DTD). DTD to kolejny sposb opisu
formatu danych XML, ktrego dokadniejsze omwienie wykracza poza ramy niniejszej ksiki.
Aby sprawdzi poprawno dokumentu XML naley stworzy nowy obiekt
XmlValidatingReader oraz okreli typ walidacji jak naley przeprowadzi:
'tutaj tworzymy obiekt czytelnika
dim validator as new XMLValidatingReader(reader)

validator.ValidationType = ValidationType.DTD

jeli jest uywany plik DTD, lub:


validator.ValidationType = ValidationType.XDR

jeli uywamy schematw (plikw .xdr).


Nastpnie dodawana jest procedura obsugi zdarzenia wykorzystywana przy walidacji. Uyje ona
podanego schematu lub definicji typu dokumentu (DTD) okrelonego w przestrzeni nazw
dokumentu XML. W tym rozdziale do walidacji dokumentw XML, bdziemy uywali
schematw. Dodajmy teraz odpowiedni deklaracj do nowego pliku XML books2.xml.
Wystarczy zmieni element bookstore w poniszy sposb:
<bookstore xmlns="x-schema:books-schema.xdr">

Jak na razie nie musisz si przejmowa dokadnym zrozumieniem skadni tego elementu.
Informuje ona ASP.NET, e do walidacji dokumentu naley uy schematu zapisanego w pliku
books-schema.xdr. Jeli plik XML bdzie poprawnie sformuowany i zgodny ze schematem, to nie
powiniene zauway adnej rnicy, a wyniki bd przypomina te uzyskane w poprzednich
przykadach.
Listing 11.6 przedstawia pocztkow cz naszego przykadowego kodu (jego pozosta cz
przedstawiem na listingu 11.7).

Listing 11.6 Walidacja danych XML (XMLValidate.aspx)


1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Xml" %>
3 <%@ Import Namespace="System.Xml.Schema" %>
4
5 <script runat="server">
6 private reader as XMLTextReader
7 private validator as XMLValidatingReader
8
9 sub Page_Load(obj as object, e as eventargs)
10 try
11 reader = new XMLTextReader(Server.MapPath("books2.xml"))
12
13 validator = new XMLValidatingReader(reader)
14 validator.ValidationType = ValidationType.XDR
15
16 AddHandler validator.ValidationEventHandler, new _
17 ValidationEventHandler(addressof ShowError)
18
19 While validator.Read()
20 End While
21 catch ex as Exception
22 Response.Write("Bd dostpu do pliku XML!")
23 finally
24 reader.close
25 end try
26 end sub

Analiza
Powyszy listing przypomina nieco wszystkie przykady przedstawione we wczeniejszej czci
tego rozdziau. Zwr uwag, i w wierszu 3. importowana jest dodatkowa przestrze nazw
System.Xml.Schema. Bdzie ona konieczna do sprawdzenia poprawnoci dokumentu XML na
podstawie schematw. Proces walidacji rozpoczynany jest od stworzenia obiektu
XmlTextReader (w wierszu 6.) i otworzenia pliku XML o nazwie books2.xml (w wierszu 11.).
Nastpnie, w wierszu 13., jest tworzony obiekt XmlValidatingReader, przy czym, przy jego
utworzeniu zostaje wykorzystany obiekt XmlTextReader. Dziki temu utworzony obiekt bdzie
wiedzia, ktry plik naley sprawdzi. W wierszu 14. okrelamy, e walidacja ma zosta
przeprowadzona na podstawie pliku schematu zdefiniowanego w analizowanym pliku XML.
Wikszo wbudowanych zdarze ASP.NET dysponuje predefiniowanymi procedurami obsugi
(na przykad, zdarzenie Load obiektu Page obsugiwane jest przez procedur Page_Load).
Jednak zdarzenia zwizane z walidacj dokumentw XML nie dysponuj adnymi
predefiniowanymi procedurami obsugi. Z tego powodu konieczne jest wasnorczne
zdefiniowanie procedury obsugi tego zdarzenia, przy uyciu metody AddHandler (wiersze 16. i
17.). Pierwszym argumentem wywoania tej metody jest zdarzenie, ktre ma by obsugiwane, a
drugim wskanik do metody ktra ma je obsugiwa. Operator addressof uyty w wierszu
17. zwraca wskanik do procedury ShowError, ktra wykona pewne czynnoci w przypadku gdy
walidacja dokumentu nie zakoczy si pomylnie. Metodzie tej mona nada cakowicie dowoln
nazw. Nie trzeba zwraca bacznej uwagi na szczegy dziaania tego mechanizmu, lecz warto
zna skadni jakiej naley uy przyda si ona w przypadku gdyby kiedy musia sprawdza
poprawno dokumentw XML.
Warto take zwrci uwag na pust ptl while zapisan w wierszach 19. i 20. Standardowo
naleaoby w niej odczytywa dane i w jaki sposb wywietla interesujce nas informacje.
Niemniej jednak w przypadku sprawdzania poprawnoci danych XML, nie jest to konieczne.
Teraz interesuje nas tylko odczytanie danych i sprawdzenie czy s poprawne; nie mamy zamiaru
ich wywietla.
Pozosta cz naszej przykadowej strony ASP.NET stanowi kod procedury ShowError,
przedstawiony na listingu 11.7.

Listing 11.7 Procedura ShowError


27 sub ShowError(obj as object, e as ValidationEventArgs)
28 Response.write("<font color=""red"">" & e.Message & _
29 "<br>")
30
31 if (reader.LineNumber > 0)
32 Response.Write("Line: " & reader.LineNumber & _
33 " Position: " & reader.LinePosition & _
34 "</font><p>")
35 end if
36 end sub
37 </script>
38
39 <html><body>
40
41 </body></html>

Analiza
Na powyszym listingu zostaa zdefiniowana procedura ShowError, wywoywana za kadym
razem, gdy w odczytywanym pliku XML zostan odnalezione jakiekolwiek nieprawidowoci.
Zwr uwag na drugi argument, typu ValidationEventArgs umieszczony w jej definicji.
Zawiera on waciwo Message, w ktrej s zapisywane opisy wszystkich bdw odnalezionych
w analizowanym dokumencie XML. W wierszach 28. i 29. opis ten jest wywietlany na
wynikowej stronie WWW w kolorze czerwonym. W wierszach od 32. do 34. wywietlane jest
pooenie kodu XML, w ktrym wykryto bd. Informacje te, niezwykle przydatne przy lokalizacji
i poprawianiu wszelkich problemw, mona okreli za pomoc waciwoci LineNumber oraz
LinePosition klasy XmlValidatingReader.

Notatka
By moe zauwaye, e w kodzie przedstawionym na listingu 11.6 deklaracja obiektu klasy
XmlTextReader zostaa przeniesiona poza procedur Page_Load. Dziki temu, obiekt ten
bdzie mg by uywany we wszystkich funkcjach i metodach zdefiniowanych na tej samej
stronie ASP.NET, a nie wycznie w procedurze Page_Load. Wanie dziki temu, mona go
wykorzysta take wewntrz procedury ShowError.

Gdyby deklaracja tego obiektu pozostaa wewntrz procedury Page_Load, to odwoanie si do


obiektu czytelnika w procedurze ShowError spowodowaoby zgoszenie bdu.

Jeli zawarto pliku books2.xml bdzie taka sama jak zawarto pliku books.xml, to adne bdy
nie powinne si pojawi i wszystko pjdzie zgodnie z planem. Jednak zmodyfikujmy nieznacznie
kod tego pliku, tak aby efekty dziaania walidacji stay si widoczne. Spjrz na kod XML
przedstawiony na listingu 11.8.

Listing 11.8. Books2.xml bdnie zapisany dokument XML


1 <?xml version="1.0"?>
2 <bookstore xmlns="x-schema:books-schema.xdr">
3 <book genre="history" style="hardcover">
4 <title>Vietnam</title>
5 <author>
6 <first-name>Michael</first-name>
7 <last-name>Avery</last-name>
8 </author>
9 <price>siema!</price>
10 </book>
11 </bookstore>

Zgodnie ze schematem zdefiniowanym w pliku books-schema.xdr, w powyszym pliku mona


doszuka si dwch nieprawidowoci. Pierwsz z nich jest brak atrybutu style elementu book, a
drug zapisanie zwykego acucha znakw w elemencie pirce (ktry powinien zawiera
liczb). Na rysunku 11.6 przedstawiem komunikaty o bdach wywietlone w przegldarce w
wyniku wykonaniu strony ASP.NET przedstawionej na listingach 11.6. oraz 11.7.

Rysunek 11.6. Bdy wywietlone podczas sprawdzania poprawnoci dokumentu XML


Gdyby w ptli while na listingu 11.6. zosta umieszczony kod prezentujcy informacje
odczytywane z pliku XML, to na rysunku 11.6. zostayby one wywietlone wraz z informacjami o
bdach.

Model obiektw dokumentu XML


Model obiektw dokumentu XML (okrelany w skrcie jako DOM) jest specyfikacj opracowan
przez W3C szczegowo opisujc jak powinny zachowywa si aplikacje korzystajce z
informacji zapisanych w jzyku XML. Specyfikacja ta okrela klasy jakie powinne by stosowane,
sposoby odczytu i zapisu kodu XML oraz cechy jakimi powinne charakteryzowa si uywane
klasy. Sam specyfikacj moesz znale na witrynie W3C, na poniszych stronach WWW:
http://www.w3.org/TR/REC-DOM-Level-1/
oraz
http://www.w3.org/TR/DOM-Level-2-Core/

Jak na razie nie zwracalimy adnej uwagi na DOM XML. Obiekty XmlTextReader oraz
XmlTextWriter nie implementuj DOM-u, gdy jego uycie wie si ze zbyt duymi kosztami.
Obie te klasy zostay stworzone z myl o szybkim dostpie do danych XML, ktry nie
wymagaby wykorzystania wielu zasobw systemowych. Niemniej jednak, czasami moe si
okaza, e do edycji, modyfikacji oraz poruszania si po dokumencie XML bd nam potrzebne
pene moliwoci funkcjonalne udostpniane przez DOM.
Podstawowe moliwoci funkcjonalne opisane przez XML DOM udostpnia klasa XmlNode.
Reprezentuje ona pojedynczy element nalecy do drzewa dokumentu XML i moe zosta
wykorzystana do przejcia do wzw podrzdnych oraz do wza nadrzdnego, jak rwnie do
edycji i usuwania informacji. XmlDocument klasa potomna XmlNode pozwala na
wykonywanie czynnoci (takich jak otwieranie bd zapis) na caym dokumencie XML. W XML
DOM dostpnych jest wiele innych klas bazujcych na klasie XmlNode, takich jak XmlElement
czy te XmlAttribute, jednak w tej ksice nie zostan one omwione. Sposb wzajemnego
wspdziaania poszczeglnych klas XML DOM przedstawiem na rysunku 11.7.

Rysunek 11.7. Wzajemne wspdziaanie klas sucych do obsugi danych XML,


opracowanych przez firm Microsoft
Opis rysunku:
XML Data dane XML
wszystkie pozostae nazwy uyte na rysunku pozostaj w oryginalnej postaci

XmlNode reprezentuje ga pliku XML, ktra zawiera wszystkie elementy podrzdne, atrybuty
oraz znaczniki otwierajcy i zamykajcy elementu. Na przykad, znaczniki
<title>...</title> stosowane w pliku books.xml to dwa elementy, lecz jeden wze. Kady
wze moe posiada wiele wzw podrzdnych; kady wze reprezentuje take inn ga. A
zatem, operujc na danych XML przy wykorzystaniu XML DOM robi si to w sposb
przypominajcy dziaanie na danych przechowywanych w tradycyjny sposb.
Na przykad, operujc na danych przy uyciu programu Microsoft Access, nie traktuje si
pocztku i koca tego samego pola jako dwch rnych obiektw stanowi one czci tego
samego pola. Klasy XmlTextReader oraz XmlTextWriter traktuj kady element dokumentu
XML jako niezalen jednostk, natomiast w przypadku wykorzystania DOM-u znacznik
otwierajcy oraz dopowiadajcy mu znacznik zamykajcy s uwaane za jedno pole. Pojcie
wzw w pliku XML przedstawiem na rysunku 11.8.
<?xml version="1.0"?>
1 <bookstore>
2 <book genre="novel" style="hardcover">
3 <title>The Handmaid's Tale</title>
4 <author>
5 <first-name>Margaret</first-name>
6 <last-name>Atwood</last-name>
</author>
7 <price>19.95</price>
</book>
8 <book genre="novel" style="paperback">
9 <title>The Poisonwood Bible</title>
10 <author>
11 <first-name>Barbara</first-name>
12 <last-name>Kingsolver</last-name>
</author>
13 <price>11.99</price>
</book>
</bookstore>

Rysunek 11.8. Wzy pliku XML

Pobieranie danych XML


Dane XML mona pobra do obiektu XmlDocument na kilka rnych sposobw. Dwa najczciej
stosowane to pobranie ich z obiektu XmlTextReader bd bezporednio z oryginalnego pliku
XML. Poniej przedstawione zostay oba te sposoby:
dim xmldocument as XmlDocument = new XmlDocument()

'pobranie informacji z obiektu XmlTextReader


dim reader as new XmlTextReader(server.MapPath("books.xml"))
xmldocument.Load(reader)

'pobranie bezporednio z pliku


xmldocument.Load(server.MapPath("books.xml"))

Ale po co korzysta z obiektu XmlTextReader skoro mona pomin etap jego tworzenia i
wczyta dane bezporednio z pliku XML? Czasami uycie obiektu XmlDocument nie bdzie
konieczne i wystarczy zastosowanie obiektu XmlTextReader. Niemniej jednak, jeli okae si, e
konieczne jest wykorzystanie penych moliwoci funkcjonalnych obiektu XmlDocument, to nie
trzeba bdzie bezustannie pobiera jego zawartoci. Zamiast tego wystarczy odczyta j z
uywanego obiektu czytelnika (XmlTextReader).
Po pobraniu danych mona je przeglda przy wykorzystaniu obiektu XmlNode. Na przykad,
mona analizowa poszczeglne wzy i wywietla zawarte w nich informacje w sposb
przypominajcy pobieranie kolejnych elementw przy wykorzystaniu metody Read obiektu
XmlTextReader. Stosowny przykad przedstawiem na listingach 11.9 oraz 11.10.

Listing 11.9. Otwieranie dokumentu XML przy uyciu obiektu XmlDocument


(XMLDOMRead.aspx)
1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Xml" %>
3
4 <script runat=server>
5 private i as integer
6 private strOutput as string = ""
7
8 sub Page_Load(obj as object, e as eventargs)
9 dim xmldoc as new XMLDocument()
10
11 try
12 xmldoc.Load(Server.MapPath("books.xml"))
13 ShowTree(xmldoc.DocumentElement)
14
15 catch ex as Exception
16 strOutput = "Bd dostpu do pliku XML!"
17 end try
18
19 output.Text = strOutput
20 end sub

Analiza
Pierwsza cz kodu tej strony jest bardzo prosta. W wierszu 9. tworzony jest nowy obiekt
XmlDocument, ktry zostaje zapisany w zmiennej xmldoc. Nastpnie, w wierszu 12., s do niego
wczytywane informacje z pliku XML. Procedura ShowTree przedstawiona na listingu 11.10
analizuje wszystkie wzy tego pliku i wywietla informacje o nich. Waciwo
DocumentElement obiektu XmlDocument zwraca pierwszy element pliku XML (w naszym
przypadku bdzie to deklaracja stosowanej wersji jzyka XML). Ten pocztkowy element jest
przekazywany do procedury ShowTree, dziki czemu moe ona wywietli zawarto caego
pliku.

Listing 11.10. Analiza zawartoci pliku XML przy wykorzystaniu obiektw XmlNode (cig
dalszy XMLDOMRead.aspx)
21 sub ShowTree(node as XMLNode)
22 Dim attrnode As XmlNode
23 Dim map As XmlNamedNodeMap
24
25 If Not(node.HasChildNodes)
26 strOutput += "&nbsp;&nbsp;<b>" & _
27 node.Name & "</b> &lt;" & _
28 node.Value & "&gt;<br>" & vbcrlf
29 Else
30 strOutput += "<b>" & node.Name & "</b>"
31 If node.NodeType = XmlNodeType.Element Then
32 map = node.Attributes
33 For Each attrnode In map
34 strOutput += " <b>" & attrnode.Name & _
35 "</b> &lt;" & _
36 attrnode.Value & "&gt; " & vbcrlf
37 Next
38 End If
39 strOutput += "<br>"
40 End If
41
42 If node.HasChildNodes then
43 node = node.FirstChild
44 While not IsNothing(node)
45 ShowTree(node)
46 node = node.NextSibling
47 end while
48 end if
49 end sub
50 </script>
51
52 <html><body>
53 <asp:Label id="output" runat="server" />
54 </body></html>

Nowe okrelenie
Procedura ShowTree wykorzystuje pojcie programistyczne nazywane rekurencj. Procedury
rekurencyjne wywouj same siebie, a do momentu spenienia pewnego warunku. W naszym
przypadku procedura ShowTree wywietla informacje na temat wza i, jeli posiada on jakie
wzy podrzdne, wywouje sam siebie dla kadego z nich, przekazujc w wywoaniu wze,
ktry ma zosta przeanalizowany. Jeli natomiast nie ma adnych wzw podrzdnych, procedura
przechodzi do analizy kolejnego wza. W taki sposb metoda ShowTree schodzi w gb
hierarchii dokumentu XML i wywietla informacje o wszystkich wzach podrzdnych. Ogln
zasad dziaania procedury ShowTree przedstawiem na rysunku 11.9.

Rysunek 11.9. Wykorzystanie rekurencji do przeanalizowania wszystkich wzw dokumentu


XML
Opis rysunku:
Call function Wywoanie funkcji
Dysplay Wywietlenie danych dla danego wza
Child node? Czy s wzy podrzdne?
Yes Tak
No Nie
Move to sibling Przejcie do kolejnego wza (jeli jest)
Go to Przejcie do wza podrzdnego
Time called Kolejno wywoania
Current node Analizowany wze
Children Ilo wzw podrzdnych
Move to Przejcie do
(pierwsze trzy kolumny tabelki u dou rysunku bez zmian)
(w ostatniej kolumnie Move to...)
1. bookstore child 1 pierwszego wza podrzdnego wza bookstore
2. book child 1 pierwszego wza podrzdnego wza book
3. ... drugiego wza podrzdnego wza book
4. ... pierwszego wza podrzdnego wza author
5. ... drugiego wza podrzdnego wza author
6. ... trzeciego wza podrzdnego wza book
7. ... drugiego wza podrzdnego wza bookstore
8. ... pierwszego wza podrzdnego wza book
9. ... drugiego wza podrzdnego wza book

Analiza
Jeli aktualnie analizowany wze nie ma adnych wzw podrzdnych (co sprawdza warunek
umieszczony w wierszu 25.), to po prosty wywietlana jest jego nazwa i warto. Zmienna
strOutput suy do gromadzenia informacji na temat analizowanego wza, jej zawarto
zostanie wywietlona po zakoczeniu analizy dokumentu (w wierszu 53.), jako tekst etykiety
output. Jeli jednak s wzy podrzdne i dany wze jest elementem, to wywietlane s jego
wszystkie atrybuty. Obiekt XmlNamedNodeMap deklarowany w wierszu 23. i uywany w wierszu
32. i 33. reprezentuje kolekcj atrybutw wza. Wartoci atrybutw mona pobra przetwarzajc
po kolei wszystkie elementy tej kolekcji (patrz wiersze od 33. do 37.).
Jeli aktualnie analizowany wze posiada jakie wzy podrzdne, to konieczne bdzie
rekurencyjne wywoanie procedury ShowTree. Wywoanie tej procedury dla kadego z wzw
podrzdnych realizowane jest przez blok kodu zapisany w wierszach od 42. do 48. W pierwszej
kolejnoci zmiennej node przypisywany jest pierwszy wze podrzdny biecego wza.
Zmienna ta jest nastpnie przekazywana jako argument wywoania procedury ShowTree, ktra
wywietli informacje na temat przekazanego wza. Jeli take ten wze ma wzy podrzdne, to
okrelany jest pierwszy z nich i cay proces rozpoczyna si ponownie. Ptla while
rozpoczynajca si w wierszu 44. oraz wykorzystana wewntrz niej waciwo NextSibling
(wiersz 46.) umoliwia pobranie wszystkich wzw podrzdnych, kadego z wzw
znajdujcych si w dokumencie XML.
Wyobra sobie otwieranie prezentw podczas wit Boego Narodzenia. Otwierasz jedno pudeko,
sprawdzasz jego zawarto i przechodzisz do nastpnego. Jednak kto z rodziny chcia by
dowcipny i da Ci ogromne pudo, gdy je otworzye, znalaze kolejne, nieco mniejsze. Wewntrz
niego znalaze jeszcze mniejsze pudeko i tak dalej, a w kocu odnalaze waciwy prezent.
Cay proces sprawdzania prezentw mona by podsumowa w nastpujcy sposb: otwierae
jeden prezent i jeli nie byo w nim adnych mniejszych pudeek, to przechodzie do kolejnego
prezentu. Jeli jednak w prezencie byy jakie mniejsze pudeka, to otwierae je nim zaje si
kolejnym prezentem. Rekurencja jest bardzo podobnym procesem otwierasz wszystkie gazie
pliku XML, a jeli ktra z nich zawiera wzy podrzdne, to przed przejciem do kolejnej gazi,
zostan one otworzone i przeanalizowane.
Metoda ShowTree analizuje ca zawarto dokumentu XML i generuje wyniki przedstawione na
rysunku 11.10.

Rysunek 11.10. Wyniki wykonania kodu przedstawionego na listingach 11.9 oraz 11.10,
wywietlone w przegldarce

Tak Nie
Obiektw XmlDocument oraz XmlNode uywaj Nie uywaj obiektw XmlDocument oraz
gdy bdziesz musia stworzy lub XmlNode jeli chcesz tylko odczyta informacje
zmodyfikowa informacje zapisane w jzyku wykorzystanie tych obiektw wie si z
XML. dodatkowymi kosztami, ktre mog
spowodowa niepotrzebne pogorszenie
efektywnoci dziaania aplikacji.

Modyfikacja danych XML


Obiekt XmlDocument udostpnia take wiele metod sucych do tworzenia i modyfikacji
dokumentw XML. Przy tworzeniu nowych elementw mona posuy si ktr z metod
Create, na przykad: CreateComment, CreateAttribute, CreateNode, itp. Posugujc si
tymi metodami mona utworzy praktycznie kady rodzaj elementu. Oto przykad:
'tworzymy nowy element
dim eleBook as XmlElement = xmldoc.CreateElement("Book")
dim attStyle as XmlAttribute = xmldoc.CreateAttribute("style")

eleBook.SetAttributeNode(attStyle)
eleBook.SetAttribute("style", "hardcover")

dim root as XmlElement = xmldoc.Item("bookstore")


root.AppendChild(eleBook)

W wierszu 2. powyszego przykadu tworzony jest nowy obiekt XmlElement, a w wierszu 3.


nowy obiekt XmlAttribute. Nastpnie, przy wykorzystaniu metody SetAttributeNode,
atrybut ten dodawany jest do elementu, po czym zostaje okrelona jego warto (suy do tego
metoda SetAttribute). I w kocu, nowy element dodawany jest do gwnego elementu
dokumentu XML bookstore.
Modyfikacja danych XML jest niezwykle prosta sprowadza si ona do podania nowych
wartoci. Oto przykad:
if node.Name = "price" then
node.Value = "8.99"
end if

I to wszystko! Jeli konieczne bdzie zmodyfikowanie wszystkich wartoci w pliku, to mona to


zrobi przy wykorzystaniu rekurencji, dziki ktrej pobranie wszystkich wzw dokumentu nie
przysparza adnych problemw. W tabeli 11.2 przedstawiem wybrane metody klasy
XmlDocument suce o tworzenia i modyfikacji danych XML.

Tabela 11.2. Metody obiektu XmlDocument suce do modyfikacji danych XML


Metoda Opis
AppendChild Dodaje podany wze na kocu listy wzw potomnych biecego
wza.
CreateAttribute Tworzy obiekt XmlAttribute reprezentujcy atrybut o podanej
nazwie.
CreateCDataSection Tworzy sekcj CData o podanej zawartoci.
CreateComment Tworzy obiekt XmlComment o podanej zawartoci.
CreateElement Tworzy obiekt XmlElement reprezentujcy element o podanej
nazwie.
CreateNode Tworzy obiekt XmlNode reprezentujcy wze okrelonego typu, o
podanej nazwie i nalecy do przestrzeni nazw o podanym adresie
URI (co zapewnia unikalno schematw nazw).
CreateTextNode Tworzy obiekt XmlText o okrelonej zawartoci.
CreateXmlDeclaration Tworzy obiekt XmlDeclaration reprezentujcy sekcj deklaracji
XML; okrela ona uywan wersj jzyka XML, sposb kodowania
oraz podaje acuch znakw okrelajcy czy atrybuty s niezalene;
numer uywanej wersji jzyka XML musi mie warto "1.0".
GetElementById Zwraca obiekt XmlElement reprezentujcy element o okrelonym
identyfikatorze.
GetElementByTagName Zwraca kolekcj XmlNodeList zawierajc wszystkie elementy
odpowiadajce podanej nazwie.
ImportNode Importuje wskazany wze z innego dokumentu XML; warto
logiczna (Boolean) okrela czy naley take importowa wszystkie
wzy podrzdne.
InsertAfter Wstawia pierwszy podany obiekt XmlNode po drugim podanym
obiekcie XmlNode.
InsertBefore Wstawia pierwszy podany obiekt XmlNode przed drugim podanym
obiektem XmlNode.
PrependChild Dodaje podany wze na samym pocztku listy wzw podrzdnych.
RemoveAll Usuwa wszystkie wzy podrzdne oraz atrybuty biecego wza.
RemoveChild Usuwa wskazany wze podrzdny.
ReplaceChild Zastpuje drugi podany obiekt XmlNode, pierwszym podanym
obiektem.
WriteContentTo Zapisuje wszystkie wzy podrzdne biecego wza w podanym
obiekcie XmlWriter (na przykad, w XmlTextWriter).
WriteTo Zapisuje biecy wze w podanym obiekcie XmlWriter (na
przykad, w XmlTextWriter).

Notatka
Zwr uwag, i niektre z tych metod s przecione, a ich inne wersje umoliwiaj
podawanie innych argumentw. Wszelkie informacje na ten temat znajdziesz w dokumentacji
.NET SDK.

Wiele spord metod klasy XmlDocument jest take dostpnych w klasie XmlElement oraz
XmlNode.

Do zapisania wszelkich wprowadzanych modyfikacji suy metoda Save:


xmldoc.Save("books2.xml")

Podpowied
Jeli chcesz dopisa nowe informacje do istniejcego pliku XML, wystarczy pobra jego
zawarto do obiektu XmlDocument, wprowadzi niezbdne zmiany i zapisa dokument pod t
sam nazw. Poprzednia wersja pliku zostanie nadpisana, jednak adne zapisane w nim
informacje nie bd utracone, gdy wczeniej zostay w caoci wczytane do obiektu
XmlDocument.

Listing 11.11 przedstawia przykad strony ASP.NET, ktra wczytuje ca zawarto pliku XML i
dopisuje do niego nowy wze.

Listing 11.11. Dopisywanie danych przy wykorzystaniu DOM (XMLDOMWrite.aspx).


1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Xml" %>
3
4 <script runat=server>
5 sub Page_Load(obj as object, e as eventargs)
6 dim xmldoc as new XMLDocument()
7
8 try
9 xmldoc.Load(Server.MapPath("books3.xml"))
10 dim eleBook as XmlElement = _
11 xmldoc.CreateElement("book")
12 dim attStyle as XmlAttribute = _
13 xmldoc.CreateAttribute _
14 ("style")
15
16 eleBook.SetAttributeNode(attStyle)
17 eleBook.SetAttribute("style", "hardback")
18
19 dim root as XmlElement = xmldoc.Item("bookstore")
20 root.AppendChild(eleBook)
21
22 xmldoc.Save(Server.MapPath("books3.xml"))
23
24 catch ex as Exception
25 strOutput = "Bd dostpu do danych XML!"
26 end try
27
28 output.Text = "Poprawnie dopisano dane do plik XML"
29 end sub
30 </script>
31
32 <html><body>
33 <asp:Label id="output" runat="server" />
34 </body></html>

Analiza
Kod umieszczony w wierszach do 1. do 9. jest cakowicie typowy jest w nim tworzony obiekt
XmlDocument, do ktrego jest nastpnie wczytywana zawarto pliku books3.xml. W wierszach
od 10. do 14. tworzony jest nowy obiekt XmlElement reprezentujcy element book oraz nowy
obiekt XmlAttribute reprezentujcy atrybut tego elementu. Zwr uwag, i oba te obiekty
tworzone s przy wykorzystaniu metod istniejcego obiektu XmlDocument zapisanego w
zmiennej xmldoc. Dziki temu tworzone elementy bd miay identyczny format co dane ju
zapisane w pliku.
Wiersz 16. deklaruje, e stworzony atrybut jest czci elementu book, a wiersz 17. okrela jego
warto. W wierszu 19. pobierany jest element gwny pliku XML element bookstore; do
ktrego dopisujemy nastpnie nowy element book (w wierszu 20.). I w kocu, przy uyciu
metody Save, wszystkie wprowadzone modyfikacje s z powrotem zapisywane w pliku
books3.xml; przy czym adne zapisane w nim informacje nie zostay utracone.

XML oraz DataSet


XML w rodowisku .NET jest cile zwizany z ADO.NET. Dane wewntrz obiektw DataSet
s bowiem przechowywane wanie w formacie XML. Oznacza to, e zawarto obiektw
DataSet jest w pamici komputera przechowywana jako dane XML, a nie jest reprezentowana
przy wykorzystaniu jakiego abstrakcyjnego modelu danych. A zatem, na danych XML operujemy
zarwno bezporednio przy uyciu klas sucych do obsugi XML, jak rwnie porednio
podczas korzystania z ADO.NET. DataSet po prostu udostpnia inny sposb prezentacji danych
XML.
Zastanwmy si zatem czym dysponujemy. Z jednej strony mamy ADO.NET oraz jego klasy.
Dostpne s proste klasy zapewniajce szybki i atwy dostp do danych, takie jak
OleDbDataReader; jak rwnie klasy bardziej zoone na przykad: DataSet ktre
zawieraj informacje relacyjne i udostpniaj znacznie wiksze moliwoci funkcjonalne ni klasa
OleDbDataReader.

Dysponujemy take klasami operujcymi bezporednio na danych XML. Wrd nich take mona
znale klasy cakiem proste jak i bardzo zoone. Klasa XmlTextReader zapewnia proste
moliwoci odczytu zawartoci plikw XML, natomiast klasa XmlDocument dostarcza znacznie
bogatsze moliwoci funkcjonalne. Niemniej jednak klasa XmlDocument niezbyt dobrze
reprezentuje dane relacyjne i wanie z tego powodu zostaa wprowadzona klasa
XmlDataDocument.

XmlDataDocument jest dla XML tym, czym DataSet jest dla ADO.NET. Obiekty obu tych klas
s do siebie bardzo podobne i kady z nich, z atwoci mona skonwertowa na drugi. Dziki
temu, klasy te stanowi pomost pomidzy ADO.NET oraz XML.
Obiekty klasy XmlDataDocument s zblione do obiektw klasy XmlDocument lecz w
odrnieniu od nich wykorzystuj relacyjn reprezentacj danych, zblion do tej, stosowanej w
obiektach DataSet. Obiekty XmlDataDocument mona stosowa wszdzie tam gdzie s
uywane obiekty XmlDocument, a co wicej, nawet metody i waciwoci obu tych klas s
identyczne.
Za kadym razem, gdy do obiektu XmlDataDocument adowane s informacje, rodowisko .NET
automatycznie tworzy obiekt DataSet, ktry mona pobra za porednictwem waciwoci o tej
samej nazwie. Kolumny tego obiektu oraz ich typy okrelane s na podstawie schematu XML.
Jeli aden schemat nie zostanie podany, to rodowisko .NET samodzielnie okreli struktur
danych.
Dziki temu mona modyfikowa dane w dowolny sposb. Na przykad, mona otworzy plik
XML przy wykorzystaniu klas XML a nastpnie przenie je do obiektu DataSet i powiza
elementami kontrolnymi serwera. Mona take pobra informacje przechowywane w bazie danych
przy uyciu obiektu DataSet i zapisa w formacie XML. Modyfikacje wprowadzane w obiektach
XmlDataDocument mog lecz nie musz powodowa zmian w obiektach DataSet. Jeli nowe
dane odpowiadaj polom obiektu DataSet, to zostanie do niego dodany nowy wiersz.
Wzajemne zwizki pomidzy obiektami klas XmlDataDocument oraz DataSet przedstawiem na
rysunku 11.11.

Rysunek 11.11. Wzajemny zwizek pomidzy obiektami kas DataSet oraz XmlDataDocument
Opis rysunku
XML file plik XML
Validations walidacja, transformacje kodu XML, i tak dalej
Database baza danych
Managed Providers Zarzdzani dostawcy danych (np. ADO.NET)
Data binding wizanie danych, wizualne narzdzia projektowania elementw sterujcych, itp.
XmlTextReader, XmlDataDocument, DataSet bez zmian

Przyjrzyjmy si wzajemnym zwizkom obiektw obu tych klas. W przedstawionym poniej


przykadzie, za porednictwem obiektu XmlDataDocument pobierzemy dane z pliku books.xml i
zapiszemy je w obiekcie DataSet, a nastpnie wywietlimy je na dwa rne sposoby.
Przyjrzyjmy si teraz kodowi przykadu, ktry przedstawiem na listingu 11.12, w ktrym zosta
wykorzystany zarwno obiekt DataSet jak i XmlDataDocument (cz HTML tej strony skada
si jedynie z elementu Label oraz dwch elementw DataGrid ktrych zawarto jest
generowana na serwerze).

Listing 11.12. Wywietlanie danych przy wykorzystaniu obiektw DataSet oraz


XmlDataDocument
1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Xml" %>
3 <%@ Import Namespace="System.Data" %>
4 <%@ Import Namespace="System.Data.OleDb" %>
5
6 <script runat=server>
7 private i, j as integer
8 private strOutput as string = ""
9
10 sub Page_Load(obj as object, e as eventargs)
11 dim xmldoc as new XMLDataDocument()
12
13 try
14 xmldoc.DataSet.ReadXml(Server.MapPath("books3.xml"))
15
16 'select data view and bind to server control
17 DataGrid1.DataSource = xmldoc.DataSet
18 DataGrid1.DataMember = xmldoc.DataSet.Tables(0). _
19 TableName
20 DataGrid2.DataSource = xmldoc.DataSet
21 DataGrid2.DataMember = xmldoc.DataSet.Tables(1). _
22 TableName
23
24 DataGrid1.DataBind()
25 DataGrid2.DataBind()
26
27 For i = 0 To xmldoc.DataSet.Tables.Count - 1
28 strOutput += "TableName = """ & _
29 xmldoc.DataSet.Tables(i).TableName & """<br>"
30 strOutput += "&nbsp;&nbsp;" & "Columns count " & _
31 "= " & xmldoc.DataSet.Tables(i).Columns.Count. _
32 ToString() & "<br>"
33
34 For j = 0 To xmldoc.DataSet.Tables(i).Columns.Count-1
35 strOutput += "&nbsp;&nbsp;&nbsp;&nbsp;" & _
36 "ColumnName = """ & xmldoc.DataSet. _
37 Tables(i).Columns(j).ColumnName & ""," & _
38 " type = " & xmldoc.DataSet.Tables(i). _
39 Columns(j).DataType.ToString() & "<br>"
40 Next
41 Next
42
43 strOutput += "<p>"
44
45 catch ex as Exception
46 strOutput = "Error accessing XML file"
47 end try
48
49 output.Text = strOutput
50 end sub
51 </script>
52
53 <html><body>
54 <asp:Label id="output" runat="server" />
55
56 <asp:DataGrid id="DataGrid1" runat="server"
57 BorderColor="black"
58 GridLines="Vertical"
59 cellpadding="4"
60 cellspacing="0"
61 width="450"
62 Font-Name="Arial"
63 Font-Size="8pt"
64 HeaderStyle-BackColor="#cccc99"
65 FooterStyle-BackColor="#cccc99"
66 ItemStyle-BackColor="#ffffff"
67 AlternatingItemStyle-Backcolor="#cccccc" />
68 <p>
69 <asp:DataGrid id="DataGrid2" runat="server"
70 BorderColor="black"
71 GridLines="Vertical"
72 cellpadding="4"
73 cellspacing="0"
74 width="450"
75 Font-Name="Arial"
76 Font-Size="8pt"
77 HeaderStyle-BackColor="#cccc99"
78 FooterStyle-BackColor="#cccc99"
79 ItemStyle-BackColor="#ffffff"
80 AlternatingItemStyle-Backcolor="#cccccc" />
81 </body></html>

Analiza
Listing rozpoczyna si od stworzenia obiektu XmlDataDocument. Jednak zamiast wczytywa
dane bezporednio do tego dokumentu, s one pobierane za porednictwem metody ReadXml
waciwoci DataSet (patrz wiersz 14.). Metoda ta, jak si ju wkrtce przekonasz, tworzy
relacyjn reprezentacje pobieranych informacji.
Przejdmy na razie do wiersza 27. Rozpoczyna si w nim ptla for pobierajca wszystkie tabele
dostpne w obiekcie DataSet. Dla kadej z nich, wywietlana jest nazwa oraz ilo kolumn (patrz
wiersze od 27. do 32.). Kolejna ptla for (zapisana w wierszach od 34. do 40.) wywietla nazwy
oraz typy danych poszczeglnych kolumn dostpnych w danej tabeli. Obiekt DataSet wie jakie
typy danych reprezentuje kada z kolumn tabeli, gdy okrela jej schemat na podstawie struktury
danych.
Jednak dziki temu, e uywasz obiektu DataSet istnieje prostszy sposb na wykonanie tych
samych czynnoci. W wierszach od 17. do 22. informacje z obiektu DataSet s wizane z dwoma
rnymi elementami sterujcymi DataGrid zdefiniowanymi na naszej przykadowej stronie (za
chwil dowiesz si, dlaczego wykorzystywane s dwa obiekty). Wyniki wykonania tej strony
ASP.NET przedstawiem na rysunku 11.12

Rysunek 11.12. Prezentacja relacyjnych danych XML przy wykorzystaniu obiektw


XmlDataDocument oraz DataSet

Zaraz ale na rysunku widoczne s dwie tabele, a dysponujemy tylko jednym plikiem XML. Co
si zatem stao?
Ot rodowisko .NET odczytaa schemat XML i zauwaya, e dane mog zosta przedstawione
w sposb relacyjny. Konkretnie rzecz biorc, wydzielone i umieszczone w odrbnej tabeli zostay
informacje o autorze. rodowisko .NET automatycznie wygenerowaa take kolumn klucza
obcego, ktra poczya obie tabele! W obu elementach kontrolnych DataGrid moesz zobaczy
dane przedstawione w bardziej tradycyjny sposb.
Ale w jaki sposb obiekt DataSet okreli struktur danych bez wykorzystania schematu? W
rzeczywistoci jest to cakiem proste:
kady element zawierajcy atrybuty staje si tabel,
kady element zawierajcy inne elementy staje si tabel,
jeli istnieje kilka (co najmniej dwa) elementy o tych samych nazwach, to staj si one
tabel,
wszystkie elementy nalece bezporednio do gwnego elementu pliku (jego
bezporednie elementy podrzdne), staj si tabelami.
Wszystkie pozostae dane staj si kolumnami. Po okreleniu struktury, wszelkie dane XML
odpowiadajce kolumnom zostaj dodane do obiektu DataSet jako jego wiersze.
Jednak czy w rzeczywistoci s to dane relacyjne? Co si stanie gdy do pliku XML dodamy
kolejny wze book zawierajcy informacje o autorze podane w jednym z ju istniejcych
wzw? Na rysunku 11.13 przedstawiem dane jakie zostan wygenerowane w takiej sytuacji, w
formie, w jakiej zostayby one zaprezentowane przez elementy kontrolne DataGrid.

genre style title book_Id price


novel hardcover The Handmaids Tale 0 19.95
novel paperback The Poisonwood Bible 1 11.99
novel paperback The Poisonwood Bible 2 13.99

first-name last-name book-Id


Margaret Atwood 0
Barbara Kingsolver 1
Barbara Kingsolver 2

Rysunek 11.13. Dodawanie kolejnych danych relacyjnych

O rany! Ale to przecie nie jest to o co chodzio. Mechanizmy ASP.NET nie wykryy, e istnieje
ju autor Barbara Kingsolver i doday nowy rekord do tabeli autorw. Prba stworzenia klucza
gwnego skadajcego si z kolumn first-name oraz last-name spowoduje wystpienie
bdw. Niestety nie ma prostego sposobu rozwizania tego problemu. Aby poprawnie doda
dane, konieczna by bya rczna aktualizacja klucza gwnego i usunicie niepotrzebnego wiersza z
tabeli autorw.
Jednak bez wzgldu na to ograniczenie, moliwo reprezentacji danych w formie obiektw
DataSet oraz w formie danych XML jest niezwykle przydatna i uyteczna. Informacje relacyjne
mog by tworzone w formie danych XML i przekazywane do obiektu DataSet w celu zapisania
ich w bazie danych, lub w drugim kierunku odczytane z bazy danych i zapisane w pliku XML
w celu ich przesania.
Zgodnie z tym czego dowiedziae si w kilku ostatnich rozdziaach, zapis danych w formie
relacyjnej jest bardzo czsto spotykan i efektywn metod reprezentacji informacji, a XML bez
wtpienia doskonale si do tego celu nadaje. Poczone moliwoci klas XmlDataDocument oraz
DataSet umoliwiaj dostp i operowanie na danych relacyjnych pochodzcych z dowolnego
rda.

To nie jest ASP!


Jeli znasz tradycyjn technologi ASP, to informacje zawarte w tym rozdziale mog stanowi dla
Ciebie cakowit nowo, gdy obsuga jzyka XML niemal w ogle nie bya w niej dostpna. Nie
byo adnych wbudowanych obiektw sucych do obsugi danych tego typu, a niejednokrotnie
jedyn moliwoci wykorzystania XML-a bya implementacja penego modelu obiektw
dokumentu XML (ktre niewtpliwie nie bya atwym i przyjemnym rozwizaniem).
Na szczcie rodowisko .NET (a zatem take ASP.NET) dysponuje w peni zintegrowanymi
moliwociami obsugi jzyka XML. Dostpne s take dwa rne sposoby wykorzystania danych
XML za porednictwem ADO.NET oraz architektury XML.
Niestety ta nowa architektura ma bardzo mao wsplnego z wczeniej stosowanymi metodami
obsugi XML-a. Oznacza to e uywane metodologie s zupenie nowe i ich poznanie bdzie
wymagao nieco czasu. Na szczcie ASP.NET udostpnia dobrze zdefiniowane klasy i obiekty
stanowice spjny model programistyczny, ktre znacznie uatwi nauk.
Rozdzia 12.
Zastosowanie
zaawansowanych technik
obsugi danych
Bardzo szybko poznawae rne metody dostpu do danych. Teraz, kiedy ju opanowae
podstawy, nadszed czas aby przej na kolejny, bardziej zaawansowany poziom. W tym rozdziale
skoncentrujemy si na technikach bardziej zaawansowanych w porwnaniu z tymi,
przedstawionymi w poprzednich czciach niniejszej ksiki. Poznasz w nim nowe bazy danych
oraz nowe metody operowania na danych XML, ktre umoliwi Ci tworzenie profesjonalnych
aplikacji internetowych.
W pierwszej kolejnoci przyjrzymy si metodom pobierania informacji przy uyciu parametrw i
procedur zachowanych. Parametry pozwalaj na tworzenie zapyta w sposb bardziej efektywny.
Procedury zachowane s natomiast przygotowywanymi wczeniej poleceniami SQL, ktrych
wykorzystanie przynosi wiele korzyci, do ktrych naley zaliczy zwikszenie szybkoci
dziaania aplikacji oraz poprawienie jej przejrzystoci. Dowiesz si take, w jaki sposb, poprzez
wykorzystanie transakcji, mona zapewni, e polecenia SQL bd wykonywane poprawnie.
W drugiej czci tego rozdziau znajdziesz dodatkowe informacje na temat jzyka XML. Poznasz
klas XmlNavigator, ktrej mona uywa podobnie jak klasy XmlDocument. Wykorzystujc
obiekty tej klasy, mona zadawa pytania XPath oraz wykonywa przeksztacenia XSL. XPath to
jzyka zapyta stosowany wraz z jzykiem XML, natomiast XSL to jzyk pozwalajcy na
przeksztacanie plikw XML do postaci wszelkich innych dokumentw strukturalnych, takich jak
na przykad dokumenty HTML. Aby sta si ekspertem w dziedzinie ASP.NET koniecznie naley
pozna wiele rnych sposobw umoliwiajcych uzyskanie tego samego rezultatu. Po
przeczytaniu tego rozdziau bdziesz ju zna kilka rnych sposobw pobierania informacji z baz
danych oraz plikw XML.
W tym rozdziale omwione zostan nastpujce zagadnienia:
Czym s zapytania parametryzowane oraz jak naley je stosowa.
Czym s procedury zachowane oraz jak naley je stosowa.
Jak wykorzystywa transakcje.
Jakie s inne sposoby odczytywania zawartoci dokumentw XML.
Sposoby przeszukiwania plikw XML.
Sposoby przeksztacania plikw XML.
Zaawansowane techniki obsugi baz danych
Jak na razie wszelkie operacje zwizane z wykorzystaniem baz danych byy wykonywane przy
uyciu obiektw OleDbDataAdapter, OleDbCommand, DataSet oraz kilku innych. Dostarczaj
one wszelkich moliwoci funkcjonalnych potrzebnych przy tworzeniu aplikacji ASP.NET.
Jednak nie poznae jeszcze wszystkich moliwoci jakie obiekty te daj, w szczeglnoci chodzi
tu o parametry, procedury zachowane oraz transakcje.
Parametry s nowym sposobem tworzenia dynamicznych polece SQL. Ot zamiast tworzy
pytanie SQL skadajc je z fragmentw pochodzcych z wielu rnych rde, mona wykorzysta
parametry, ktre poinformuj baz danych jakie informacje naley zwrci. Takie rozwizanie jest
nie tylko prostsze, lecz take bardziej eleganckie. Procedury zachowane s natomiast
przygotowywanymi wczeniej poleceniami SQL, ktre mog poprawi efektywno dziaania
aplikacji. Wykorzystanie procedur zachowanych wraz z parametrami stanowi doskonay sposb
przeszukiwania i pobierania informacji z baz danych. Transakcje pozwalaj natomiast na
zapewnienie integralnoci i poprawnoci informacji poprzez wykonywanie operacji na bazach
danych zgodnie z paradygmatem wszystko albo nic. Oznacza to, e zostan wprowadzone
wszystkie modyfikacje lub nie zostanie wprowadzona adna z nich. Poznasz take kilka
najczstszych sytuacji, w ktrych s wykorzystywane transakcje.
Dziki tym zaawansowanym technikom obsugi baz danych bdziesz w stanie tworzy aplikacje o
znacznie wikszych moliwociach, a jednoczenie poprawi efektywno ich dziaania.

Zapytania sparametryzowane
Wyobra sobie proces budowy domu. Konieczna jest przy tym szczegowa znajomo wymiarw
elementw konstrukcyjnych oraz miejsc, w ktrych naley ich uy. Jednym ze sposobw
realizacji tego zagadnienia byoby zebranie wszystkich elementw i zapisanie wszystkich
informacji bezporednio na nich. Na wszystkich panelach podogowych, oknach, ocienicach,
rurach i wszelkich innych elementach, zostayby zapisane wymiary oraz docelowe pooenie. Taka
metoda mogaby speni swoje zadanie, lecz jednoczenie jest bardzo niedokadna i moe sta si
przyczyn wielu problemw. Zamiast niej, mona jednak wykorzysta plan kartk papieru,
ktra informuje gdzie maj by umieszczone poszczeglne elementy i jak je naley poczy.
Podobnie rzecz si ma z dostpem do danych. Gdy tworzone jest polecenie SQL, mona zebra
poszczeglne jego elementy i poczy je ze sob w jeden acuch znakw, zapisujc jednoczenie
informacje o tym za co odpowiadaj jego poszczeglne czci. Mona jednak wykorzysta
bardziej zorganizowan metod okrelenia, gdzie naley umieci poszczeglne informacje. Ta
druga metoda wykorzystuje parametry fragmenty informacji tworzone niezalenie od polecenia
SQL i uywane w nim. Bazy danych posuguj si parametrami w taki sam sposb, w jaki
budowniczy korzystaj z planw.
Parametry wykorzystywane s w raz z obiektami OleDbCommand w celu podania dodatkowych
informacji, takich jak dane, ktre naley zwrci lub sposb ich zapisania w obiekcie DataSet.
Przypomnij sobie informacje dotyczce polece SQL podane w rozdziale 10, pt.: Korzystanie z
baz danych za pomoc obiektw ADO.NET. Aby dynamicznie stworzy zapytanie,
niejednokrotnie trzeba pobiera informacje z rnych elementw kontrolnych wykorzystywanych
na stronach ASP.NET. Przykadowo, wyobra sobie nastpujce zapytanie:
strSQL = "select * from tblUsers where UserID = 1"

Warto UserID mogaby pochodzi z pola tekstowego wywietlonego na stronie. A zatem,


mona by stworzy zapytanie w nastpujcy sposb (zakadajc, e tbId jest nazw pola
tekstowego):
strSQL = "select * from tblUsers where UserID = " & tbId.Text

Powysza metoda spenia swoje zadanie jeli chodzi o zapewnienie moliwoci dynamicznego
stworzenia zapytania SQL, jednak nie jest zorganizowana. Co by si bowiem stao gdyby na
stronie byy inne pola tekstowe? Wtedy mogyby si pojawi problemy z okreleniem, ktre z pl
powinno zawiera jakie informacje; najwiksze problemy mieliby inni programici prbujcy
przeanalizowa kod strony.
Nowe okrelenie
Jednak bardziej efektywn metod jest uycie parametrw. Parametr jest wartoci przekazywan
do, bd zwracan przez zapytanie. Wykorzystanie parametrw pozwala na zachowanie
przejrzystoci informacji i uatwia analiz stosowanych zapyta. Zastpmy zatem poprzednie
zapytanie, zapytaniem sparametryzowanym:
strSQL = "select * from tblUsers where UserID = @ID"

Jak wida dynamicznie tworzona cz acucha znakw zostaa zastpiona parametrem


zapytania, oznaczonym przy uyciu symbolu @. Zauwa, i parametr ten stanowi cz zapytania
SQL. Teraz, w jakim miejscu, naley poda warto tego parametru. Wartoci parametrw
okrelane s przy uyciu kolekcji Parameters obiektu OleDbCommand (wicej informacji na
jego temat znajdziesz w rozdziale 10). Przykad wykorzystania sparametryzowanych zapyta SQL
przedstawiem na listingu 12.1.

Listing 12.1. Okrelanie wartoci parametrw zapytania SQL fragment kodu


1 dim objCmd as OleDbCommand = new OleDbCommand _
2 ("select * from tblUsers where UserID = @ID", Conn)
3
4 dim objParam as OleDbParameter
5 objParam = objCmd.Parameters.Add("@ID", OleDbType.Integer)
6 objParam.Direction = ParameterDirection.Input
7 objParam.Value = tbId.Text

Analiza
W wierszach 1. oraz 2., w normalny sposb jest tworzony obiekt OleDbCommand (zakadam przy
tym, e zosta ju utworzony obiekt OleDbConnection o nazwie Conn). Warto zwrci uwag na
wiersz 2., w ktrym tworzone jest zapytanie sparametryzowane. W wierszu 4. tworzony jest obiekt
OleDbCommand, ktry zostanie wykorzystany do przekazania wartoci parametru do zapytania
SQL. W wierszu 5. parametr uyty w zapytaniu jest dodawany do obiektu OleDbCommand, a
jednoczenie okrelana jest jego nazwa i typ. Nazwa parametry podana w wywoaniu metody Add
musi odpowiada parametrowi uytemu w zapytaniu SQL (w tym przypadku musi ona mie
posta @ID). Typ jest wartoci OleDbType i reprezentuje typ przekazywanej wartoci parametru.
Najczciej stosowane wartoci typw przedstawione zostay w tabeli 12.1.

Tabela 12.1. Najczciej stosowane wartoci OleDbType


Typ Opis
Binary Strumie bajtw (odpowiada tablicy bajtw)
Boolean Warto logiczna
BSTR acuch znakw (odpowiada wartoci typu String)
Char acuch znakw (odpowiada wartoci typu String)
Currency Warto monetarna (odpowiada wartoci typu Decimal)
Date Data (odpowiada wartoci typu DateTime)
Decimal Warto typu Decimal
Double Warto typu Double
Empty Brak wartoci
Error 32-bitowy kod bdu (odpowiada wartoci typu Exception)
Integer 32-bitowa liczba cakowita (odpowiada wartoci typu Integer)
LongVarChar Dugi acuch znakw (odpowiada wartoci typu String)

VarChar acuch znakw (odpowiada wartoci typu String)


Variant Specjalny typ danych, ktry moe reprezentowa dane dowolnego typu, jeli
aden typ nie zosta okrelony (odpowiada wartoci typu Object)

W wierszu 6. okrelany jest rodzaj parametru1. W tym przypadku parametr bdzie


wykorzystywany jako element zapytania SELECT, a zatem jego warto bdzie przekazywana do
zapytania. Std te, waciwoci okrelajcej rodzaj zostanie przypisana warto Input. Gdyby
warto bya zwracana i zapisywana w parametrze, to jego rodzaj naleaoby okreli jako
Output. Wicej informacji na temat kierunkw przekazywania informacji przez parametry podam
w dalszej czci rozdziau, powiconej procedurom zachowanym.
W kocu, w wierszu 7., okrelana jest warto parametru; w tym przypadku zostaje jej przypisana
zawarto pola tekstowego tbId. Dowolne informacje podane w tym polu tekstowym zostan
zatem przekazane jako parametr do zapytania select. Przeanalizuj teraz peny kod przykadu,
podany na listingu 12.2.

Listing 12.2. Wykorzystanie parametrw do pobierania informacji z baz danych


1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Data" %>
3 <%@ Import Namespace="System.Data.OleDb" %>
4
5 <script runat="server">
6 dim Conn as new OleDbConnection("Provider=" & _
7 "Microsoft.Jet.OLEDB.4.0;" & _
8 "Data Source=C:\ASPNET\Data\banking.mdb")
9
10 sub GetData(obj as Object, e as EventArgs)
11 dim objCmd as OleDbCommand = new OleDbCommand _
12 ("select * from tblUsers where UserID = @ID", Conn)
13 dim objReader as OleDbDataReader
14 dim objParam as OleDbParameter
15
16 objParam = objCmd.Parameters.Add("@ID", _
17 OleDbType.Integer)
18 objParam.Direction = ParameterDirection.Input
19 objParam.Value = tbId.Text
20
21 try
22 objCmd.Connection.Open()
23 objReader = objCmd.ExecuteReader
24 catch ex as OleDbException
25 Label1.Text = "Bd pobierania informacji z bazy danych."
26 end try
27
28 DataGrid1.DataSource = objReader
29 DataGrid1.DataBind()
30
31 objReader.Close
32 objCmd.Connection.Close()
33 end sub
34 </script>
35
36 <html><body>
37 <form runat="server">
38 <asp:Label id="Label1" runat="server" /><br>
39 Podaj ID: <asp:TextBox id="tbID" runat="server"
40 AutoPostBack=True
41 OnTextChanged=GetData /><p>
42 <asp:DataGrid id="DataGrid1" runat="server"
43 BorderColor="black" GridLines="Vertical"
44 cellpadding="4" cellspacing="0" width="100%"
45 Font-Name="Arial" Font-Size="8pt"
46 HeaderStyle-BackColor="#cccc99"
47 ItemStyle-BackColor="#ffffff"
48 AlternatingItemStyle-Backcolor="#cccccc"
1
Rodzaj parametru nazywany jest take kierunkiem, gdy okrela on kierunek w jakim parametr bdzie
przekazywa informacje.
49 AutoGenerateColumns="true" />
50 </form>
51 </body></html>

Analiza
Kod przedstawiony na powyszym listingu powinien wyglda znajomo jest on bowiem bardzo
podobny do przykadw wykorzystania informacji pobieranych z baz danych, przedstawionych w
rozdziale 10. W czci przykadu zawierajcej kod HTML stworzone zostay trzy elementy
sterujce obsugiwane na serwerze: DataGrid (zdefiniowany w wierszach od 42. do 49.), Label
(zdefiniowany w wierszu 39.) oraz TextBox (zdefiniowany w wierszach od 39. do 41.). Gdy
uytkownik wpisze jak warto w polu tekstowym, zostanie zgoszone zdarzenie TextChanged;
w wyniku jego obsugi, w elemencie sterujcym DataGrid zostan wywietlone odpowiednio
przefiltrowane informacje (zwr uwag na atrybut AutoPostBack=True umieszczony w
wierszu 40.). W wierszu 6. deklarowany jest obiekt OleDbConnection, ktry bdzie
wykorzystywany w procedurze GetData.
Procedura GetData jest wykonywana w celu obsugi zdarzenia TextChanged generowanego
przez pole tekstowe i suy do wywietlenia odpowiednich informacji. Nasze sparametryzowane
zapytanie jest tworzone w wierszach 11. i 12. W wierszach do 16. do 19. tworzony jest parametr,
okrelany kierunek przekazywania informacji oraz jego warto (wyznaczana na podstawie
wartoci waciwoci Text pola tekstowego tbID). Pozostaa cz procedury pobiera dane i
wie je z elementem sterujcym DataGrid. Na rysunku 12.1 przedstawione zostay wyniki
wygenerowane przez powyszy przykad, po wpisaniu jakiej wartoci w polu tekstowym.

Rysunek 12.1. Sparametryzowane zapytanie wykorzystujce zawarto pola tekstowego w celu


okrelenia informacji jakie naley wywietli

W jednym zapytaniu mona uy wielu rnych parametrw. Na przykad:


strSQL = "SELECT * FROM tblUsers WHERE UserID=@ID AND FirstName=@Name"

W parametrze mona take umieci warto zwracan przez zapytanie:


strSQL = "SELECT @Phone=Phone FROM tblUsers WHERE UserID=@ID
AND FirstName=@Name"

Parametry zwracajce informacje okrelane s jako parametry wyjciowe. W efekcie wykonania


powyszego zapytania (SELECT Phone FROM tblUsers WHERE UserID=@ID AND
FirstName=@Name) zwrcona przez nie warto zostanie zapisana w parametrze @Phone. Po
wykonaniu tego zapytania, warto parametru bdzie mona pobra z kolekcji parametrw.
Przedstawiony poniej fragment kodu tworzy parametr wyjciowy dla ostatniego,
przedstawionego wczeniej zapytania SQL:
dim objParam as OleDbParameter
objParam = objCmd.Parameters.Add("@Phone", OleDbType.BSTR)
objParam.Direction = ParameterDirection.Output

Warto tego parametru mona pobra po wykonaniu zapytania, przy wykorzystaniu waciwoci
Value:
dim strPhone as string = objParam.Value

Parametry s niezwykle przydatne przy tworzeniu dynamicznych zapyta, jednak ich prawdziwe
moliwoci uwidaczniaj si dopiero przy zastosowaniu wraz z procedurami zachowanymi.

Procedury zachowane
Procedura zachowana jest zbiorem polece (zazwyczaj polece SQL poczonych z instrukcjami
zapisanymi w innym jzyku, charakterystycznym dla uywanej bazy danych), ktre baza danych
jest w stanie wykona. Jaka jest rnica pomidzy procedur zachowan a zwyczajnymi
poleceniami SQL?
Po pierwsze procedury zachowane s kompilowane. Ju wiesz jakie korzyci daje kompilowanie
stron ASP.NET. Bardzo podobne korzyci daje kompilacja procedur zachowanych; dotyczy to
take zwikszenia szybkoci ich dziaania.
Nowe okrelenie
Gdy baza danych wykonuje procedur zachowan, tworzony jest plan wykonania, ktry pozwala
na szybsze pobranie informacji w przypadku ponownego wykonania tej samej procedury. Baza
danych analizuje dane oraz zapytanie i okrela najbardziej efektywny sposb pobrania i zwrcenia
informacji. Sposb ten zapisywany jest nastpnie w planie wykonania. A zatem, korzyci jakie
daje stosowanie procedur zachowanych nie wynikaj wycznie z faktu i s one kompilowane
dodatkow zalet jest stworzenie i pniejsze wykorzystania planu wykonania.
Wykorzystanie procedur zachowanych pozwala na stworzenie kolejnego poziomu abstrakcji
pomidzy stronami ASP.NET a danymi. Naley pamita, e modularno jest jednym z celw
programowania obiektowego. Dziki oddzieleniu zapyta SQL od stron ASP.NET mona:
pozwoli na wielokrotne stosowanie tych samych zapyta,
uatwi analiz kodu strony ASP.NET,
zaoszczdzi czas.
Jeli wykorzystywane polecenie SQL jest bardzo dugie, to umieszczenie go w stronie ASP.NET
powoduje dodanie do niej kodu, ktry wcale nie jest tam potrzebny. Takie zapytanie jedynie
utrudni analiz kodu obsugujcego faktyczne moliwoci funkcjonalne strony. Co wicej, ze
wzgldu na fakt, i kod zapytania musi zosta przesany ze strony ASP.NET na serwer bazy
danych, taki sposb wykonywania zapyta powoduje take niepotrzebne wykorzystanie
przepustowoci czy. I w kocu, wyobra sobie, e to samo zapytanie SQL jest wykorzystywane
w kilku stronach ASP.NET. Jeli struktura bazy danych ulegnie jakimkolwiek zmianom i pojawi
si konieczno zmiany zapytania, to niezbdne poprawki trzeba bdzie wprowadzi na kadej ze
stron, na ktrych dane zapytanie jest uywane. W przypadku wykorzystania procedur
zachowanych zmian wystarczy wprowadzi w jednym miejscu, a jej skutki obejm ca aplikacj.
Przeniesienie polece SQL do procedur zachowanych eliminuje wszystkie powysze problemy, a
jednoczenie daje kilka innych korzyci. Implementacja nawet bardzo prostych,
jednowierszowych zapyta SQL w formie procedur zachowanych da due korzyci.
Lecz zakoczmy te rozwaania teoretyczne i stwrzmy w kocu jak procedur zachowan!

Tworzenie procedur zachowanych w SQL Serverze 2000


Procedury zachowane s wykorzystywane w wielu rnych systemach baz danych. Na przykad,
wykorzystuj je zarwno SQL Server jak Microsoft Access, cho w kadej z tych baz danych s
one tworzone w odmienny sposb. W tej czci rozdziau poka jak naley tworzy procedury
zachowane w Microsoft SQL Serverze 2000. W nastpnej czci rozdziau zajmiemy si
Accessem.
Wanie z tego powodu, w tej czci rozdziau uyjemy SQL Servera, pomimo tego, i w
pozostaych czciach ksiki wykorzystywany by Microsoft Access. Sprbujmy zatem stworzy
prost procedur zachowan.
Otwrz Enterprise Managera, tak samo jak robilimy to w rozdziale 8., pt.: Podstawowe
wiadomoci na temat tworzenia baz danych. Rozwi wzy Microsoft SQL Server, SQL Server
Group, jak rwnie wze z nazw serwera bazy danych oraz wze Databases. Nastpnie otwrz
baz danych Banking stworzon w rozdziale 8. W tym celu kliknij symbol + wywietlony przy
wle Banking (patrz rysunek 12.2).

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Rysunek 12.2. Wywietl zawarto bazy danych Banking stworzonej w rozdziale 8

SQL Server zosta wyposaony w duo wbudowanych procedur zachowanych. Mona je przejrze
klikajc wze Stored Procedures, a nastpnie dwukrotnie klikajc jedn z nazw wywietlonych w
prawej czci okna. Wikszo z tych predefiniowanych procedur bdzie znacznie bardziej
skomplikowana do procedury ktr teraz stworzymy; jednak analizujc je bdziesz mg zobaczy
jak powinny wyglda Twoje procedury. Kliknij prawym przyciskiem myszy na ikonie procedur
zachowanych i z menu podrcznego wybierz opcje New Stored Procedure. Na ekranie pojawi si
nowe okienko dialogowe, przypominajce to pokazane na rysunku 12.3.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Rysunek 12.3. W tym oknie dialogowym mona poda polecenia SQL, ktre bd tworzy
procedur zachowan

Wyraenie [OWNER].[PROCEDURE NAME] zastp nazw jak chcesz nada tworzonej


procedurze, na przykad: SelectIdFromName. (W tym przypadku nie musisz zwraca uwagi na
atrybut OWNER. Wicej informacji na jego temat znajdziesz w dokumentacji SQL Servera 2000.)
Poniewa chcemy stworzy sparametryzowane zapytanie, a zatem bezporednio po nazwie
procedury i przed sowem kluczowym AS naley zdefiniowa uywane parametry:
CREATE PROCEDURE SelectIdFromName
@FirstName varchar,
@LastName varchar,
@ID int OUTPUT
AS

Sowo kluczowe OUTPUT informuje, e w danym parametrze naley zapisa warto i zwrci j
do programu, ktry wywoa procedur. Po sowie kluczowym AS mona poda tre zapytania
SQL:
SELECT @ID = UserID
FROM tblUsers
WHERE FirstName = @FirstName
AND LastName = @LastName

Powysze zapytanie pobiera warto pola UserID dla uytkownika o podanym imieniu i nazwisku
(polach FirstName i LastName) i zapisuje j w parametrze @ID. Pniej wykorzystamy go jako
parametr wyjciowy w kodzie strony ASP.NET. Ewentualnie mona take klikn przycisk Check
syntax, aby sprawdzi czy kod procedury zachowanej zosta poprawnie zapisany. SQL Server
sprawdzi kod procedury i poinformuje Ci jeli znajdzie w nim jakiekolwiek bdy. Aby zapisa
procedur, kliknij przycisk OK. Teraz nazwa naszej procedury zachowanej powinna si pojawi na
licie, wraz z nazwami procedur predefiniowanych.
Tworzenie procedur zachowanych w Accessie 2000
Poniewa we wczeniejszej czci ksiki uywalimy Microsoft Accessa, zatem poka jak
mona tworzy procedury zachowane take w tej aplikacji. Access umoliwia tworzenie procedur
zachowanych jednak okrela je jako kwerendy. Otwrz zatem baz danych Banking stworzon
w rozdziale 8 i kliknij zakadk Kwerendy wywietlon z lewej strony okna pokazanego na
rysunku 12.4.

Rysunek 12.4. W Accessie procedury zachowane s okrelane jako kwerendy

Znasz zasady tworzenia polece SQL, a zatem nie musisz korzysta z kreatorw. Dwukrotnie
kliknij opcj Utwrz kwerend w widoku projektu. Na ekranie pojawi si okienko dialogowe o
nazwie Pokazywanie tabeli, zamknij je klikajc przycisk Zamknij. Spjrz na pasek narzdzi
Accessa, z jego lewej strony powiniene zauway rozwijan list o nazwie Widok. Wywietl jej
zawarto, a nastpnie wybierz z niej opcj Widok SQL, tak jak pokazaem na rysunku 12.5.
Rysunek 12.5. Przejd do trybu edycji kodu zapytania SQL klikajc rozwijan list Widok
wywietlon z lewej strony paska narzdzi Accessa

Teraz moesz pisa kod zapytania SQL bezporednio w tworzonej kwerendzie:


SELECT UserID FROM tblUsers
WHERE FirstName = @FirstName
AND LastName = @LastName

Wpisz kod zapytania w oknie kwerendy, jak pokazaem na rysunku 12.6, a nastpnie zamknij
okno klikajc przycisk X widoczny w jego prawym grnym wierzchoku i kliknij przycisk Tak,
aby zapisa kwerend. Zapisz kwerend pod nazw SelectIDFromName. Teraz powiniene j
zobaczy na licie wszystkich dostpnych kwerend.
Rysunek 12.6. Wprowadzanie zapyta w programie Microsoft Access, w widoku SQL

Notatka
Mechanizm obsugi baz danych Accessa nie daje moliwoci stosowania parametrw
wyjciowych w kwerendach. Wanie z tego wzgldu w powyszej kwerendzie nie znajdziesz
parametru @ID. W dalszej czci rozdziau dowiesz si jak mona omin to ograniczenie.

Uycie procedur zachowanych w stronach ASP.NET


Wykonanie procedury zachowanej z poziomu strony ASP.NET jest proste. W tym celu naley
okreli warto jednej waciwoci, ktrej do tej pory nie uywalimy. Waciwo ta nosi nazw
CommandType:
dim objCmd as OleDbCommand = new OleDbCommand _
("SelectIDFromName", Conn)
objCmd.CommandType = CommandType.StoredProcedure

W pierwszym wierszu powyszego fragmentu kodu, w standardowy sposb jest tworzony obiekt
OleDbCommand. Jednak tworzc go nie podalimy kodu polecenia SQL, lecz nazw utworzonej
przed chwil procedury zachowanej. W 3. wierszu, przypisujc waciwoci CommandType
warto StoredProcedure, informujemy ASP.NET, e zostanie wykorzystana procedura
zachowana. Po uzyskaniu tej informacji ADO.NET odszuka procedur zachowan w bazie
danych, wykona j i zwrci uzyskane informacje wynikowe.
Jednak takie wykonanie naszej przykadowej procedury zachowanej nie daoby oczekiwanych
rezultatw. Przypomnij sobie, e procedura ta zawieraa parametry. Aby zwrcia ona
jakiekolwiek dane, konieczne bdzie okrelenie wartoci parametrw @FirstName oraz
@LastName. Mona to zrobi na dwa sposoby bezporednio lub przy wykorzystaniu kolekcji
OleDbParameters. Pierwszy z tych sposobw jest bardzo prosty. Wystarczy zmieni pierwszy
wiersz powyszego fragmentu kodu, w sposb przedstawiony na kolejnym przykadzie (przy czym
wartoci s wartociami parametrw jakie naley przekaza):
dim objCmd as OleDbCommand = new OleDbCommand _
("SelectIDFromName wartosc, wartosc", Conn)
Na przykad:
dim objCmd as OleDbCommand = new OleDbCommand _
("SelectIDFromName 'Chris', 'Payne'", Conn)

Metoda ta jest bardzo atwa, lecz niezbyt efektywna, zwaszcza jeli jako parametry
wykorzystywane s wartoci pobierane, na przykad, z elementw sterujcych formularzy. W
przypadku wykorzystania kolekcji parametrw, wartoci parametrw naszej przykadowej
procedury zachowanej mona by okreli w nastpujcy sposb:
dim objParam as OleDbParameter
objParam = objCmd.Parameters.Add("@FirstName", OleDbType.Char)
objParam.Direction = ParameterDirection.Input
objParam.Value = tbFirst.Text

objParam = objCmd.Parameters.Add("@LastName", OleDbType.Char)


objParam.Direction = ParameterDirection.Input
objParam.Value = tbLast.Text

Ten kod powinien Ci co przypomina. Dokadnie te same czynnoci wykonywae wczeniej w


tym rozdziale, w czci pod tytuem Zapytania sparametryzowane. Teraz moesz w
standardowy sposb wypeni obiekt DataReader (wywoujc metod ExecuteReader obiektu
polecenia) i zwiza dane z elementem sterujcym wywietlanym na stronie:
try
objCmd.Connection.Open()
objReader = objCmd.ExecuteReader
catch ex as OleDbException
Label1.Text = "Bd pobierania informacji z bazy danych."
end try

DataGrid1.DataSource = objReader
DataGrid1.DataBind()

objReader.Close
objCmd.Connection.Close()

A co si stao z naszym parametrem wyjciowym? W Accessie nie da si pobra wartoci @ID


jako parametru wyjciowego. Niemniej jednak obiekt polecenia zwrci warto jako wynik
wykonania zapytania SELECT. W poprzednim fragmencie kodu mona uzyska dostp do tej
wartoci za porednictwem obiektu DataReader. Na listingu 12.3 zosta przedstawiony
kompletny przykad utworzony poprzez poczenie wszystkich wczeniejszych fragmentw kodu,
wyniki jego pokazano na rysunku 12.7.

Listing 12.3. Parametry uatwiaj pobieranie danych


1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Data" %>
3 <%@ Import Namespace="System.Data.OleDb" %>
4
5 <script runat="server">
6 dim Conn as new OleDbConnection("Provider=" & _
7 "Microsoft.Jet.OLEDB.4.0;" & _
8 "Data Source=C:\ASPNET\Data\banking.mdb")
9
10 sub SubmitData(obj as Object, e as EventArgs)
11 dim objCmd as OleDbCommand = new OleDbCommand _
12 ("SelectIDFromName", Conn)
13 dim objReader as OleDbDataReader
14 objCmd.CommandType = CommandType.StoredProcedure
15
16 dim objParam as OleDbParameter
17 objParam = objCmd.Parameters.Add("@FirstName", _
18 OleDbType.Char)
19 objParam.Direction = ParameterDirection.Input
20 objParam.Value = tbFirst.Text
21
22 objParam = objCmd.Parameters.Add("@LastName", _
23 OleDbType.Char)
24 objParam.Direction = ParameterDirection.Input
25 objParam.Value = tbLast.Text
26
27 try
28 objCmd.Connection.Open()
29 objReader = objCmd.ExecuteReader
30 catch ex as OleDbException
31 Response.Write("Bd pobierania informacji z bazy danych.")
32 end try
33
34 DataGrid1.DataSource = objReader
35 DataGrid1.DataBind()
36
37 objReader.Close
38 objCmd.Connection.Close()
39 end sub
40 </script>
41
42 <html><body>
43 <form runat="server">
44 Podaj imi:
45 <asp:TextBox id="tbFirst" runat="server" /><br>
46 Podaj nazwisko:
47 <asp:TextBox id="tbLast" runat="server" /><p>
48
49 <asp:Button id="btSubmit" runat="server"
50 text="Wylij"
51 OnClick="SubmitData"/><p>
52
53 <asp:DataGrid id="DataGrid1" runat="server"
54 BorderColor="black"
55 GridLines="Vertical"
56 cellpadding="4"
57 cellspacing="0"
58 width="100%"
59 Font-Name="Arial"
60 Font-Size="8pt"
61 HeaderStyle-BackColor="#cccc99"
62 ItemStyle-BackColor="#ffffff"
63 AlternatingItemStyle-Backcolor="#cccccc"
64 AutoGenerateColumns="true" />
65 </form>
66 </body></html>

Rysunek 12.7. Zwracanie wartoci przez sparametryzowane procedury zachowane

Obiekt DataReader zawiera jeden wiersz oraz jedn kolumn, w ktrej znajduje si warto
zwrcona przez procedur zachowan.
Notatka
W przypadku SQL Servera 2000 stosowanie parametrw wyjciowych jest ze wszech miar
zalecane; a zatem mona si nimi posuy w powyszym przykadzie i zrezygnowa z
wykorzystania obiektu DataReader. Wicej informacji na ten temat znajdziesz we
wczeniejszej czci rozdziau, pt.: Zapytania sparametryzowane.

Parametry wejciowe i wyjciowe s niezwykle przydatne przy przekazywaniu danych do i z


procedur zachowanych. Istniej jednak jeszcze inne typy parametrw takie jak InputOutput
lub ReturnValue ktrych jeszcze nie poznae. Wszystkie dostpne rodzaje parametrw
zostay przedstawione w tabeli 12.2.

Tabela 12.2. Rodzaje parametrw (kierunki przekazywania informacji)


Rodzaj Opis
Input Reprezentuje warto przekazywan do zapytania.
InputOutput Warto ktra moe by zarwno przekazana do zapytania jak i zwrcona
przez nie.
Output Warto zwracana w wyniku wykonania zapytania.
ReturnValue Reprezentuje warto zwracan przez zapytanie, ktra jednak nie jest
parametrem.

Przedstawiem ju sposoby wykorzystania parametrw wejciowych (Input) oraz wyjciowych


(Output). Parametry InputOutput s przydatne w sytuacjach, gdy dane przekazane do zapytania
mog ulec zmianie (na przykad, w przypadku aktualizacji bazy). Prosty przykad takiego
zapytania przedstawiem na poniszym przykadzie, w ktrym warto pola FirstName naley
zmodyfikowa w zalenoci od jego wartoci:
UPDATE tblUsers SET FirstName = "Christopher"
WHERE FirstName = "Chris"

Zapytanie to mona by sparametryzowa w nastpujcy sposb:


UPDATE tblUsers SET @FirstName = "Christopher"
WHERE @FirstName = "Chris"

W tym przypadku @FirstName jest zarwno parametrem wejciowym jak i wyjciowym, a po


wykonaniu polecenia SQL jego warto ulegnie zmianie. Parametry InputOutput doskonale
nadaj si wanie do takich sytuacji.
Parametry ReturnValue s bardzo przydatne w poleceniach SQL, ktre nie zwracaj adnych
wartoci pobranych z kolumn bazy danych. Na przykad, przedstawione poniej zapytanie zwraca
liczb cakowit okrelajc ilo wierszy tabeli:
SELECT Count(*) FROM tblUsers

Zwracana informacja nie pochodzi z adnej konkretnej kolumny, a zatem nie jest z ni skojarzona
adna nazwa pola. Warto ta jest zwracana przez zapytanie bez adnej nazwy ani parametru.
Dane tego typu wspaniale nadaj si do obsugi przy uyciu parametrw ReturnValue. Aby
pobra warto zwracan przez powysze zapytanie, naley posuy si nastpujcym
fragmentem kodu:
objParam = objCmd.Parameters.Add("RETURN VALUE", OleDbType.Integer)
objParam.Direction = ParameterDirection.ReturnValue

Procedury zachowane s niezwykle przydatnym narzdziem, ktre moe poprawi efektywno


dziaania aplikacji ASP.NET. Udostpniaj one nowe moliwoci interakcji z bazami danych,
pozwalajc na stosowanie bardzo zoonych zapyta i uycie bardziej zaawansowanych
elementw sterujcych baz danych.
Transakcje
Ile razy wykonywae skomplikowane zadanie i w poowie zdawae sobie spraw z tego, e
wszystko jest zrobione le? Czy nie marzye o tym, aby cofn czas i zacz wszystko od nowa?
Bazy danych s w stanie speni to marzenie, a wszystko dziki transakcjom. Transakcja to zbir
pewnych czynnoci, z ktrych wszystkie musz zosta wykonane poprawnie lub nie zostanie
wykonana adna z nich. Na przykad, wyobra sobie e stworzye zoon procedur zachowan
skadajc si z 50 polece SQL. Jeli by nie byo transakcji, to gdyby ktre z tych polece
dajmy na to 50-te zostao wykonane nieprawidowo, to realizacja caej procedury zostaaby
przerwana i jedno z polece nigdy nie byoby wykonane. Gdyby chcia wykona to polecenie, to
musiaby najpierw ponownie wykona 49 polece poprzedzajcych je.
Istnieje bardzo wiele przypadkw, gdy takie przerwanie wykonywania serii polece jest wysoce
niepodane. Rozwamy przykad aplikacji bankowej. Uytkownik chce przela pewn kwot
pienidzy ze swego konta rozliczeniowego, na konto oszczdnociowe. W pierwszej kolejnoci
naley zatem odj podan kwot z konta rozliczeniowego (ktrego stan jest przechowywany w
bazie danych), a nastpnie doda j do konta oszczdnociowego (ktrego stan take jest
przechowywany w bazie danych). Zamy, e pierwszy etap operacji zosta wykonany
poprawnie. Jednak podczas prby dodania przelewanej sumy na konto oszczdnociowe okazuje
si, i zostao ono zablokowane i w danej chwili nie mona do niego niczego doda. O rany, no to
mamy problem. Kwoty zapisane w bazie danych s nieprawidowe gdy z kta rozliczeniowego
pienidze ju zostay odjte.
Transakcje zostay zaprojektowane z myl o wanie takich sytuacjach. Jeli w powyszej
procedurze zostaaby uyta transakcja, to nie musielibymy si przejmowa jakimikolwiek
problemami jakie mogyby si wydarzy w trakcie wykonywania caej operacji. Jeli cokolwiek
by si stao, mona by bez problemw odtworzy wykonane czynnoci.
By moe przypominasz sobie metody AcceptChanges oraz RejectChanges klasy DataSet, o
ktrych wspominaem w rozdziale 10. Pozwalaj one na wykonywanie czynnoci
przypominajcych transakcje, lecz dziaaj wycznie na informacjach odczonych (czyli ju
pobranych z bazy danych). Transakcje obejmuj swym dziaaniem ca baz danych
wykorzystujc przy tym aktywne poczenie, zakadajc oczywicie, e serwer bazy danych w
ogle jest w stanie obsugiwa transakcje (wikszo komercyjnych serwerw baz danych
dysponuje t moliwoci).
Trzema podstawowymi operacjami kadej z transakcji s rozpoczcie transakcji, jej anulacja
bd zatwierdzenie. Transakcja zaczyna si w momencie jej rozpoczcia. Wszystkie kolejne
czynnoci s wykonywane i zapisywane w specjalnym dzienniku, dziki czemu baza danych moe
je pniej przejrze. Anulacja transakcji powoduje odtworzenie wszelkich modyfikacji jakie
zostay wprowadzone. Baza danych odwouje si przy tym do dziennika i na jego podstawie jest w
stanie okreli jak posta miay informacje w momencie rozpoczynania transakcji. Zatwierdzenie
transakcji sprawia, e informacje zostaj uznane za ostateczne i nie bdzie ich ju mona
odtworzy. W konsekwencji, zatwierdzenie oznacza usunicie z dziennika bazy danych informacji
o danej transakcji.
Przyjrzymy si teraz typowemu przykadowi wykorzystania transakcji, przedstawionemu na
listingu 12.4.

Listing 12.4. Zastosowanie transakcji


1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Data" %>
3 <%@ Import Namespace="System.Data.OleDb" %>
4
5 <script runat="server">
6 'deklarujemy polaczenie'
7 dim Conn as new OleDbConnection("Provider=" & _
8 "Microsoft.Jet.OLEDB.4.0;" & _
9 "Data Source=C:\ASPNET\Data\banking.mdb")
10
11 sub Page_Load(obj as Object, e as EventArgs)
12 dim objTrans as OleDbTransaction
13 dim objCmd as OleDbCommand = new OleDbCommand _
14 ("DELET FROM tblUsers WHERE UserID=32", Conn)
15
16 Conn.Open()
17 objTrans = Conn.BeginTransaction()
18 objCmd.Transaction = objTrans
19
20 try
21 objCmd.ExecuteNonQuery
22
23 objCmd.CommandText = "INSERT INTO tblUsers " & _
24 "(FirstName, LastName, Address, City, State, " & _
25 "Zip, Phone) VALUES " & _
26 "('Jose', 'Santiago', '34 Lake Drive', " & _
27 "'Yolktown', 'MA', '02515', '8006579876')"
28 objCmd.ExecuteNonQuery()
29 objTrans.Commit()
30 Label1.Text = "Obie operacje zostay wykonane poprawnie."
31 catch ex as OleDbException
32 objTrans.RollBack()
33 Label1.Text = ex.Message & "<p>" & _
34 "adna operacja nie zostaa wykonana."
35 finally
36 objCmd.Connection.Close()
37 end try
38 end sub
39 </script>
40
41 <html><body>
42 <form runat="server">
43 <asp:Label id="Label1" runat="server"
44 maintainstate=false/>
45 </form>
46 </body></html>

Analiza
Powysza strona ASP.NET wykonuje dwa polecenie SQL. Jednak jeli podczas wykonywania
ktrego z nich pojawi si nieprzewidziany problem, to w bazie danych nie zostan wprowadzone
adne modyfikacje. Na przykad, jeli drugie polecenie byoby zapisane w nieodpowiedni sposb,
to nasza operacja zostaaby przerwana w poowie. Jednak dziki temu, i przed wykonaniem
jakichkolwiek czynnoci rozpoczynamy transakcj (w wierszu 17.), to moemy odtworzy
wszelkie modyfikacje wprowadzone w bazie w wyniku wykonania pierwszego polecenia.
W wierszu 7., w standardowy sposb, jest tworzony obiekt OleDbConnection. W wierszu 12.
jest tworzony obiekt OleDbTransaction, a w wierszu 14. okrelamy pierwsze polecenie SQL
jakie zostanie wykonane. Rozpoczcie transakcji wymaga otworzonego poczenia z baz danych,
a zatem, w wierszu 16., otwierane jest poczenie. W wierszu 17. rozpoczynamy transakcj,
wywoujc w tym celu metod BeginTransaction.
Naley zwrci uwag i BeginTransaction jest metod klasy OleDbConnection. Transakcja
musi bowiem zosta zainicjalizowana przez obiekt poczenia. Ten sposb rozpoczynania
transakcji zosta opracowany celowo, aby nie mona byo stosowa transakcji w razie korzystania
z serwerw baz danych, ktre ich nie obsuguj. Obiekt poczenia jest w stanie okreli czy baza
danych obsuguje transakcje czy nie i uniemoliwi rozpoczcie transakcji jeli zajdzie taka
potrzeba. Wszystkie dalsze polecenia (anulowanie transakcji lub jej zatwierdzenie) s
wykonywane przy uyciu obiektu OleDbTransaction.
W wierszu 18. wskazujemy obiektowi OleDbCommand, ktry obiekt OleDbTransaction bdzie
wykorzystywany. Do tego celu suy waciwo Transaction. Wewntrz bloku try
wykonujemy polecenie SQL DELET, a nastpnie tworzymy i prbujemy wykona polecenie SQL
INSERT. Jeli wszystko pjdzie zgodnie z planem, to bdzie mona wywoa metod Commit, aby
zaakceptowa modyfikacje wprowadzone w bazie danych.
Jeli jednak co pjdzie nie tak jak zaplanowalimy, to chcemy, aby wszelkie modyfikacje zostay
odtworzone. Blok try przechwytuje wyjtek i przekazuje wykonywanie do instrukcji catch,
gdzie wywoywana jest metoda RollBack i wywietlany stosowny komunikat. Niezalenie od
tego czy zosta zgoszony wyjtek czy nie, wykonywany jest blok finally, w ktrym zamykamy
poczenie z baz danych.
W rezultacie wykorzystania transakcji zostan wykonane wszystkie polecenia SQL bd nie
zostanie wykonane adne z nich.

Zaawansowane techniki obsugi danych


XML
W poprzednim rozdziale dowiedziae si w jaki sposb mona wykorzysta jzyk XML do
przedstawienia niemal kadego typu informacji. Poznae take metody otwierania, odczytywania
oraz zapisywania dokumentw XML z poziomu stron ASP.NET. Niemniej jednak nie s to
wszystkie moliwoci wykorzystania i obsugi danych XML.
W kolejnych czciach tego rozdziau przedstawionych zostanie kilka bardziej zaawansowanych
technik manipulowania danymi XML. Dowiesz si jak mona si porusza po dokumentach XML
przy wykorzystaniu obiektw klasy XmlNavigator, ktry pozwala na wykorzystanie dwch
technologii przedstawionych w dalszej czci rozdziau zapyta XPath oraz przeksztace XSL.
XPath jest jzykiem zapyta stosowanych do pobierania informacji z dokumentw XML
(podobnie jak jzyk SQL suy do pobierania informacji z baz danych). Przeksztacenia XSL
pozwalaj na zapisanie zawartoci dokumentu XML w formie dokumentu strukturalnego
dowolnego innego typu, na przykad strony HTML. Dziki tym technologiom uzyskasz pen
kontrol nad dokumentami XML i ich zawartoci.

XPathDocument
Nowe okrelenie
W poprzednim rozdziale dowiedziae si jak mona porusza si po tekstowych dokumentach
XML przy wykorzystaniu obiektw klas XmlNode i XmlDocument. W przypadku prb uzyskania
dostpu do danych XML, obiekty tych dwch klas tworz drzewo wzw. Oznacza to, e
odczytuj one zawarto caego pliku XML i tworz obiektow, hierarchiczn reprezentacj
zapisanych w nim informacji. Najprociej rzecz biorc, obiekt XmlDocument pobiera ca
zawarto pliku XML zanim bdzie mona uzyska do niej dostp. Jednak obiekty klasy
XPathDocument nie tworz drzew wzw. Zamiast tego analizuj zawarto dokumentu po
jednym wle. Obiekty te tworz obiektow reprezentacj wza gdy zostanie on odczytany. Jeli
chcesz, moesz je sobie wyobrazi jako dynamiczne obiekty XmlDocument.
Klasa XPathDocument przypomina nieco klas XmlDocument, lecz zostaa stworzona z myl o
zapewnieniu jak najwikszej efektywnoci dziaania i z tego wzgldu nie dysponuje rwnie
bogatymi moliwociami. Klasa ta zostaa zoptymalizowana pod ktem wykonywania zapyta
XPath (std te pochodzi jej nazwa XPathDocument) i przeksztace XSL. Oba te zagadnienia
zapytania XPath oraz przeksztacenia XSL zostan opisane w dalszej czci rozdziau.
Najpierw jednak przyjrzyjmy si sposobowi wykorzystania obiektu XPathDocument
przedstawionemu na listingu 12.5.
Listing 12.5. Tworzenie dokumentu XPathDocument
1 <%@Page Language="VB" %>
2 <%@Import Namespace="System.Xml" %>
3 <%@Import Namespace="System.Xml.XPath" %>
4
5 <script runat="server">
6 sub Page_Load(obj as object,e as eventargs)
7 'Tworzymy obiekt XPathDocument'
8 Dim objDocument as New XPathDocument _
9 (Server.MapPath("../rozdzial11/books.xml"))
10 end sub
11 </script>
12
13 <html><body>
14 </body></html>
Analiza
W rzeczywistoci kod przedstawiony na powyszym listingu nie zawiera niczego nowego w
wierszach 8. i 9. jest jedynie tworzony nowy obiekt XPathDocument. W rzeczywistoci, to jest
wszystko co mona zrobi z obiektem klasy XPathDocument, nie mona go bowiem uy ani do
poruszania si po zawartoci pliku XML ani do jego edycji. Obiekty te zostay stworzone w celu
zapewnienia szybkiego dostpu do zawartoci plikw XML i przesyania jej bezporednio do
innych obiektw, ktre j przetworz.
Konkretnie rzecz biorc, z obiektem XPathDocument najczciej bdzie wykorzystywany obiekt
XPathNavigator. Dostarcza on metod sucych do poruszania si po zawartoci plikw XML.
W jego skad wchodz wycznie te metody, ktre sprawiaj, i jest on efektywnym narzdziem
nawigacyjnym. Przykad wykorzystania obiektw XPathDocument oraz XPathNavigator
przedstawiem na listingu 12.6.

Listing 12.6. Poruszanie si po dokumencie XML przy wykorzystaniu obiektu


XPathNavigator
1 <%@Page Language="VB" %>
2 <%@Import Namespace="System.Xml" %>
3 <%@Import Namespace="System.Xml.XPath" %>
4
5 <script runat="server">
6 sub Page_Load(obj as object,e as eventargs)
7 Dim objDocument as New XPathDocument _
8 (Server.MapPath("../rozdzial11/books.xml"))
9
10 Dim objNav as XPathNavigator = objDocument. _
11 CreateNavigator
12 objNav.MoveToRoot()
13 DisplayTree(objNav)
14 end sub
15
16 public sub DisplayTree (objNav as XPathNavigator )
17 if (objNav.HasChildren)
18 objNav.MoveToFirstChild()
19
20 Format(objNav)
21 DisplayTree(objNav)
22
23 objNav.MoveToParent()
24 end if
25
26 while (objNav.MoveToNext())
27 Format (objNav)
28 DisplayTree (objNav)
29 end while
30 end sub
31
32 private sub Format (objNav as XPathNavigator)
33 if Not objNav.HasChildren
34 if (objNav.NodeType = XPathNodeType.Text)
35 lblMessage.Text += "" & objNav.Value & "<br>"
36 end if
37 else
38 lblMessage.Text += "&lt;" & objNav.Name & _
39 "&gt;<br>"
40
41 if objNav.HasAttributes
42 while (objNav.MoveToNextAttribute())
43 lblMessage.Text += "&nbsp;&nbsp;&lt;" & _
44 objNav.Name & "&gt; " & objNav.Value & _
45 "<br>"
46 end while
47
48 objNav.MoveToParent()
49 end if
50 end if
51 end sub
52 </script>
53
54 <html><body>
55 <ASP:Label id="lblMessage" runat="server"/>
56 </body></html>

Znaczna cz powyszego kodu przypomina przykady przedstawione w poprzednim rozdziale,


wykorzystujce obiekty XmlDocument oraz XmlNode. W wierszach 7. i 8. tworzony jest obiekt
XPathDocument, dokadnie w taki sam sposb jak na przykadzie przedstawionym na listingu
12.5. W wierszach 10. i 11. wywoywana jest metoda CreateNavigator obiektu
XPathDocument. Metoda ta tworzy obiekt XPathNavigator, ktrego bdziemy uywali do
poruszania si po dokumencie XML. Metoda MoveToRoot wywoywana w wierszu 12. powoduje
przejcie na sam pocztek pliku XML, i w kocu w wierszu 13. wywoywana jest stworzona przez
nas procedura DisplayTree.
Procedura DisplayTree zdefiniowana w wierszach od 16. do 30, jest procedur rekurencyjn. W
pierwszej kolejnoci okrela ona czy aktualnie analizowany wze ma jakiekolwiek wzy
podrzdne. Jeli ma, to bdziemy chcieli wywietli informacje o kadym z nich. Wywoanie
metody MoveToFirstChild przesuwa kursor do pierwszego wza podrzdnego. Za samo
wywietlenie informacji o wle na wynikowej stronie WWW odpowiada procedura Format,
ktr niebawem zostanie opisana. W wierszu 21. ponownie wywoywana jest procedura
DisplayTree, ktra powtrzy cay proces dla aktualnie przetwarzanego wza podrzdnego.
Powyszy proces jest powtarzany dla wszystkich wzw podrzdnych. Gdy kady z nich zostanie
ju przetworzony, zostaje wywoana metoda MoveToParent, ktra przesunie kursor o jeden
poziom w gr hierarchii dokumentu XML.
Take druga cz procedury jest rekurencyjna. Odpowiada ona za przeanalizowanie wzw
znajdujcych si na tym samym poziomie hierarchii dokumentu. Do kolejnego wza na tym
samym poziomie hierarchii mona przej przy wykorzystaniu metody MoveNext. Metoda ta jest
wywoywana cyklicznie, a do momentu gdy przetworzone zostan wszystkie wzy; w tym
przypadku metoda zwrci warto false, a wykonywania ptli while zostanie zakoczone.
Wewntrz ptli wywoywane s metody Format oraz DisplayTree. Proces ten jest wykonywany
a do chwili, gdy wszystkie wzy dokumentu XML zostan przetworzone.
Teraz przyjrzyjmy si procedurze Format, zdefiniowanej w wierszach od 32. do 51. Mam
nadziej, e procedura ta Ci nie przeraa przewaajca jej cz po prostu generuje
formatujce znaczniki HTML. Instrukcja if umieszczona w wierszu 33. okrela czy dany wze
ma jakiekolwiek wzy podrzdne. Jeli nie ma, to procedura wywietli jedynie warto aktualnie
przetwarzanego wza. Jeli jednak biecy wze bdzie mia jakie wzy potomne, to
wywietlona zostanie jego warto zapisana w nawiasach ktowych. Kolejna instrukcja if,
zapisana w wierszu 41., okrela czy przetwarzany wze ma jakiekolwiek atrybuty i wywietla
odpowiedni komunikat, jeli jakie atrybut zostan odnalezione. I w kocu, ptla while
rozpoczynajca si w wierszu 42. pobiera po kolei wszystkie atrybuty wza i wywietla je.
Wyniki wykonania powyszego przykadu przedstawiem na rysunku 12.8.
Rysunek 12.8. Wykorzystanie obiektu XPathNavigator do wywietlania danych XML

XPath
XPath jest specyfikacj jzyka sucego do pobierania fragmentw plikw XML, opracowan
przez Konsorcjum World Wide Web (w skrcie: W3C). Jzyk ten pozwala na zadawanie pyta
sucych do przeszukiwania zawartoci plikw XML, podobnie jak zapytania SQL su do
przeszukiwania informacji przechowywanych w bazach danych. Jzyk XPath moe by dosy
zoony, wic w tym rozdziale nawet nie sprbuj opisywa jego skadni. Zamiast tego
skoncentruj si na zademonstrowaniu sposobu wykorzystania zapyta XPath do przeszukiwania
dokumentw XML.
Zapytania XPath s acuchami znakw skadajcymi si ze sw kluczowych reprezentujcych
fragmenty plikw XML. Zapytania te s wykonywane przez metod Select klasy
XPathNavigator. Zakadaj, e chcielibymy korzysta z naszego przykadowego pliku
books.xml, wywoanie tej metody mogoby przyj ponisz, przykadow posta:
objNav.Select("descendant::book/author/last-name")

Powysze zapytanie zwrci nazwiska wszystkich autorw wszystkich ksiek opisanych w pliku.
Drugie przykadowe zapytanie XPath zwrci natomiast wycznie cen ostatniej ksiki:
objNav.Select("//book[last()]/price/text()")

Na listingu 12.7 zosta przedstawiony przykad prostej strony ASP.NET, ktra umoliwia podanie
zapytania XPath, a nastpnie je wykonuje i wywietla uzyskane wyniki.
Listing 12.7. Wykorzystanie zapyta XPath do pobierania danych XML
1 <%@Page Language="VB" %>
2 <%@Import Namespace="System.Xml" %>
3 <%@Import Namespace="System.Xml.XPath" %>
4
5 <script runat="server">
6 sub SelectData(obj as object,e as eventargs)
7 Dim objDocument as New XPathDocument _
8 (Server.MapPath("../rozdzial11/books.xml"))
9
10 Dim objNav as XPathNavigator = objDocument.CreateNavigator
11
12 lblMessage.Text = ""
13 try
14 dim objIterator as XPathNodeIterator = _
15 objNav.Select(tbQuery.Text)
16
17 While objIterator.MoveNext()
18 lblMessage.Text += "&lt;" & _
19 objIterator.Current.Name & "&gt; " & _
20 objIterator.Current.Value & "<br>"
21 end while
22 catch ex As Exception
23 lblMessage.Text = ex.Message
24 end try
25 end sub
26 </script>
27
28 <html><body>
29 <form runat="server">
30 <h2>Zapytania XPath</h2>
31 <p>
32 Na przyad:<br>
33 <b><code>//book[last()]/@ISBN/text()</b></code> lub
34 <b><code>descendant::book/author/last-name</b></code><p>
35
36 Podaj zapytanie XPath:
37 <asp:Textbox id="tbQuery" runat=server/>
38 <asp:Button id="btnSubmit" text="Wykonaj zapytanie"
39 runat=server OnClick="SelectData"/><p>
40 <asp:Label id="lblMessage" runat=server/>
41 </form>
42 </body></html>

Analiza
W powyszym przykadzie, wszystkie najwaniejsze czynnoci wykonywane s w procedurze
SelectData, obsugujcej zdarzenia generowane przez element sterujcy przycisku zdefiniowany
w wierszach 38. i 39. Kod zapisany w wierszach od 7. do 10. powinien wyglda znajomo
odpowiada on za stworzenie obiektw XPathDocument oraz XPathNavigator. Prawdziwa
zabawa zaczyna si natomiast w wierszu 13. gdzie rozpoczyna si blok try. Aby zwrci
poszukiwane dane XML, wykorzystywana jest metoda Select, w ktrej wywoaniu zostaje
podane zapytanie XPath wpisane przez uytkownika w polu tekstowym. Metoda ta zwraca obiekt
XmlPathNodeIterator, ktry pozwala na atwe przetworzenie uzyskanych wynikw. Zwrcone
wyniki s przetwarzane w ptli while, ktra, dziki wykorzystaniu metody MoveNext, pobiera
kolejno kady ze zwrconych wzw. Dla kadego z nich wywietlana jest nazwa i warto, przy
czym informacje te s okrelane za pomoc waciwoci Current.Name oraz Current.Value.
Przykadowe wyniki wykonania powyszego przykadu, przedstawione zostay na rysunku 12.9.
Rysunek 12.9. Przeszukiwanie danych XML przy wykorzystaniu zapyta XPath

Jzyk XPath stanowi bardzo potny i doskonay mechanizm sucy do pobierania danych XML.
Dziki niemu, nie bdziesz ju musia wykonywa zapyta posugujc si obiektami DataSet.
Wicej informacji na temat zapyta XPath znajdziesz na witrynie WWW W3C, pod adresem
http://www.w3.org/TR/xpath.

Przeksztacenia XSL
Wszystkie instrukcje XSL s obsugiwane przez procesor przeksztace XSL (okrelany skrtowo
jako XslT, od angielskich sw: XSL transform procesor). Jzyk XSL suy do tworzenia arkuszy
stylw, ktre informuj XslT o tym, w jaki sposb naley przeksztaci dane XML. Arkusze
stylw XSL okrelaj jak XslT ma sformatowa dane XML po ich przetworzeniu; podobnie jak
kaskadowe arkusze stylw informuj przegldark w jaki sposb ma sformatowa poszczeglne
elementy strony WWW. Na rysunku 12.10 przedstawiem proces przeksztacania jednego
dokumentu XML na drugi.

Rysunek 12.10. Procesor XSL wykorzystuje arkusze stylw XSL, aby przeksztaci dokument
XML na inny dokument strukturalny
Opis rysunku
XML file Plik XML
XSL Stylesheet Arkusz stylw XSL
XSL Procesor Procesor przeksztace XSL
HTML document Dokument HTML
XML document Dokument XML
Other Inny dokument strukturalny
Procesor przeksztace XSL pobiera fragmenty pliku XML wykorzystujc w tym celu zapytania
XPath, a nastpnie formatuje je na podstawie arkusza stylw XSL. W ASP.NET przeksztacenie
dokumentu XML jest bardzo proste trzeba tylko poda arkusz stylw XSL. Na listingu 12.8
przedstawiem arkusz stylw books.xsl.

Listing 12.8. Arkusz stylw XSL


1 <xsl:stylesheet
2 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3 version="1.0">
4 <xsl:template match="/">
5 <root>
6 <xsl:apply-templates/>
7 </root>
8 </xsl:template>
9 <xsl:template match="bookstore">
10 <HTML><BODY>
11 <TABLE width="450">
12 <TR>
13 <TD><b>Title</b></TD>
14 <TD><b>Price</b></TD>
15 </TR>
16 <xsl:apply-templates select="book"/>
17 </TABLE>
18 </BODY></HTML>
19 </xsl:template>
20 <xsl:template match="book">
21 <TR>
22 <TD><xsl:value-of select="title"/></TD>
23 <TD><xsl:value-of select="price"/></TD>
24 </TR>
25 </xsl:template>
26 </xsl:stylesheet>

Analiza
Powyszy arkusz stylw przeksztaca dokument XML na dokument HTML. Znaczniki
xsl:template okrelaj w jaki sposb naley przeksztaca konkretne fragmenty dokumentu
XML. Na przykad, fragment arkusza stylw rozpoczynajcy si w wierszu 20., okrela posta
wszystkich wzw o nazwie book.
W tym przypadku przeksztacamy dokument XML do postaci dokumentu HTML, co tumaczy
obecno znacznikw HTML, BODY, itd. Jednak rwnie atwo mona by przeksztaci go do postaci
innego dokumentu XML wszystko sprowadza si jedynie do podania odpowiednich
znacznikw.
Na listingu 12.9 przedstawiony zosta przykad strony ASP.NET, ktra wykorzystuje arkusz
stylw XSL z listingu 12.8, aby przeksztaci plik books.xml do postaci dokumentu HTML.

Listing 12.9. Wykorzystanie arkusza stylw XSL oraz procesora przeksztace XSL do
przeksztacenia pliku XML na dokument HTML
1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Xml" %>
3 <%@ Import Namespace="System.Xml.XPath" %>
4 <%@ Import Namespace="System.Xml.Xsl" %>
5
6 <script runat="server">
7 sub Page_Load(obj as object, e as eventargs)
8 Dim objDocument as New XPathDocument _
9 (Server.MapPath("../rozdzial11/books.xml"))
10
11 Dim objNav as XPathNavigator = _
12 objDocument.CreateNavigator
13
14 Dim objXslT As XslTransform = New XslTransform()
15 dim objWriter as XmlTextWriter = new XmlTextWriter _
16 (Server.MapPath("output.html"), nothing)
17
18 try
19 objXslT.Load(Server.MapPath("books.xsl"))
20 objXslT.Transform(objNav, nothing, objWriter)
21 objWriter.Close
22
23 lblMessage.Text = "Plik zosta poprawnie zapisany."
24 catch ex As Exception
25 lblMessage.Text = ex.Message
26 end try
27 end sub
28 </script>
29
30 <html><body>
31 <asp:Label id="lblMessage" runat="server"
32 maintainstate=false/>
33 </body></html>

Analiza
Pierwsz rzecz na jak naley zwrci uwag jest dodatkowa przestrze nazw
System.Xml.Xsl importowana w wierszu 4. W wierszach od 6. do 11. wykonywane s
standardowe czynnoci stworzenie obiektw XPathDocument oraz XPathNavigator. W
wierszu 13. tworzony jest obiekt XslTransform, a w wierszu 14. obiekt XmlTextWriter, ktry
posuy nam do zapisania przeksztaconego dokumentu XML w pliku o nazwie output.html.
Wewntrz bloku try plik XSL jest odczytywany i zapisywany w obiekcie XslTransform, ktry
wykorzysta arkusz stylw jako schemat na podstawie ktrego zostanie okrelona posta nowego
dokumentu HTML. Nastpnie wywoywana jest metoda Transform obiektu XslTransform,
ktra przeksztaci dokument XML zgodnie z arkuszem stylw XSL. Pierwszym argumentem
wywoania tej metody jest zawarto pliku XML, ktr naley przeksztaci (przekazana jako
obiekt XPathNavigator, drugim dodatkowe parametry jakie naley przekaza do pliku XSL
(w tym przypadku adne parametry nie s przekazywane), a trzecim obiekt XmlTextWriter,
w ktrym naley zapisa przeksztacone dane XML.
W kocu, w wierszu 21. zamykany jest obiekt pisarza, a w wierszu 23. wywietlany krtki
komunikat informujcy o przeksztaceniu pliku. Po wykonaniu powyszego przykadu, w tym
samym folderze powinien si pojawi plik output.html. Bdzie on zawiera informacje pobrane z
oryginalnego pliku XML, przedstawione na rysunku 12.11.

Rysunek 12.11. Wyniki wykonania przeksztacenia XSL zapisane w formie dokumentu HTML
Przeksztacone dane XML mona by take zapisa w obiekcie XmlReader i wywietli na stronie.
W tym celu zmieni kod zapisany w wierszu 19. w nastpujcy sposb:
objReader = objXslT.Transform(objNav, nothing)

W tym przypadku zmienna objReader jest obiektem XmlReader. I to wszystko. Listing 12.10
przedstawia peny kod przykadu wykorzystujcego obiekt XmlReader zamiast obiektu
XmlTextWriter.

Listing 12.10. Wywietlanie przeksztaconych danych XML przy wykorzystaniu obiektu


XmlReader
1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Xml" %>
3 <%@ Import Namespace="System.Xml.XPath" %>
4 <%@ Import Namespace="System.Xml.Xsl" %>
5
6 <script runat="server">
7 sub Page_Load(obj as object, e as eventargs)
8 Dim objDocument as New XPathDocument _
9 (Server.MapPath("../rozdzial11/books.xml"))
10
11 Dim objNav as XPathNavigator = _
12 objDocument.CreateNavigator
13 Dim objXSLT As XslTransform = New XslTransform()
14 dim objReader as XmlReader
15
16 try
17 objXSLT.Load(Server.MapPath("books.xsl"))
18 objReader = objXslT.Transform(objNav, nothing)
19 While objReader.Read()
20 Response.Write("<b>" & objReader.Name & "</b> " & _
21 objReader.Value & "<br>")
22 End While
23
24 lblMessage.Text = "Plik zosta poprawnie zapisany."
25 catch ex As Exception
26 lblMessage.Text = ex.Message
27 end try
28 end sub
29 </script>
30
31 <html><body>
32 <asp:Label id="lblMessage" runat="server"
33 maintainstate=false/>
34 </body></html>

Powyszy przykad rni si od kodu z listingu 12.9 jedynie tym, i zosta w nim wykorzystany
obiekt XmlReader a nie XmlTextWriter. Z tego wzgldu HTML uzyskany w wyniku
przeksztacenia nie jest zapisywany w pliku. W wierszach od 19. do 22. znajduje si ptla while,
ktra przy uyciu metody Read pobiera po kolei wszystkie elementy danych wynikowych i
wywietla je.
Obiekt XmlTransform dysponuje jedynie dwiema metodami Load oraz Transform a
zatem jego wykorzystanie nie powinno przysparza wikszych problemw.
Pamitasz zapewne, e procesor przeksztace XSL wykorzystuje zapytania XPath. Plik XSL
okrela nazwy wzw, ktre naley przeksztaci. Obiekt XmlTransform wykorzystuje zapytania
XPath do pobrania wzw o okrelonych nazwach, przy czym Ty jako programista nawet nie
wiesz w jaki sposb cay ten proces jest realizowany. Rwnie dobrze mona by samemu uy tych
zapyta o pobrania danych, a nastpnie je sformatowa. Jednak po co si mczy jeli obiekty
XmlTransform mog zrobi to za nas?

Wicej informacji na temat XSL mona znale na witrynie W3C, na stronach:


http://www.w3.org/TR/xsl oraz http://www.w3.org/TR/xslt.
To nie jest ASP!
Wiele spord technik opisanych w tym rozdziale jest take dostpnych we wczeniejszej,
tradycyjnej wersji technologii ASP. Na przykad, sparametryzowane procedury zachowane byy
kiedy niezwykle popularnym sposobem wykonywania zapyta SQL. Take operacje na danych
XML mona byo wykonywa, cho by do tego potrzebny specjalny, dodatkowy komponent
ASP. ASP.NET udostpnia jednak znacznie prostsze sposoby wykonywania tych wszystkich
czynnoci, gdy wszystkie konieczne moliwoci funkcjonalne s wbudowane bezporednio w
rodowisko .NET i s w peni obiektowe.
Wielu programistw ASP spotkao si ju z omawianymi tu zagadnieniami, a zatem
wykorzystanie ich w rodowisku .NET nie powinno przysparza wikszych trudnoci. Zmianie
uleg jedynie sposb implementacji; wci mona natomiast korzysta z istniejcych procedur
zachowanych, arkuszy stylw i zapyta XPath. Jedyne co bdziesz musia zrobi, to korzysta z
nich przy uyciu innych obiektw.
Rozdzia 13.
Odczytywanie i zapisywanie
plikw na serwerze WWW
Odczyt i zapis plikw jest niezwykle wanym zagadnieniem ASP.NET. W poprzedniej czci
ksiki tworzye ju strony ASP.NET wykorzystujce pliki zewntrzne (na przykad plik
config.web, kod obsugi formularzy, pliki XML, itp.), jednak w tym rozdziale dowiesz si
znacznie wicej o sposobie w jaki inne typy plikw mog powikszy moliwoci funkcjonalne
aplikacji ASP.NET.
Istnieje bardzo wiele moliwoci wykorzystania plikw bynajmniej nie ograniczaj si one do
przechowania danych zewntrznych. W tym rozdziale omwione zostan nastpujce zagadnienia:
Sposoby uycia plikw w ASP.NET oraz gdzie pliki te bd widziane.
Sposoby doczania plikw do stron ASP.NET.
Sposoby dostpu do waciwoci plikw i folderw.
Sposoby otwierania, odczytu i zapisu informacji w plikach.
Sposoby dostarczania wydzielonych obszarw przechowywania danych dla kadego z
uytkownikw.

Wykorzystanie plikw w ASP.NET


Dziki rodowisku .NET wykorzystanie plikw zewntrznych (czyli plikw z rozszerzeniem inne
ni .aspx) w ASP.NET jest bardzo atwe. W rzeczywistoci, pliki te s konieczne, by aplikacje
ASP.NET dziaay poprawnie. Do takich niezbdnych plikw mona zaliczy web.config oraz
global.asax kontrolujce sposb dziaania aplikacji.
Pliki zewntrzne mona take wykorzysta do zwikszenia moliwoci funkcjonalnych ASP.NET.
Poznae ju kilka takich plikw, na przykad wasne elementy sterujce oraz przestrzenie nazw
kompilowane do postaci bibliotek DLL. Pliki te zwikszaj moliwoci funkcjonalne tworzonych
aplikacji ASP.NET, a jednoczenie umoliwiaj zachowanie prostoty kodu rdowego stron
ASP.NET.
APS.NET pozwala take na korzystanie z plikw, ktre w ogle nie stanowi czci aplikacji lecz
mog si w niej przyda. Do plikw tego typu mona zaliczy pliki zawierajce informacje
tekstowe, importowane pliki z nagwkami informacyjnymi, pliki zawierajce informacje o
aplikacji, pliki z yciorysami, oraz wszelkie inne pliki, ktre w jakikolwiek sposb mog si
okaza przydatne. ASP.NET pozwala na dostp i wykorzystanie caego systemu plikw serwera, a
zatem moliwoci s ogromne.
Doczanie zawartoci plikw zewntrznych
Jednym ze sposobw wykorzystania plikw w ASP.NET jest, tak zwane, doczanie plikw.
Sposb ten przypomina pobranie zawartoci jednego pliku i umieszczenie jej wewntrz drugiego
pliku; na szczcie jednak, programista nie musi tego robi samemu. Sposoby przedstawione w
kilku kolejnych podrozdziaach pokazuj rne metody doczania plikw dostpne w ASP.NET.

Server-Side Includes
Server-Sice Includes (doczanie plikw po stronie serwera, w skrcie SSI) jest sposobem
oddzielania kodu od tworzonej strony. Metoda jest przydatna w sytuacjach gdy chcemy
wielokrotnie uywa wybranego fragmentu kodu, bd uproci edycj stron.
Skadnia pozwalajca na doczanie kodu t metod ma nastpujc posta:
<!--#include file="nazwaPliku"-->

lub
<!--#include virtual="nazwaPliku"-->

Sowo kluczowe virtual suy do okrelenia nazwy doczanego pliku przy wykorzystaniu
cieki wirtualnej, natomiast sowo kluczowe file umoliwia podanie cieki dostpu do pliku w
lokalnej strukturze folderw. Na przykad, jeli by chcia doczy zawarto pliku o adresie
http://twoj.serwer.com.pl/includes/plik1.aspx do strony ASP.NET o adresie
http://twoj.serwer.com.pl/folder1/folder2/strona.aspx, mgby w tym celu wykorzysta jedno z
dwch poniszych polece #include:
<!--#include file="../../includes/plik1.aspx"-->

lub
<!--#include virtual="/includes/plik1.aspx"-->

Zwr uwag, i uyte polecenie #include file bdzie miao rn posta w zalenoci do
pooenia strony, w ktrej bdzie umieszczana zawarto doczanego pliku. Okrelenie pliku
wykorzystywane w takim poleceniu nazywamy wzgldn ciek dostpu do pliku. Uywanie
takich cieek moe by denerwujce, zwaszcza gdy strony wykorzystujce polecenie #include
znajduj si w rnych folderach. Z tego wanie powodu ASP.NET umoliwia take doczanie
plikw na podstawie bezwzgldnych cieek dostpu suy do tego polecenie #include
virtual przedstawione na drugim przykadzie. Umoliwia ono okrelenie pooenia doczanego
pliku w sposb niezaleny od pooenia pliku, do ktrego zostanie on doczony.
Umiemy zatem nagwek w pliku, ktry bdziemy mogli doczy do wielu rnych stron
ASP.NET. W tym celu, w pierwszej kolejnoci naley stworzy stron ASP.NET o nazwie
header.aspx i umieci w niej nastpujcy kod:
<a href="index.aspx"><img src="header.gif" alt="Strona gwna"></a><hr>
<a href="index.aspx">Strona gwna</a> <a href="logout.aspx">Wyjd</a>

Nie naley umieszcza w tym pliku adnych innych znacznikw, jak na przykad elementy
<form> zostan one umieszczone w kodzie strony, do ktrej plik header.aspx bdzie
doczany. Kolejn czynnoci bdzie stworzenie w tym samym folderze kolejnej strony
ASP.NET i doczenie do niej nagwka:
<script language="VB" runat="server">
sub Page_Load(obj as object, e as eventargs)
end sub
</script>

<html><body>
<!--#include file="header.aspx"-->
Witamy!
</body></html>
ASP.NET wstawi zawarto pliku header.aspx zanim zostan przetworzone jakiekolwiek
polecenia ASP.NET. Z tego wzgldu, gdy strona bdzie ju gotowa do wykonania, rodowisko
ASP.NET bdzie uwaao i jej kod ma nastpujc posta:
<script language="VB" runat="server">
sub Page_Load(obj as object, e as eventargs)
end sub
</script>

<html><body>
<a href="index.aspx"><img src="header.gif" alt="Strona gwna"></a><hr>
<a href="index.aspx">Strona gwna</a> <a href="logout.aspx">Wyjd</a>
Witamy!
</body></html>

Posta strony, po wywietleniu w przegldarce, przedstawiem na rysunku 13.1.

Rysunek 13.1. Zawarto plikw doczanych po stronie serwera jest traktowana tak, jak gdyby
stanowia cz wykonywanej strony ASP.NET

Notatka
Naley pamita, e wszystkie opisywane czynnoci s wykonywane na serwerze, zanim
jakiekolwiek informacje zostan przesane do przegldarki. Zawarto wszystkich plikw jest
czona ze sob na serwerze zanim zostanie wykonany jakikolwiek kod ASP.NET i zanim
cokolwiek zostanie przesane do klienta. Dziki temu, wywoania metody Response.Redirect
bd dziaa poprawnie.

Polecenia #include mona umieszcza w dowolnych miejscach stron ASP.NET, oznacza to, i
przedstawiony w powyszym przykadzie nagwek, rwnie dobrze mgby by doczony jako
stopka. W doczanym pliku mona by take umieci znaczniki <html> oraz <body>, jak
rwnie elementy sterujce wykonywane na serwerze.

Ostrzeenie
Domylnie polecenie #include mona uywa wycznie w plikach o rozszerzeniach .shtml,
.shtm, .stm, .asp, .asa, .asax oraz .aspx. Polecenie to umieszczone w kodzie strony HTML nie
zostanie przetworzone. Rozszerzenia plikw obsugujcych mechanizm Server-Side Includes
mona okrela w Internet Services Managerze programie zarzdzajcym serwerem IIS 5.0.

Server-Side Includes a inne sposoby doczania plikw


Moesz si zastanawia nad rnic pomidzy technologi Server-Side Includes a elementami
sterujcymi tworzonymi przesz uytkownikw. Oba te rozwizania mona wykorzystywa w tych
samych celach od wydzielania fragmentw interfejsu uytkownika. Rnica pomidzy nimi
polega na tym, i elementy sterujce su wycznie do tworzenia fragmentw interfejsu
uytkownika, natomiast SSI mona uywa w rnych celach, midzy innymi do wydzielenia i
zapisania w jednym miejscu czsto wykorzystywanych funkcji i staych.
Zazwyczaj, w przypadku wydzielania elementu interfejsu uytkownika, lepiej jest posuy si
elementem sterujcym, gdy mona w nim wykorzysta elementy programistyczne; SSI nie daje
tej moliwoci.

Tak Nie
SSI naley si posugiwa jeli chcemy Nie naley uywa SSI gdy chcemy doczy do
docza do tworzonych stron czsto strony wycznie element interfejsu
wykorzystywane elementy programistyczne, uytkownika. W takim przypadku lepszym
takie jak klasy lub funkcje. rozwizaniem bdzie wykorzystanie elementw
sterujcych tworzonych przez uytkownika.

Inne sposoby doczania plikw


rodowisko ASP.NET udostpnia take inne sposoby doczania plikw. Wikszo z nich zostaa
ju przedstawiona we wczeniejszych czciach ksiki. Kod obsugi formularzy omwiem w
rozdziale 6, pt.: Cig dalszy wiadomoci na temat tworzenia formularzy internetowych.
Informacje na temat dyrektywy Import znajdziesz natomiast w rozdziale 2 pt.: Tworzenie
stron ASP.NET. I w kocu, w rozdziale 5. pt.: Podstawowe wiadomoci o tworzeniu
formularzy internetowych opisaem tworzenie elementw sterujcych uytkownika.
Wszystkie te metody rni si sposobem implementacji, lecz kada z nich zapewnia moliwo
doczania do stron ASP.NET zawartoci innych plikw.

Dostp do plikw
Przestrze nazw System.IO udostpnia wiele moliwoci funkcjonalnych, z ktrych mona
korzysta przy tworzeniu stron ASP.NET. Do moliwoci tych naley zaliczy odczytywanie i
zapisywanie plikw, tworzenie i usuwanie folderw oraz sprawdzanie atrybutw plikw i
folderw. Moliwoci funkcjonalne udostpniane przez t przestrze nazw pozwalaj take na
wykonywanie czynnoci w odpowiedzi na zdarzenia zwizane z systemem plikw, takie jak
stworzenie lub usunicie folderu przez innego uytkownika.

Pliki, strumienie, czytelnicy i pisarze


Nim zaczniemy poznawa klasy dostpne w przestrzeni nazw System.IO oraz operowa na
plikach, naley przedstawi rnic pomidzy plikami i strumieniami. Zagadnienie to jest wane,
gdy zarwno pliki jak i strumienie s w ASP.NET czym zupenie innym.

Nowe okrelenie
Z technicznego punktu widzenia plik jest kolekcj danych, ktrej nadano nazw i zapisano w
unikalnym miejscu na dowolnie dugi okres czasu. Na przykad, pliki przechowywane na dysku
twardym Twojego komputera posiadaj nazw i ciek dostpu, a moesz z nich korzysta w
kadej chwili gdy tylko bdziesz tego potrzebowa. Moesz wyobraa sobie plik jako pudeko
zawierajce rne rzeczy realny obiekt.

Nowe okrelenie
Natomiast ze strumieniem nie jest skojarzona adna nazwa pliku, cieka dostpu ani te miejsce
przechowywania. Strumie moe zosta wykorzystany do odczytania lub zapisu danych z
dowolnego miejsca, na przykad pliku, sieci czy te pamici. A zatem strumie jest sposobem
zapewnienia dostpu do dowolnych informacji, w tym take do plikw. Gdy otwierasz i
odczytujesz zawarto pliku, w rzeczywistoci jest przy tym wykorzystywany strumie.
Dostpnych jest wiele rnych typw strumieni, lecz wszystkie one s klasami potomnymi klasy
Stream.

Strumienie zapewniaj binarny dostp do danych odczytuj one nieprzetworzone informacje w


formie zer i jedynek. Taki sposb dostpu do danych moe by przydatny, lecz w ASP.NET
bardziej interesuje nas korzystanie z informacji zapisanych w kodzie Unicede czyli z
acuchw znakw, a nie cigw zer i jedynek.
rodowisko .NET udostpnia dwie klasy suce wanie do tego celu TextReader oraz
TextWriter. Nie bd ich tu szczegowo opisywa, jednak naley wiedzie i dziedziczy po
nich wiele innych klas. Przykadami klas potomnych kas TextReader oraz TextWriter s
XmlTextReader oraz XmlTextWriter przedstawione w rozdziale 11., pt.: Uycie XML w
ASP.NET; a w tym rozdziale poznasz kilka kolejnych.
A zatem dysponujemy ju dwiema niezalenymi kategoriami klas Stream oraz klasami
potomnymi zapewniajcymi dostp do danych binarnych oraz TextReader i TextWriter (oraz
ich klasami potomnymi) zapewniajcymi dostp do danych tekstowych. Poznajc rodowisko
.NET bez adnych trudnoci mona okreli do ktrej z tych kategorii naley interesujca nas
klasa. Klasy i obiekty dziedziczce po klasie Stream maj zazwyczaj w nazwie sowo stream;
na przykad: FileStram, MemoryStram, itp. Z kolei klasy dziedziczce po klasach TextReader
oraz TextWriter maj zazwyczaj w nazwach sowa reader lub writer; na przykad:
XmlTextReader, XmlTextWriter, itd.

Na szczcie dostpne s take klasy umoliwiajce konwersj danych binarnych na tekstowe.


Dwie takie klasy StreamReader oraz StreamWriter niezwykle wane dla operacji na
plikach w ASP.NET, zostan opisane w dalszej czci tego rozdziau. Rysunek 13.2 ilustruje
wzajemne zalenoci pomidzy tymi wszystkimi klasami.

Rysunek 13.2. Wzajemne relacje pomidzy klasami Stream (i klasami potomnymi) oraz
klasami TextReader i TextWriter (i ich klasami potomnymi)
Opis rysunku
Use these .NET object Posu si nastpujcymi obiektami .NET
To access Aby uzyska dostp do nastpujcych rde danych
Memory Pami
Networks Sieci
Files Pliki
Pozostae (Stream, MemoryStream, TextReader) bez zmian

Notatka
Nie naley myli strumieni, czyli klasy Stream oraz jej klas potomnych, ze strumieniowaniem.
Strumienie pozwalaj na uzyskanie dostpu do miejsc w ktrych przechowywane s informacje,
natomiast strumieniowanie to metoda dynamicznego pobierania danych, kawaek po kawaku,
gdy s potrzebne. Strumienie mona porwna z rzeczownikiem, natomiast strumieniowanie z
czasownikiem strumienie mog, cho nie musz, by strumieniowane.

Nowe okrelenie
Klasa Stream pozwala na asynchroniczny dostp do danych. Oznacza to, e podczas
wykonywania operacji na plikach, jednoczenie mog by realizowane inne czynnoci. Na
przykad, w przypadku zapisu informacji do bardzo duego pliku co prawdopodobnie bdzie trwa
dosy dugo, plik ten mona otworzy asynchronicznie i zapisywa w nim dane w tle, a
jednoczenie wykonywa kod, ktry przekieruje uytkownika w inne miejsce witryny.
Przeciwiestwem dostpu asynchronicznego jest dostp synchroniczny. W tym przypadku, aby
wykona kolejny fragment kodu, realizacja poprzedniego fragmentu musi si zakoczy.
Wykorzystanie tego trybu dostpu do plikw moe doprowadzi do pogorszenia efektywnoci
dziaania aplikacji. Rnice pomidzy sposobem wykonywania operacji przy wykorzystaniu
dostpu asynchronicznego i synchronicznego, zostay zilustrowane na rysunku 13.3. W tym
rozdziale przedstawi wycznie synchronicznych dostp do danych; wicej informacji na temat
dostpu asynchronicznego znajdziesz w dokumentacji rodowiska .NET.

Rysunek 13.3. Asynchroniczny sposb wykonywania czynnoci czsto powoduje poprawienie


efektywnoci dziaania aplikacji.
Opis rysunku
Time Czas
Asynchronous Dostp asynchroniczny
Synchronous Dostp synchroniczny
General code Wczeniejszy kod programu
Other operations Inne czynnoci
File operations Operacje na plikach
Continuing Kolejne czynnoci

Okrelanie waciwoci plikw i folderw


W tej czci rozdziau skoncentrujemy si na czterech klasach: File i Directory oraz
FileInfo oraz DirectoryInfo. Pierwsze dwie z nich udostpniaj metody suce do
tworzenia, modyfikacji oraz usuwania plikw i folderw; a pozostae waciwoci
umoliwiajce okrelanie atrybutw plikw i folderw. Przykad wykorzystania obiektw tych
klas przedstawiony zosta na listingu 13.1.

Listing 13.1. Wywietlanie informacji o plikach i folderach


1 <%@ Import Namespace="System.IO" %>
2 <script language="VB" runat="server">
3
4 sub Page_Load(obj as object, e as eventargs)
5 dim f as new FileInfo(Server.MapPath("listing1301.aspx"))
6
7 lblMessage.Text = "Informacje o pliku<br>" & _
8 "<b>Nazwa: </b>" & f.Name & "<br>" & _
9 "<b>cieka: </b>" & f.DirectoryName & "<br>" & _
10 "<b>Czas ostatniego dostpu: </b>" & f.LastAccessTime & _
11 "<br>" & _
12 "<b>Czas ostatniego zapisu: </b>" & f.LastWriteTime & _
13 "<br>" & _
14 "<b>Dugo: </b>" & f.Length & " bajtw<p>"
15
16 'powrt do folderu nadrzdnego
17 dim dir as DirectoryInfo = f.Directory
18
19 lblMessage.Text += "Informacje o folderze<br>" & _
20 "<b>Nazwa: </b>" & dir.Name & "<br>" & _
21 "<b>Pena nazwa: </b>" & dir.FullName & "<br>" & _
22 "<b>Czas ostatniego dostpu: </b>" & dir.LastAccessTime & _
23 "<br>" & _
24 "<b>Czas ostatniego zapisu: </b>" & dir.LastWriteTime & _
25 "<br>" & _
26 "<b>Folder nadrzdny: </b>" & dir.Parent.Name & "<br>"
27
28 end sub
29
30 </script>
31
32 <html><body>
33 <asp:label id="lblMessage" runat=server/>
34 </body></html>

Analiza
Zapisz powyszy kod w pliku o nazwie listing1301.aspx. W pierwszym wierszu strony
importowana jest dodatkowa przestrze nazwa System.IO. W wierszu 5. tworzona jest nowa
kopia obiektu FileInfo zawierajcego informacje o naszym przykadowym pliku (dziki temu
moemy mie pewno, e analizowany plik bdzie istnia). By moe przypominasz sobie, e w
rozdziale 4., pt.: Stosowanie obiektw ASP.NET w jzykach C# i VB.NET zostaa
przedstawiona metoda Server.MapPath, ktra odwzorowuje ciek wirtualn na fizyczn. W
wierszach od 8. do 14. s wywietlane informacje na temat analizowanego pliku. Wyniki
wykonania powyszego przykadu przedstawione zostay na rysunku 13.4.

Rysunek 13.4. Wywietlanie informacji o plikach i folderach

W wierszu 17. tworzony jest obiekt DirectoryInfo. Przy jego tworzeniu wykorzystana zostaa
waciwo Directory, okrelajca folder w ktrym jest przechowywany analizowany plik.
Nastpnie, w wierszach od 20. do 26. wywietlane s informacje na temat wybranego folderu. Jak
wida, obiekty FileInfo oraz DirectoryInfo maj wiele bardzo podobnych waciwoci.

Ostrzeenie
Jeli wybrany plik nie bdzie istnie, to zostanie zgoszony bd. Przy wykorzystaniu metody
FileExists klasy File, mona sprawdzi czy wybrany plik istnieje czy nie.
Podobnie, przy uyciu metody DirectoryExists klasy Directory mona sprawdzi czy
wskazany folder jest poprawny.

Obiekty klas File oraz Directory dysponuj take kolekcj Attributes, za porednictwem
ktrej mona uzyska dodatkowe informacje o pliku lub folderze, na przykad, czy jest on
przeznaczony tylko do odczytu bd ukryty. Wszystkie dostpne atrybuty zebrane zostay w tabeli
13.1.

Tabela 13.1. Atrybuty i wartoci plikw i folderw


Atrybut Warto
Readonly 1
Hidden 2
System 4
Directory 16
Archive 32
Encrypted 64
Normal 128
Temporary 256
SparseFile 512
ReparsePoint 1024
Compressed 2048
OffLine 4096
NotContentIndexed 8192

Okrelajc waciwoci poszczeglnych plikw i folderw wartoci te s do siebie dodawane. Na


przykad, wykonanie poniszego kodu dla pliku listing1301.aspx:
Response.Write(f.Attributes)

spowoduje wygenerowanie acucha znakw "32", co oznacza i plik ten jest archiwalny. Aby
okreli atrybuty pliku wystarczy zsumowa wybrane wartoci z tabeli 13.1 i przypisa je
waciwoci Attributes. Na przykad, aby sprawi e nasz przykadowy plik bdzie ukryty,
systemowy, skompresowany, zaszyfrowany i nie indeksowany, wystarczy wykona nastpujc
instrukcj:
f.Attributes = 10306

Ostrzeenie
Nie mona bezporednio okrela wartoci poszczeglnych atrybutw. Na przykad, ponisza
instrukcja:

f.Attributes.Hidden = 2

spowoduje zgoszenie bdu. Atrybut Hidden jest bowiem sta i nie mona go modyfikowa.
Atrybuty mona zmienia wyczenie, za porednictwem waciwoci Attributes, na
przykad:

f.Attributes = 2
Zapamitanie wartoci poszczeglnych atrybutw moe przysporzy duo problemw. A zatem,
znacznie lepszym rozwizaniem jest posugiwanie si nazwami odpowiednich staych oraz
operatorem BitOr:
f.Attributes = FileAttributes.Hidden BitOr _
FileAttributes.Compressed BitOr _
FileAttributes.NotContentIndexed

Wykonanie powyszego fragmentu kodu ma ten sam efekt co przypisanie waciwoci


Attributes wartoci 10306. BitOr to jeden z grupy operatorw bitowych dostpnych w jzyku
VB.NET; pozwala on na porwnywanie wartoci bitowych. Innymi operatorami zaliczajcymi si
do tej grupy s: BitAnd, BitNot oraz BitXor. Aby okreli czy dla analizowanego pliku jest
ustawiony wybrany atrybut, naley posuy si operatorem BitAnd:
if f.Attributes BitAnd FileAttriubutes.Hidden > 0 then
Response.Write("Ukryty")
end if

Powysze moliwoci doskonale nadaj si do wywietlania informacji o jednym pliku bd


folderze. Co jednak zrobi, jeli bdziemy musieli wywietli wicej informacji dotyczcych, na
przykad, wszystkich plikw w pewnym folderze? Ot klasa DirectoryInfo udostpnia dwie
metody GetFiles oraz GetDirectories ktre zwracaj kolekcje obiektw FileInfo
oraz DirectoryInfo. Przykad wykorzystania tych kolekcji przedstawiem na listingu 13.2.

Listing 13.2. Wywietlanie informacji o wszystkich plikach i folderach we wskazanym


folderze
1 <%@ Import Namespace="System.IO" %>
2 <script language="VB" runat="server">
3 sub Page_Load(obj as object, e as eventargs)
4 dim dir as new DirectoryInfo(Server.MapPath _
5 ("/aspnetdlakazdego"))
6
7 DataGrid1.DataSource = dir.GetFiles("*.*")
8 DataGrid1.DataBind()
9
10 DataGrid2.DataSource = dir.GetDirectories
11 DataGrid2.DataBind()
12
13 end sub
14
15 </script>
16
17 <html><body>
18 <b>Informacje o plikach</b><br>
19 <asp:DataGrid id="DataGrid1" runat="server"
20 width="100%"
21 Font-Name="Arial"
22 Font-Size="10pt"
23 AlternatingItemStyle-Backcolor="#cccccc"
24 AutogenerateColumns="true" />
25
26 <p>
27 <b>Informacje o folderach</b><br>
28 <asp:DataGrid id="DataGrid2" runat="server"
29 width="100%"
30 Font-Name="Arial"
31 Font-Size="10pt"
32 AlternatingItemStyle-Backcolor="#cccccc"
33 AutogenerateColumns="true" />
34 </body></html>

Analiza
W wierszu 7. pobierane s informacje o wszystkich plikach w biecym folderze. W tym celu
wywoywana jest ` etoda GetFiles("*.*"), gdzie *.* oznacza dowolny acuch znakw, po
ktrym jest umieszczona kropka, a po niej dowolny acuch znakw (czyli, przykadowo,
listing1302.aspx). Metoda ta zwraca kolekcj, a zatem bez problemw mona wykorzysta
element sterujcy DataGrid, aby wywietli zawarte w niej informacje w wybrany przez nas
sposb. W wierszu 10. wywoywana jest metoda GetDirectories, ktra zwraca informacje o
wszystkich folderach znajdujcych si w biecym folderze. Informacje te s wywietlane
podobnie jak informacje o plikach, przy wykorzystaniu elementu sterujcego DataGrid. Wyniki
wykonania powyszego przykadu przedstawione zostay na rysunku 13.5.

Rysunek 13.5. Prezentacja informacji zawartych w kolekcjach plikw i folderw

Informacje z obu kolekcji mona by take pobra przy wykorzystaniu ptli for, jednak element
sterujcy DataGrid udostpnia znacznie wygodniejszy mechanizm prezentacji danych. Do
pobrania i wywietlenia informacji o wszystkich podfolderach mona by uy funkcji
rekurencyjnej.
Stwrzmy teraz nieco bardziej przydatny przykad. Stworzymy przegldark plikw, ktrej bdzie
mona uy do przegldnicia zawartoci caego dysku twardego, podobnie jak Eksploratora
Windows. Strona ta powinna dawa uytkownikom moliwo wywietlania zawartoci folderw
i poruszania si po ich strukturze (podobnie jak Eksplorator Windows), jak rwnie pozwala na
podanie nazwy wybranego folderu, co usprawni poruszanie si po zawartoci dysku. Kod strony
ASP.NET o powyszych moliwociach funkcjonalnych przedstawiony zosta na listingu 13.3.

Listing 13.3. System poruszania si i prezentacji zawartoci systemu plikw


listing1303.aspx
1 <%@ Import Namespace="System.IO" %>
2 <script language="VB" runat="server">
3 private dir as DirectoryInfo
4 private f as FileInfo
5 private strDir as string
6
7 sub Page_Load(obj as object, e as eventargs)
8 if not Page.IsPostBack then
9 strDir = Request.Params("dir")
10
11 if strDir = "" then
12 strDir = "c:\"
13 end if
14
15 tbDir.Text = strDir
16 dir = new DirectoryInfo(strDir)
17 ListFiles()
18 end if
19 end sub
20
21 sub tbDir_Handle(obj as object, e as EventArgs)
22 strDir = obj.Text
23 if Directory.Exists(strDir) then
24 dir = new DirectoryInfo(strDir)
25 ListFiles()
26 else
27 lblMessage.Text = "Bdna nazwa folderu"
28 end if
29 end sub
30
31 sub ListFiles()
32 dim hl as HyperLink
33 dim d as DirectoryInfo
34 if not dir.Root.FullName = dir.FullName then
35 hl = new HyperLink
36 hl.Text = ".."
37 hl.NavigateURL = "listing1303.aspx?dir=" & _
38 Server.URLEncode(dir.Parent.FullName)
39 Panel1.Controls.Add(hl)
40
41 Panel1.Controls.Add(new LiteralControl("<br>"))
42 end if
43
44 for each d in dir.GetDirectories
45 hl = new Hyperlink
46 hl.Text = d.Name
47 hl.NavigateURL = "listing1303.aspx?dir=" & _
48 Server.URLEncode(d.FullName)
49 Panel1.Controls.Add(hl)
50
51 Panel1.Controls.Add(new LiteralControl("<br>"))
52 next
53
54 for each f in dir.GetFiles("*.*")
55 lblMessage.Text += f.Name & "<br>"
56 next
57 end sub
58 </script>

Analiza
Zapisz powyszy kod w pliku o nazwie listing1303.aspx. Za pierwszym razem gdy uytkownik
wywietli t stron w przegldarce, zostanie wywietlona zawarto folderu gwnego (w tym
przypadku C:\). W wierszu 9. pobierana jest warto parametru dania o nazwie dir suy
ona do okrelenia folderu, ktrego zawarto naley wywietli.
Jeli parametr dir nie zosta podany (co ma miejsce podczas pierwszego wywietlenia strony), to
wywietlana jest zawarto folderu domylnego C:\. W wierszu 16. tworzony jest nowy obiekt
DirectoryInfo zawierajcy informacje dotyczce biecego folderu, w wierszu 15., w polu
tekstowym jest wywietlana nazwa tego folderu (poprzez okrelenie wartoci waciwoci Text
pola tekstowego); a w wierszu 17. wywoywana procedura ListFiles.

Procedura ListFiles, ktrej kod rozpoczyna si w wierszu 31., pobiera po kolei wszystkie
elementy kolekcji folderw biecego obiektu DirectoryInfo. Wczeniej jednak, w wierszu
34., procedura sprawdza czy znajdujemy si na gwnym poziomie dysku. Jeli nie, to konieczne
bdzie wywietlenie poczenia "..", ktre umoliwi przejcie do folderu nadrzdnego. W tym
celu tworzony jest nowy obiekt HyperLink, ktry wywietla na stronie acuch znakw ".." i
kojarzy z nim adres URL biecej strony APS.NET z acuchem zapytania zawierajcym ciek
do folderu nadrzdnego. Gdy uytkownik kliknie to poczenie, wykonywana jest ta sama strona,
lecz przekazany do niej w acuchu zapytania parametr dir bdzie zawiera now ciek dostpu
w tym przypadku ciek do folderu nadrzdnego. Procedura obsugi zdarzenia Page Load
wykorzysta t ciek do stworzenia nowego obiektu DirectoryInfo. W wierszu 41. tworzony
jest nowy obiekt LiteralControl, ktry suy do dodania znacznika <br> pod poczeniu do
folderu nadrzdnego.
Dla kadego folderu wykonywana jest ta sama, jedna czynno tworzony jest element sterujcy
Hyperlink odsyajcy uytkownika z powrotem do tej samej strony ASP.NET. Element ten
wywietla na stronie krtk nazw folderu (patrz wiersz 46.) i dodaje jego pen nazw do
acucha zapytania (w wierszu 47.). Nasz przykadowa strona uywa tego parametru do
wywietlenia zawartoci nowego folderu. W wierszu 51. ponownie jest tworzony obiekt
LiteralControl, ktry dodaje znacznik <br> po poczeniu.

W wierszach do 54. do 56. pobierane s po kolei wszystkie nazwy plikw przechowywanych w


aktualnie przetwarzanym folderze. Nazwy te s nastpnie wywietlane przy wykorzystaniu
etykiety. Zanim przeanalizujemy ostatni procedur umieszczon w naszej przykadowej stronie
tbDir_Handle przyjrzymy si fragmentowi kodu strony definiujcemu jej interfejs
uytkownika. Zosta on przedstawiony na listingu 13.4.

Listing 13.4. Kod definiujcy interfejs uytkownika strony prezentujcej zawarto systemu
plikw listing1303.aspx
1 <html><body>
2 <form runat="server">
3 <b>Foldery:</b>
4 <asp:Textbox id="tbDir" runat="server"
5 OnTextChanged="tbDir_Handle"
6 AutoPostBack=true /><p>
7 <asp:Panel id="Panel1" runat="server"
8 MaintainState="true" />
9 <asp:label id="lblMessage" runat=server
10 maintainstate=false />
11 </form>
12 </body></html>

Analiza
Nasza przykadowa strona ASP.NET zawiera trzy elementy element sterujcy TextBox
wywietlajcy ciek dostpu do biecego folderu, Panel zawierajcy elementy sterujce
HyperLink oraz etykiet (element sterujcy Label) sucy do wywietlania nazw plikw oraz
wszelkich innych komunikatw tekstowych. Jeli zawarto pola tekstowego ulegnie zmianie (co
zapewne si stanie gdy uytkownik samemu poda nazw folderu), zostanie wywoana procedura
tbDir_Handle obsugujca zdarzenie TextChanged.

Kod tej procedury zosta przedstawiony na listingu 13.3, w wierszach od 21. do 29. Pobiera ona
tekst zapisany w polu tekstowym i wykorzystuje go do okrelenia nowego folderu. Naley zwrci
uwag na instrukcj if umieszczon w wierszu 23. Ot za kadym razem gdy uytkownik ma
moliwo wasnorcznego podania jakichkolwiek informacji, warto upewni si, e s one
poprawne. W tym przypadku wykorzystywana jest metoda DirectoryExists, ktra sprawdza
czy podana cieka wskazuje istniejcy folder. Jeli cieka nie jest prawidowa, to zostanie
wywietlony stosowny komunikat. Podobne testy s niezwykle istotne, szczeglnie w aplikacjach
tego typu.
W kocu, jeli podana cieka jest poprawna, ponownie wywoywana jest procedura ListFiles,
ktra wywietla zawarto nowego folderu. Wyniki wykonania tej strony zostay przedstawione na
rysunku 13.6.
Rysunek 13.6. Przykadowy listing zawartoci folderu wykonany przy uyciu naszej
przykadowej aplikacji

Nie wspominaem jeszcze o dwch zagadnieniach zwizanych z t aplikacj. Pierwszym z nich


jest wykorzystanie metody Server.URLEncode. Ot za kadym razem gdy tworzony jest nowy
obiekt Hyperlink i okrelany acuch zapytania, wywoywana jest take metoda
Server.URLEncode. Zapewnia ona, e wszelkie znaki specjalne zostan odpowiednio
zakodowane do postaci acuchw znakw, ktre nie spowoduj powstania nieprawidowego
adresu URL. Na przykad, gdyby cieka dostpu do pliku miaa posta c:\Program Files\temp.txt,
to odstp pomidzy sowami Program i Files mgby spowodowa wystpienie bdw. Po
wywoaniu metody Server.URLEncode cieka ta zostanie zamieniona do nastpujcej postaci:
c%3a%5cprogram+files%5ctemp.txt
Wszystkie znaki, ktre nie mog wystpowa w adresie URL znakami, ktre protok HTTP
akceptuje i traktuje jako zamienniki.
Kolejnym zagadnieniem o ktrym jeszcze nie pisaem, s rne sposoby wywoywania naszej
przykadowej strony ASP.NET. W procedurze Page_Load sprawdzamy czy strona zostaa
wywietlona po raz pierwszy. Jeli nie, bdzie to oznaczao, i uytkownik zmieni biecy folder
poprzez kliknicie ktrego z elementw sterujcych Hyperlink (nie powoduj one przesania
formularza, a jedynie przekierowanie do wskazanej strony). W takim przypadku naley wykona
procedur Page_Load i wywietli zawarto wskazanego folderu. Jeli okae si, e strona nie
zostaa wywietlona po pierwszy lecz w efekcie dania przesanego z tej samej strony, to do
wywietlenia zawartoci biecego folderu naley uy procedury tbDir_Handle. Sprawdzenie
tego warunku jest niezwykle istotne, gdy bez niego zawarto folderu mogaby zosta
wywietlona dwukrotnie.
Otwieranie plikw
ASP.NET udostpnia kilka sposobw otwierania plikw, ktre mona wykorzystywa w
zalenoci od zaistniaych okolicznoci. Zgodnie z informacjami podanymi wczeniej, ASP.NET
umoliwia otwieranie plikw w celu odczytu zarwno danych binarnych jak i tekstowych (w
przypadku ASP.NET zapisanych w kodzie Unicode). Tryb odczytu danych binarnych pozwala na
bezporednie odczytywanie poszczeglnych bitw tworzcych plik. Unicode jest pewnym
schematem umoliwiajcym przeksztacenie tych bitw w co co my ludzie moemy atwo
odczyta; na przykad w cyfry i litery. Poniewa dostp do danych binarnych nie bdzie nam
potrzebny, skoncentrujemy si na operowaniu na danych tekstowych.

Uycie obiektw klasy FileInfo


Jednym ze sposobw otwierania plikw jest uycie obiektw FileInfo1. Po stworzeniu kopii
takiego obiektu i skojarzeniu go z plikiem o podanej nazwie, mona wykorzysta kilka metod
sucych do otwierania plikw. Wybr konkretnej metody bdzie zalea od tego, co chcemy
zrobi z zawartoci pliku. Wszystkie dostpne metody zostay przedstawione w tabeli 13.2.

Tabela 13.2. Metody Open klasy FileInfo


Metoda Opis
Open Otwiera plik przy wykorzystaniu podanych uprawnie i zwraca obiekt Stream.
OpenRead() Zwraca strumie do pliku umoliwiajcy wycznie odczyt jego zawartoci.
OpenText() Zwraca obiekt StreamReader dla danego pliku.
OpenWrite() Zwraca obiekt Stream umoliwiajcy zarwno odczyt jak i zapis informacji w
pliku.

Metody te trzeba omwi nieco szerzej. W pierwszej kolejnoci przyjrzyjmy si typom


dostpnych uprawnie.
W wywoaniu metody Open mona poda trzy argumenty FileMode, FileAccess oraz
FileShare (w podanej kolejnoci). Pierwszy z nich FileMode informuje system
operacyjny w jaki sposb naley otworzy plik, na przykad czy zawarto istniejcego pliku ma
by usunita, czy te naley dopisa do nie nowe informacje zapisywane w pliku. Dostpne tryby
otwierania plikw zostay przedstawione w tabeli 13.3.

Tabela 13.3. Dostpne wartoci argumentu FileMode


Tryb Opis
Append Otwiera plik jeli istnieje i przechodzi na jego koniec. Jeli plik nie istnieje, to
tworzony jest nowy plik. Ten tryb otwierania plikw moe zosta wykorzystany
tylko w przypadku otwierania plikw z uprawnieniem do zapisu (Write za
chwil go opisz).
Create Tworzy nowy plik bd nadpisuje istniejcy plik (usuwa jego aktualn
zawarto).
CreateNew Tworzy nowy plik.
Open Otwiera istniejcy plik.
OpenOrCreate Otwiera plik jeli istnieje, a w przeciwnym razie tworzy nowy.
Truncate Otwiera istniejcy plik, a nastpnie skraca go do dugoci 0 bajtw, co w

1
Opisywane w tej czci rozdziau metody Open s take dostpne w klasie File.
rezultacie powoduje usunicie caej jego aktualnej zawartoci.

Argument FileAccess okrela przywileje dostpu do pliku. Dostpne wartoci tego atrybutu to:
Read, ReadWrite oraz Write; odpowiednio otwieraj plik w trybie do odczytu, odczytu i zapisu
bd tylko do zapisu.
Ostatni argument FileShare okrela co si stanie jeli dwa procesy jednoczenie sprbuj
uzyska dostp do tego samego pliku; na przykad, jeli dwie osoby wywietl stron WWW i w
tej samej chwili sprbuj zmieni zawarto pliku. Warto tego argumentu ma wpyw na proces,
ktry sprbuje uzyska dostp do pliku jako drugi. Wartoci te s takie same jak wartoci
argumentu FileAccess, z jedn rnic dostpny jest dodatkowa warto None, ktra
informuje, e w danej chwili plik moe by wykorzystywany tylko przez jeden proces.
By moe zauwaye, e wszystkie metody Open klasy FileInfo za wyjtkiem metody
OpenText, zwracaj obiekty Stream dajce wycznie moliwo odczytu danych binarnych.
Oczywicie do naszych celw nie jest to dobre. W dalszej czci rozdziau, podczas prezentacji
zagadnie zwizanych z odczytywaniem zawartoci plikw, poka jak omin ten problem.
Przedstawiony poniej fragment kodu pokazuje w jaki sposb mona otworzy plik przy
wykorzystaniu obiektu FileInfo:

'tworzymy obiekty FileInfo i StreamRader


dim objFile as new FileInfo(Server.MapPath("log.txt"))
dim objReader as StreamReader

'otwieramy plik
objReader = objFile.OpenText()

'inne czynnoci

'zamykamy strumie
objReader.close

Mona take wykorzysta metod Open:


dim objFile as new FileInfo(Server.MapPath("log.txt"))
dim objStream as Stream
objStream = objFile.Open( FileMode.OpenOrCreate, FileAccess.Read )

Uycie obiektw klasy FileStream


Klasa FileStream pozwala na tworzenie strumieni umoliwiajcych dostp do plikw. Jedn z
zalet wykorzystania obiektw FileStream jest to, i nie stwarzaj one koniecznoci
wczeniejszego uycia obiektw FileInfo. Niemniej jednak naley si upewni, i plik do
ktrego chcemy uzyska dostp naprawd istnieje. Nie byo to konieczne w przypadku
posugiwania si obiektami FileInfo, gdy sam fakt pomylnego utworzenia takiego obiektu
oznacza istnienie pliku. Poniszy fragment kodu pokazuje w jaki sposb mona otworzy plik
przy wykorzystaniu obiektu FileStream:
dim objF as new FileStream(Server.MapPath("log.txt"), _
FileMode.OpenOrCreate)

Powysze wywoanie otwiera plik w trybie OpenOrCreate. Konstruktor klasy FileStream


wykorzystuje te same argumenty co metoda Open klasy FileInfo, z tym i pierwszym
argumentem wywoania musi by acuch znakw okrelajcy nazw otwieranego pliku.
Klasa FileStream udostpnia take metod Seek, ktra umoliwia przejcie do dowolnego
miejsca strumienia (na przykad, na jego pocztek lub koniec). Skadnia wywoania tej metody ma
nastpujc posta:
Seek(przesunicie, punktOdniesienia)

Argument przesunicie okrela odlego na jak naley przej wzgldem podanego


punktuOdniesienia. Argumentem punktOdniesienia moe by jedn z wartoci typu
wyliczeniowego SeekOrigin: SeekOrigin.Begin (oznacza, e przesunicie bdzie liczone od
pocztku pliku), SeekOrigin.Current (oznacza, e przesunicie bdzie liczone wzgldem
biecego pooenia w pliku) oraz SeekOrigin.End (oznacza, e przesunicie bdzie liczone
wzgldem koca pliku). Na przykad, poniszy fragment kodu powoduje przejcie na pocztek, a
nastpnie na koniec pliku:
'przechodzimy na pocztek pliku
objF.Seek( 0, SeekOrigin.Begin )
'przechodzimy na koniec pliku
objF.Seek( 0, SeekOrigin.End )

Odczyt plikw
Teraz, kiedy ju wiesz jak naley otwiera pliki, moemy zaj si odczytywaniem ich zawartoci.
W ASP.NET czynno ta jest wykonywana gwnie przy wykorzystaniu obiektw klasy
StreamReader. Zgodnie z tym co zostao podane wczeniej, obiekty tej klasy konwertuj dane
binarne do postaci tekstowej, dziki czemu otrzymujemy znaki oraz acuchy znakw, ktrymi
naley posugiwa si na stronach ASP.NET. Stworzenie obiektu klasy StreamReader jest
bardzo proste:
dim objReader as new StreamReader(obiekt)

Argumentem obiekt moe by obiekt Stream (na przykad obiekt FileStream utworzony w
poprzedniej czci rozdziau) bd cieka dostpu do konkretnego pliku. Stwrzmy teraz prosty
plik, ktrego bdziemy uywali w dalszych przykadach; bdzie on nosi nazw log.txt i naley
zapisa go w folderze /aspnetdlakazdego/rozdzial13. Poniej przedstawiem zawarto tego pliku:
Zwinne lisy
przeskoczyy nad
leniwym
brzowym psem

Klasa StreamReader udostpnia kilka metod sucych do odczytywania znakw z pliku.


Pierwsza z nich Read odczytuje ze strumienia pojedynczy znak, zwraca go w formie liczby
cakowitej i przechodzi do kolejnego znaku. Oto przykad jej wykorzystania:
dim f as new FileInfo(Server.MapPath("log.txt"))
dim objReader as StreamReader
objReader = f.OpenText
Response.Write(objReader.Read & "<br>")
objReader.Close

Wykonanie powyszego fragmentu kodu spowoduje wywietlenie na stronie liczby 90, ktra jest
wartoci litery Z w kodzie ASCII. Kolejne wywoanie metody Read spowodowaoby
wywietlenie liczby 119, odpowiadajcej w kodzie ASCII literze w. I tak dalej. Jednak liczby te
nie s dla nas przydatne, a zatem naley przeksztaci je do postaci znakw zapisanych w kodzie
Unicode. Suy do tego metoda Chr klasy Strings:
Response.Write(Strings.Chr(objReader.Read) & "<br>")

Pierwsze wykonanie powyszego fragmentu kodu po otworzeniu strumienia powinno zwrci


liter Z, drugie w i tak dalej.
Jednak odczytywanie pojedynczych znakw moe by nieco mczce, dlatego te klasa
StreamReader udostpnia dwie inne metody, ktre zwracaj cae acuchy znakw. Metodami
tymi s: ReadLine (ktra odczytuje znaki a do koca wiersza) oraz ReadToEnd (ktra odczytuje
ca pozosta zawarto strumienia). Poniej przedstawiony zosta przykad uycia metody
ReadToEnd:
dim objReader as new StreamReader(Server.MapPath("log.txt"))
Response.Write(objReader.ReadToEnd)
objReader.Close

Wykonanie powyszego fragmentu kodu spowoduje wywietlenie acucha znakw:


Zwinne lisy przeskoczyy nad leniwym brzowym psem

A co si stao ze znakami koca wiersza? Jeli przejrzysz kod HTML wygenerowanej strony, to
zauwaysz, e znaki te zostay w nim umieszczone. Niestety jzyk HTML nie interpretuje znakw
koca wiersza jako znacznikw przeamania wiersza (<br>). Znaczniki te mona umieci w
odpowiednich miejscach wykorzystujc metod ReadLine:
Response.Write(objReader.ReadLine & "<br>")

Metoda ta odczytuje jednak tylko jeden wiersz, a zatem, aby odczyta ca zawarto pliku
konieczne bdzie wykorzystanie ptli. Gdy dotrzesz do koca pliku, to prba odczytania kolejnych
znakw przy uyciu metod Read lub ReadLine spowoduje zgoszenie bdu. Na szczcie, klasa
StreamReader udostpnia metod Peek, ktra umoliwia uniknicie tej przykrej sytuacji.

Metoda Peek odczytuje kolejny znak ze strumienia, lecz w rzeczywistoci go nie zwraca
innymi sowy pozwala podejrze ten znak. Jeli tym znakiem bdzie koniec strumienia, to
metoda zwraca warto -1. Posugujc si t metod mona odczyta ca zawarto strumienia
bez jakichkolwiek problemw:
dim objReader as new StreamReader(Server.MapPath("log.txt"))
while objReader.Peek() > -1
Response.Write(objReader.ReadLine & "<br>")
end while
objReader.Close

Wyniki wykonania powyszego fragmentu kodu przedstawione zostay na rysunku 13.7.

Rysunek 13.7. Odczytywanie zawartoci strumienia przy uyciu metody ReadLine

Ostrzeenie
Poniewa metoda Peek nie odczytuje znaku ze strumienia, a zatem nie zmienia take
biecego pooenia w strumieniu, pamitanego przez obiekt StreamReader. Dlatego te
konieczne jest wykorzystanie metod klasy StreamReader w celu przesunicia biecego
pooenia w strumieniu, gdy inaczej atwo mona stworzy nieskoczon ptl, ktrej przykad
zosta przedstawiony na poniszym przykadzie:

while objReader.Peek () > -1


Response.Write("<br>")
end while
Uruchomienie tego fragmentu kodu spowoduje prb wykonania nieskoczonej ptli, ktra
powstaje gdy biece pooenie w strumieniu nigdy nie jest modyfikowane.

Do zwrcenia okrelonej iloci znakw ze strumienia mona take uy metody Read. W tym
przypadku skadnia wywoania tej metody ma nastpujc posta:
objReader.Read(char(), pocztek, ilo)

Ta wersja metody Read odczytuje ze strumienia podan ilo znakw, rozpoczynajc w miejscu
okrelonym przy uyciu argumentu pocztek. Odczytane znaki zostaj zapisane w tablicy typu
Char przekazanej jako pierwszy argument wywoania metody. Oto przykad:
dim objReader as new StreamReader(Server.MapPath("log.txt"))
dim arrString(11) as Char
dim i as Byte

objReader.Read(arrString, 0, 11)
for i = 0 to Ubound(arrString) - 1
Response.Write(arrString(i))
next

objReader.Close

W wierszu 2. jest tworzona tablica typu Char, zapisywana w zmiennej arrString. W wierszu 5.
jest wywoywana metoda Read, ktra odczytuje ze strumienia 11 znakw, rozpoczynajc od jego
pocztku. Znaki tez zostaj zapisane w tablicy arrString. Wykonanie powyszego fragmentu
kodu spowoduje wywietlenie acucha znakw
Zwinne lisy

To dziesi znakw i jeden odstp (litera y jest ostatnim znakiem).


Wyobra sobie, e w celach demonstracyjnych chcielibymy wywietli kod rdowy jednej z
naszych stron ASP.NET, tak aby uytkownicy witryny mogli go przeanalizowa i, na przykad,
pozna jedn z omawianych tu metod odczytu plikw. Jednak jeli uytkownik sprbuje odwoa
si do strony ASP.NET przy uyciu przegldarki WWW, to uzyska wycznie kod HTML
wszystkie instrukcje ASP.NET zostan bowiem przetworzone i usunite. A zatem to my bdziemy
musieli wywietli zawarto strony zanim zostanie ona przetworzona. Mona to zrobi przy
wykorzystaniu klas udostpnianych w przestrzeni nazw System.IO. Przykad takiej aplikacji
przedstawiony zosta na listingu 13.5.

Listing 13.5. Wywietlanie kodu rdowego stron ASP.NET w przegldarce.


1 <%@ Import Namespace="System.IO" %>
2 <script language="VB" runat="server">
3 sub Page_Load(obj as object, e as eventargs)
4 dim fs as new FileStream(Server.MapPath _
5 ("listing1305.aspx"), FileMode.Open, FileAccess.Read)
6 dim objReader as new StreamReader(fs)
7
8 lblMessage.Text = "<pre>"
9 while objReader.Peek() > -1
10 lblMessage.Text += Server.HTMLEncode _
11 (objReader.ReadLine) & "<br>"
12 end while
13 objReader.Close
14 fs.close
15 lblMessage.Text += "</pre>"
16
17 end sub
18 </script>
19
20 <html><body>
21 <form runat="server">
22 <asp:label id="lblMessage" runat=server />
23 </form>
24 </body></html>
Analiza
W procedurze Page_Load tworzony jest nowy obiekt FileStream, ktry posuy nam do
odczytania zawartoci wybranego pliku. W wierszu 7. tworzony jest obiekt StreamReader, ktry
umoliwia dostp do zawartoci pliku. Uycie znacznika <pre> sprawia, e formatowanie na
wynikowej stronie WWW bdzie przypominao oryginalny sposb formatowania wywietlanego
kodu. W dalszej czci procedury wykonywana jest ptla while, ktra przy wykorzystaniu metod
Peek oraz ReadLine wywietla poszczeglne wiersze pliku. Przy wywietlaniu kodu
odczytywanego z pliku uywana jest take metoda Server.HTMLEncode, ktra zapewnia, e
znaczniki HTML nie bd interpretowane. Na kocu procedury s zamykane obiekty
StreamReader oraz FileStream oraz generowany zamykajcy znacznik </pre>. Wyniki
wykonania powyszej strony ASP.NET zostay przedstawione na rysunku 13.8.

Rysunek 13.8. Wywietlanie kodu rdowego strony ASP.NET w przegldarce

Zapis plikw
Zapisywanie danych do strumieni umoliwiaj obiekty klasy StreamWriter. Skadnia instrukcji
sucej do utworzenia takiego obiektu jest bardzo prosta. Obiekty tej klasy, podobnie jak obiekty
StreamReader mona utworzy na postawie obiektu Stream bd cieki dostpu okrelajcej
pooenie pliku:
dim objWriter as new StreamWriter(FileStreamLubcieka, dopisa)

Argument dopisa jest wartoci logiczn (typu Boolean) okrelajc czy nowe informacje
powinny zosta dopisane do istniejcej zawartoci pliku. Jeli argument ten przyjmie warto
false, to istniejca zawarto pliku zostanie usunita. Jeli wskazany plik nie istnieje, zostanie on
utworzony. Jeli argument dopisa bdzie mia warto true, to wszystkie informacje
zapisywane w pliku zostan dodane na jego kocu, za istniejc zawartoci.
Klasa StreamWriter udostpnia dwie metody suce do zapisywania danych Write oraz
WriteLine. Oto przykad ich wykorzystania:
dim objWriter as new StreamWriter _
(Server.MapPath("log.txt"), true )

objWriter.WriteLine("Ale pies zupenie")


objWriter.Write("si tym nie przej")

objWriter.Close

W wierszu 1. tworzony jest obiekt StreamWriter skojarzony z plikiem log.txt, a jednoczenie


informujemy, e nowe informacje maj by dopisywane do istniejcej zawartoci pliku. W
wierszach 4. i 5. zostaj wywoane dwie metody suce do zapisu danych w pliku, po czym
obiekt pisarza (StreamWriter) zostaje zamknity. Po wykonaniu powyszego fragmentu kodu,
zawarto pliku log.txt bdzie miaa nastpujc posta:
Zwinne lisy
przeskoczyy nad
leniwym
brzowym psemAle pies zupenie
si tym nie przej

Jak wida, po tekcie zapisanym przy uyciu metody WriteLine zosta umieszczony znak
nowego wiersza. Jednak oryginalna zawarto pliku oraz tekst dodany do niego przez nasz
przykadowy program, nie s w aden sposb oddzielone. Aby zapisa w pliku znak nowego
wiersza, wystarczy wywoa metod WriteLine nie podajc w jej wywoaniu adnych
argumentw:
objWriter.WriteLine()

Obiekty StreamWriter wykorzystuj bufor wyjciowy. Przypominasz sobie zapewne


zagadnienia zwizane z buforowanie generowanych stron, opisane w rozdziale 4., pt.: Stosowanie
obiektw ASP.NET w jzykach C# i VB.NET. Domylnie, obiekty StreamWriter umieszczaj
dane w buforze przed przekazaniem ich do strumienia. Jeli chcesz, aby dane byy przesyane do
strumienia po kadym wywoaniu metody Write lub WriteLine, wystarczy przypisa
waciwoci AutoFlush obiektu StreamWriter warto true.
Mona take rcznie przekaza zawarto bufora do strumienia, wywouj metod Flush.
Przypisanie waciwoci AutoFlush wartoci true moe jednak sprawi, i efektywno
dziaania aplikacji bdzie nieco lepsza. Automatyczne oprnienie bufora (poprzez przypisanie
waciwoci AutoFlush wartoci true) naley stosowa, w sytuacji gdy uytkownicy oczekuj
natychmiastowych wynikw. Na przykad, podczas zapisywania w pliku duej iloci danych, w
sytuacji gdy chcesz, aby uytkownicy mogli zobaczy wprowadzane modyfikacje jeszcze przed
zakoczeniem przetwarzania pliku.

Inne operacje na plikach i folderach


Zarwno klasa File jak i Directory udostpniaj metody suce do kopiowania, tworzenia,
przenoszenia oraz usuwania plikw i folderw. Ich uycie jest bardzo proste i nie wymaga
wikszego komentarza. Metody te przedstawiem w tabeli 13.4; dotycz one zarwno klasy File
jak i Directory, chyba e jawnie napisaem, e tak nie jest.

Tabela 13.4. Rne metody klas File i Directory


Metoda Opis
Directory.CreateDirectories Tworzy wszystkie foldery okrelone w podanej ciece.
Directory.CreateDirectory Tworzy folder o okrelonej ciece. Jeli w jakimkolwiek
miejscu cieki zostanie uyty nieistniejcy folder, to
ASP.NET zgosi bd.
Directory.Delete Usuwa folder. Drugi argument wywoania tej metody
rekurencyjnie jest wartoci logiczn, okrelajc
czy naley take usun wszystkie podfoldery oraz pliki.
File.Copy Kopiuje istniejcy lub nowy plik. Trzeci argument
wywoania tej metody nadpisa to warto
logiczna okrelajca czy istniejcy plik powinien zosta
nadpisany.
File.Create Tworzy plik o okrelonej ciece dostpu.
File.CreateText Tworzy nowy obiekt StreamWriter umoliwiajcy zapis
danych w nowym pliku.
File.Delete Usuwa plik.
File.ChangeExtension Zmienia rozszerzenie pliku okrelonego przy uyciu
podanej cieki. Aby usun rozszerzenie pliku, naley
przypisa argumentowi rozszerzenie warto nothing.
Nie zapomnij zapisa kropki przez nowym rozszerzeniem.
Ta statyczna metoda zwraca ciek dostpu do pliku z
nowym rozszerzeniem.
File.GetExtension Ta statyczna metoda zwraca rozszerzenie pliku.
File.HasExtension Ta statyczna metoda zwraca warto true jeli podany
plik ma rozszerzenie.
Move Przenosi wskazany plik lub folder okrelony jako
staracieka w miejsce okrelone jako nowacieka.

Aby zmieni nazw pliku lub folderu mona go przenie (przy uyciu metody Move) lub
skopiowa (metod Copy) a nastpnie usun (przy uyciu metody Delete).

Podsumowanie informacji o plikach i folderach


Ze wzgldu na fakt, i ASP.NET udostpnia tak wiele rnych klas umoliwiajcych operowanie
na systemie plikw, wybr ktrej z nich naley uy moe przysporzy wielu problemw. W
tabeli 13.5. przedstawiem dostpne klasy oraz podaem informacje o ich przeznaczeniu.

Tabela 13.5. Klasy i typy wyliczeniowe zdefiniowane w przestrzeni nazw System.IO


Klasa Kiedy naley uywa obiektw tej klasy
BinaryReader oraz Suy do odczytywania i zapisywania informacji binarnych w
BinaryWriter strumieniach (na przykad dat oraz obiektw).
Directory Pozwala na tworzenie, usuwanie oraz wykonywanie innych operacji
na folderach.
File Pozwala na tworzenie, usuwanie oraz wykonywanie innych operacji
na plikach.
FileInfo oraz Te klasy pozwalaj na przegldanie oraz okrelanie waciwoci
DirectoryInfo plikw i folderw.
FileAttributes oraz Obiekty tych klas su do okrelania atrybutw plikw i folderw.
DirectoryAttributes

FileMode, FileAccess Typy wyliczeniowe okrelajce uprawnienia i tryby otwierania


oraz FileShare plikw.
FileStream Ta klasa zapewnia dostp do pliku wraz z moliwoci przechodzenia
w jego dowolne miejsce.
MemoryStream Klasa ta zapewnia dostp do strumieni umoliwiajcych zapis i
odczyt danych nie z plikw lecz pamici komputera.
SeekOrigin Typ wyliczeniowy, ktrego wartoci s uywane w wywoaniach
metody FileStream.Seek.
StreamReader oraz Klasy te pozwalaj na odczyt i zapis odpowiednio zakodowanych
StreamWriter znakw w strumieniach bajtowych.
StringReader oraz Klasy te pozwalaj na odczyt i zapis danych w acuchach znakw.
StringWriter Ich moliwoci funkcjonalne odpowiadaj moliwociom klas
StreamReader oraz StreamWriter.

Skadowanie izolowane
Posugujc si metodami przedstawionymi we wczeniejszej czci rozdziau mona zapisywa
dane w pliku o unikalnej ciece dostpu, na przykad:
c:\inetpub\wwwroot\aspnetdlakazdego\rozdzial13\log.txt. To bardzo potna i uyteczna metoda
przechowywania informacji; ma jednak jedn wad.
Po pierwsze, dla kadego pliku konieczna jest znajomo lub stworzenie unikalnej cieki dostpu.
Oczywicie, w przypadkach przedstawionych w tym rozdziale, nie stanowi to wikszego
problemu; sprbuj jednak wyobrazi sobie aplikacj ktra musi dziaa na rnych serwerach, z
ktrych kady ma wasn, unikaln struktur systemu plikw. Zarzdzanie tymi wszystkimi
plikami przechowywanymi w rnych miejscach moe by prawdziwym utrapieniem.
Po drugie, z tworzonych w taki sposb plikw mog korzysta take inni uytkownicy oraz
aplikacje, ktre mog uzyska dostp do lokalnego systemu plikw (czyli niemal kady od
osoby odwiedzajcej strony WWW poczynajc, a na uytkowniku lokalnego komputera koczc).
To doskonaa moliwo w przypadku plikw zawierajcych, na przykad, informacje dotyczce
licznika odwiedzin, do ktrych powinni mie dostp wszyscy korzystajcy z aplikacji. Co jednak
zrobi w sytuacji, gdy chcesz wykorzysta pliki do przechowywania prywatnych informacji o
kadym z uytkownikw? W takim przypadku trudno byoby okreli do kogo nale
poszczeglne informacje.
Wszystkie te problemy mona jednak rozwiza dziki wykorzystaniu mechanizmu skadowania
izolowanego dostpnego w ASP.NET. Mechanizm ten, pod pewnymi wzgldami, przypomina
cookies, gdy kojarzy dane z uytkownikami i izoluje je. Kady uytkownik otrzymuje swj
wasny izolowany obszar skadowania. Ju nigdy nie trzeba bdzie przejmowa si okrelaniem
unikalnych cieek dostpu do plikw. Mechanizm skadowania izolowanego umoliwia
zapisywanie danych w obszarach, ktre fizycznie mog by przechowywane w dowolnym
miejscu, nawet na lokalnym komputerze uytkownika (zupenie jak cookies).
Aby wykorzysta mechanizm skadowania izolowanego, naley pozna kilka nowych zagadnie.
Potem jednak, sposoby dziaania tego mechanizmu bd przypomina standardowe metody
uzyskiwania dostpu do plikw.

Tworzenie izolowanych obszarw skadowania


W przypadku posugiwania si mechanizmem skadowania izolowanego wykorzystywane s
obiekty dwch klas IsolatedStorageFile oraz IsolatedStorageFileStream.
Przypominaj one obiekty File oraz FileStream przedstawione w poprzedniej czci rozdziau.
W rzeczywistoci klasa IsolatedStorageFileStream udostpnia te same metody co klasa
FileStream.

W odrnieniu od obiektw File, obiekty IsolatedStorageFile nie reprezentuj plikw lecz


raczej obszary umoliwiajce przechowywanie danych. Pliki przechowywane w tych obszarach s
reprezentowane przez obiekty klasy IsolatedStorageFileStream. Z pocztku rnice te
mog by nieco mylce, a zatem naley dobrze zrozumie przeznaczenie obu tych klas.
Przeanalizujmy listing 13.6, ktry pokazuje w jaki sposb mona stworzy plik w izolowanym
obszarze skadowania

Listing 13.6. Tworzenie pliku w izolowanym obszarze skadowania


1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.IO" %>
3 <%@ Import Namespace="System.IO.IsolatedStorage" %>
4
5 <script runat="server">
6 sub Page_Load(obj as object, e as eventargs)
7 dim stream as IsolatedStorageFileStream
8 dim writer as StreamWriter
9 dim data as string = "niebieski"
10
11 stream = new IsolatedStorageFileStream("colors.txt", _
12 FileMode.OpenOrCreate)
13 writer = new StreamWriter(stream)
14 writer.WriteLine(data)
15 writer.Close()
16 end sub
17 </script>
18
19 <html><body>
20 </body></html>

Analiza
Zwr uwag, na wykorzystanie nowej przestrzeni nazw System.IO.IsolatedStorage
importowanej w 3. wierszu. Nie zapomnij zaimportowa jej take we wasnych stronach
ASP.NET. W wierszach od 7. do 9. s deklarowane uywane zmienne, w tym take nowy obiekt
klasy IsolatedStorageFileStream. Deklarowany w wierszu 8. obiekt StreamWriter,
powinien ju wyglda znajomo.
Kolejny fragment kodu take nie powinien zawiera adnych niespodzianek jedyn
wprowadzon w nim nowoci, jest uycie obiektu IsolatedStorageFileStream. Skadania
instrukcji sucej do stworzenia nowej kopii tego obiektu jest taka sama jak w przypadku
tworzenia obiektw FileStream. W wierszach 13. i 14. wykonujemy znane ju czynnoci
posugujc si przy tym obiektem StreamWriter; a w wierszu 15. zamykamy go, co powoduje
take zamknicie strumienia IsolatedStorageFileStream. I to by byo wszystko.
Przedstawiony powyej przykad tworzy plik o nazwie colors.txt i zapisuje go w izolowanym
obszarze skadowania nalecym do biecego uytkownika. Gdyby inny uytkownik sprbowa
uzyska dostp do tego pliku, nie byo by to moliwe; podobnie jak nie jest moliwe uzyskanie
dostpu do cookies innego uytkownika. Konkretne miejsce, w ktrym mechanizm skadowania
izolowanego przechowuje pliki, zaley od uywanego systemu operacyjnego. Informacje ta ten
temat zostay przedstawione w tabeli 13.6.

Tabela 13.6. Domylne foldery wykorzystywane przez mechanizm skadowania izolowanego.


System operacyjny Pooenie
Windows 95, 98, Me c:\Windows\Ustawienia lokalne\Dane aplikacji
Windows NT 4.0 c:\WinNT\Profile\<uytkownik>\Dane aplikacji
Windows NT 4.0 (z Service c:\WinNT\Profile\<uytkownik>\Ustawienia lokalne\Dane aplikacji
Pack 4) oraz Windows 2000
(uaktualnienie Win NT 4.0)
Windows 2000 (instalacja c:\Documents and Settings\<uytkownik>\Ustawienia
czysta, czyli bez
uaktualniania innego lokalne\Dane aplikacji
systemu Windows 95, 98,
Me bd WinNT 3.51)

Na przykad, po wykonaniu strony z listingu 13.6 na serwerze IIS dziaajcym w systemie


Windows 2000 (zainstalowanym bez uaktualniania innych wersji systemu Windows), naley
przej do folderu c:\Documents and Settings\Default User\Ustawienia lokalne\Dane
aplikacji\Microsoft. W folderze tym powinien znajdowa si folder o nazwie IsolatedStorage.
Wewntrz niego powinny si znajdowa inne foldery, wykorzystywane przez ASP.NET do
przechowywania informacji o wykonywanych czynnociach, a oprcz nich take plik colors.txt
utworzony w wierszu 11. listingu 13.6. Zazwyczaj, to co si dzieje w tych folderach nie bdzie
miao najmniejszego znaczenia, jednak znajomo fizycznego pooenia plikw moe si czasami
okaza przydatna.

Dostp do plikw zapisanych w obszarach


izolowanych
Dane przechowywane przy wykorzystaniu mechanizmu skadowania izolowanego s separowane
przy uyciu dwch rnych metod: uytkownika i komponentu oraz uytkownika, komponentu i
domeny. Uycie pierwszej metody oznacza, e izolowany obszar skadowania bdzie tworzony dla
kadej aplikacji z ktrej korzysta uytkownik. Na przykad, plik zapisany w obszarze izolowanym
przez uytkownika A korzystajcego z aplikacji A, nie bdzie dostpny dla tego samego
uytkownika korzystajcego z aplikacji B. Druga metoda dodatkowo uwzgldnia domen
aplikacji. W kontekcie ASP.NET oznacza to po prostu adres URL aplikacji.
By moe przypominasz sobie, e strony ASP.NET s kompilowane do postaci dynamicznie
generowanych komponentw .NET (informacje na ten temat podawaem w rozdziale 2). Oznacza
to, e w normalnych okolicznociach, adne dwie strony ASP.NET nie bd korzystay z tego
samego komponentu .NET; a to z kolei oznacza, e adne dwie strony ASP.NET nie mog
uzyska dostpu do tego samego izolowanego obszaru skadowania. Idea ta zostaa przedstawiona
na rysunku 13.9.

Rysunek 13.9. Ten sam uytkownik, uywajcy dwch rnych stron ASP.NET w tej samej
aplikacji, nie bdzie w stanie uzyska dostpu do tego samego izolowanego obszaru skadowania.
Opis rysunku
Store x Obszar x
No access! Brak dostpu
Web site Aplikacja
Page x Strona x
user 1 Uytkownik 1

Do odczytywania danych przechowywanych w obszarach izolowanych wykorzystywane s


obiekty klasy IsolatedStorageFileStream. Przykad ich uycia przedstawiony zosta na
listingu 13.7.

Listing 13.7. Odczyt danych z obszarw izolowanych przy wykorzystaniu obiektw klasy
IsolatedStorageFileStream
1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.IO" %>
3 <%@ Import Namespace="System.IO.IsolatedStorage" %>
4
5 <script runat="server">
6 sub Page_Load(obj as object, e as eventargs)
7 dim stream as new IsolatedStorageFileStream _
8 ("colors.txt", FileMode.OpenOrCreate)
9 dim objReader as new StreamReader(stream)
10
11 while objReader.Peek() > -1
12 Response.Write(Server.HTMLEncode _
13 (objReader.ReadLine) & "<br>")
14 end while
15 objReader.Close
16 end sub
17 </script>
18
19 <html><body>
20 <asp:Label id="lblMessage" runat="server" />
21 </body></html>

Kod powyszego listingu na pewno wyglda znajomo, gdy nie ma w nim adnych nowych
metod. Wykonanie tej strony powinno spowodowa wywietlenie sowa niebieski, ktre zostao
zapisane w pliku umieszczonym w obszarze izolowanym przez stron z listingu 13.6.

Notatka
Zwr uwag, i wykonania powyszej strony nie musi spowodowa wywietlenia jakichkolwiek
wynikw. Przypomnij sobie, e dwie rne strony ASP.NET nie mog uzyska dostpu do tego
samego izolowanego obszaru skadowania. Oznacza to, e strona z listingu 13.7 nie moe
korzysta z obszaru uywanego przez stron z listingu 13.6. Problem ten mona rozwiza
umieszczajc kody z obu listingw w jednym dokumencie (to samo dotyczy kodw
przedstawionych na listingach 13.6 oraz 13.8).

Nieco inaczej wyglda sprawa w przypadku odczytywania danych przechowywanych w obszarach


izolowanych, przy uyciu obiektw klasy IsolatedStorageFile. W tym przypadku, w
pierwszej kolejnoci naley pobra odwoanie do pliku przechowywanego w izolowanym obszarze
skadowania, a dopiero pniej mona uy obiektu klasy IsolatedStorageFile do wykonania
jakich operacji na tym pliku. Proces ten demonstruje przykad przedstawiony na listingu 13.8.

Listing 13.8. Odczyt danych z pliku przechowywanego w obszarze izolowanym przy uyciu
obiektu IsolatedStorageFile
1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.IO" %>
3 <%@ Import Namespace="System.IO.IsolatedStorage" %>
4
5 <script runat="server">
6 sub Page_Load(obj as object, e as eventargs)
7 dim i as Integer
8 dim objISOFile as IsolatedStorageFile = _
9 IsolatedStorageFile.GetUserStoreForDomain()
10
11 lblMessage.Text = "<b>Pliki:</b> "
12 dim intCount = Ubound(objISOFile.GetFileNames("*.*"))
13 for i = 0 to intCount
14 lblMessage.Text += objISOFile.GetFileNames _
15 ("*.*")(i) & "<br>"
16 next
17
18 lblMessage.Text += "<b>Komponenty .NET: </b>" & _
19 objISOFile.AssemblyIdentity.ToString & "<br>"
20 lblMessage.Text += "<b>Domena: </b>" & _
21 objISOFile.DomainIdentity.ToString & "<br>"
22 lblMessage.Text += "<b>Aktualna wielko: </b>" & _
23 objISOFile.CurrentSize.ToString & "<br>"
24 lblMessage.Text += "<b>Maksymalna wielko: </b>" & _
25 objISOFile.MaximumSize.ToString & "<br>"
26 end sub
27 </script>
28
29 <html><body>
30 <asp:Label id="lblMessage" runat="server" />
31 </body></html>
Analiza
W wierszach 8. i 9. tworzony jest obiekt IsolatedStorageFile. Metoda
IsolatedStorageFile.GetUserStoreForDomain zwraca obiekt klasy
IsolatedStorageFile wybrany dla danego uytkownika, komponentu oraz domeny. Metoda
IsolatedStorageFile.GetUserStoreForAssembly zwraca natomiast obszar izolowany dla
konkretnego uytkownika i komponentu.
Metoda GetFileNames zwraca tablic zawierajc list nazw plikw speniajcych podane
kryteria; w naszym przypadku jest to "*.*". W wierszach od 13. do 16. wszystkie elementy tej
tablicy s pobierane, a zapisane w nich nazwy plikw s wywietlane w elemencie sterujcym
Label. Podobne czynnoci wykonuje metoda GetDirectoryNames, ktra take umoliwia
podanie acucha znakw okrelajcego kryteria filtrowania zwracanych wynikw.
W kocu, w wierszach od 18. do 25. s wywietlane waciwoci izolowanego obszaru
skadowania. Waciwo AssemblyIdentity zwraca URL okrelajcy komponent .NET
ktremu odpowiada dany izolowany obszar skadowania (czyli dynamiczny komponent
wygenerowany przez rodowisko .NET dla aplikacji WWW). Waciwo DomainIdentity
okrela domen skojarzon z danym izolowanym obszarem skadowania (przypomina ona nieco
waciwo Domain obiektw reprezentujcych cookies). Waciwoci CurrentSize oraz
MaxSize okrelaj wielko obszaru skadowania nalecego do biecego uytkownika,
wyraon w bajtach. Wyniki wykonania powyszego kodu przedstawione zostay na rysunku
13.10.

Rysunek 13.10. Prezentacja informacji o izolowanym obszarze skadowania, moliwa dziki


wykorzystaniu obiektu IsolatedStorageFile

Na podstawie obiektu IsolatedStorageFile mona stworzy obiekt


IsolatedStorageFileStream, a nastpnie uy obiektu StreamReader do odczytania
zawartoci wybranego pliku:
dim objISOFile as IsolatedStorageFile = _
IsolatedStorageFile.GetUserStoreForDomain()
dim stream as new IsolatedStorageFileStream _
("options.txt", FileMode.OpenOrCreate, objISOFile )
To nie jest ASP!
Operacje wejcia/wyjcia we wczeniejszych wersjach technologii ASP byy wykonywane za
porednictwem obiektw klasy FileSystem. Udostpniaa ona te same moliwoci funkcjonalne
co klasy omwione w tym rozdziale. ASP.NET ma moliwo wykorzystania wszystkich klas
dostpnych w rodowisku .NET, co oznacza, e w odrnieniu od wczeniejszych wersji
technologii ASP, w ASP.NET mona wykonywa te same operacje wejcia/wyjcia co w
tradycyjnych, niezalenych aplikacjach.

Na szczcie, wiele rozwiza stosowanych w ASP.NET, a nawet skadnia ich implementacji,


przypomina analogiczne rozwizania uywane we tradycyjnej wersji technologii ASP. Zmieniy
si nazwy kilku klas oraz niewidoczne dla programistw sposoby implementacji niektrych
moliwoci funkcjonalnych; jednak programici znajcy zasady posugiwania si obiektami klasy
FileSystemObject nie powinni mie problemw z przejciem do nowych metod
wykorzystywania plikw.
Jedn z najwaniejszych zmian, jest przejcie do cakowicie obiektowej architektury. W
rodowisku .NET kady plik oraz folder moe by reprezentowany przez obiekt, a kady z tych
obiektw udostpnia wasne metody, waciwoci oraz kolekcje dodatkowych obiektw.
Przywyknicie do stosowania tych cile ze sob powizanych obiektw moe zabra nieco czasu,
zwaszcza, i znacznie rni si one od obiektw FileSystemObject.
W ASP.NET zmieniy si take zasady doczania plikw. Dziki metodom interakcji ASP.NET
ze rodowiskiem .NET, doczania zawartoci plikw do aplikacji ASP.NET jest bardzo proste.
Tradycyjna technologia SSI wci jest dostpna, jednak mona wykorzysta wiele innych metod
doczania plikw i rozszerzania w ten sposb moliwoci funkcjonalnych stron ASP.NET.
Natomiast skadowanie izolowane jest cakowicie now metod przechowywania danych i dostpu
do plikw. Eliminuje on wiele problemw napotykanych wczeniej przy tworzeniu rozwiza
sucych do przechowywania informacji skojarzonych z uytkownikami. Oprcz cookies i baz
danych, tradycyjna technologia ASP nie udostpniaa adnych wbudowanych metod sucych do
trwaego przechowywania danych skojarzonych z konkretnymi uytkownikami. Ale czemu
rezygnowa z zastosowania cookies? Ot przy uyciu mechanizmu skadowania izolowanego
mona przechowywa znacznie wicej informacji ni w cookies, co z kolei umoliwia znacznie
dalej idce dostosowanie aplikacji do potrzeb i oczekiwa uytkownikw. Poza tym mechanizm
skadowania izolowanego jest znacznie atwiejszy do wykorzystania ni cookies, pliki
przechowywane w ten sposb mog by skadowane zarwno na serwerze jak i na komputerze
uytkownika, a co waniejsze, rozwizanie to udostpnia znacznie lepsze mechanizmy
zabezpiecze.
Przewaga mechanizmu skadowania izolowanego nad bazami danych nie jest a tak oczywista.
Wykorzystanie jednego lub drugiego rozwizania bdzie zalee od konkretnej sytuacji oraz
konfiguracji serwera. Niemniej jednak obie te metody s niezwykle przydatne przy trwaym
przechowywaniu danych.
Rozdzia 14.
Wykorzystanie ulepszonych
mechanizmw obsugi
pamici podrcznej
ASP.NET
W poprzednich rozdziaach tej czci ksiki przedstawione zostay rne metody dostpu do
danych. Rozdziay 8., 9., 10. oraz 12. byy powicone wykorzystaniu baz danych, rozdzia 11.
jzykowi XML, a 13. wykorzystaniu plikw. Take w tym rozdziale bdziemy kontynuowali
omawianie zagadnie zwizanych z dostpem do danych, a konkretnie opisz co mona zrobi
z informacjami gdy zostan ju pobrane.
Przechowywanie danych w pamici podrcznej (ang. caching) jest technik powszechnie
wykorzystywan w przetwarzaniu komputerowym, suc do poprawy efektywnoci dziaania
poprzez przechowywanie najczciej wykorzystywanych informacji w pamici. ASP.NET
udostpnia wiele rnych mechanizmw sucych do przechowywania danych w pamici
podrcznej. W tym rozdziale omwione zostan nastpujce zagadnienia:
Czym jest przechowywanie danych w pamici podrcznej oraz dlaczego si je stosuje.
W jaki sposb ASP.NET przechowuje dane w pamici podrcznej bez wiedzy
programisty.
W jaki sposb mona przechowywa strony i obiekty w pamici podrcznej.
W jaki sposb stosowa zalenoci przy przechowywaniu danych w pamici podrcznej.
Dostpne sposoby operowania pamici podrczn.
Jak naley efektywnie korzysta z pamici podrcznej.

Czym jest przechowywanie informacji w


pamici podrcznej?
Przechowywanie danych w pamici podrcznej jest stosowanym przez komputery sposobem
szybkiego przypominania sobie informacji. Dane wykorzystywane bardzo czsto (a nawet nieco
rzadziej), s zapisywane w miejscu, z ktrego komputer moe je pobra znacznie szybciej ni z
oryginalnego miejsca ich przechowywania. Pami podrczna dziaa jak kiesze na informacje,
do ktrej komputer ma atwy i szybki dostp. Korzyci jakie daje stosowanie pamici podrcznej
zostay przedstawione na rysunku 14.1.
Rysunek 14.1. Pami podrczna to miejsce przechowywania informacji, do ktrego komputer
ma atwy dostp.
Opis rysunku
1. 1. Pobranie informacji z oryginalnego miejsca ich przechowywania (witryny WWW)
2. 2. Zapisanie informacji w miejscu do ktrego mona atwo uzyska dostp (na przykad,
na dysku twardym)
3. 3. Wykorzystanie informacji w aplikacji
Cache Pami podrczna
Browser Przegldarka

Kady kto kiedykolwiek uywa przegldarki WWW powinien zna ju ide przechowywania
danych w pamici podrcznej. W momencie wywietlania strony, przegldarka zapisuje j
bowiem (wraz ze wszelkimi, uywanymi na niej rysunkami) w specjalnym miejscu na dysku
twardym. Fakt ten, jest wany dla uytkownika z dwch powodw. Po pierwsze, przy kolejnej
wizycie na tej samej stronie przegldarka nie bdzie ju musiaa pobiera jej (oraz uytych na niej
obrazkw) z witryny, lecz z lokalnego dysku. A po drugie, dziki temu moliwe jest
przegldnicie strony bez koniecznoci ponownego jej odwiedzania na Internecie. Przykad ten
przedstawia dwa najwaniejsze zagadnienia zwizane z przechowywaniem informacji w pamici
podrcznej szybko dostpu do informacji oraz moliwo dostpu do nich gdy w normalnych
okolicznociach nie byo by to moliwe.
Nowe okrelenie
Rozwaania te skaniaj do zadania interesujcego pytania: Co si dzieje gdy informacje
przechowywane w pamici podrcznej staj si zbyt stare? Co si stanie w przypadku gdy serwer
WWW zastpi stron lub rysunek jego nowsz wersj? Poniewa pami podrczna jest
pierwszym miejscem w ktrym komputer bdzie szuka informacji, oznacza to e pobrana zostanie
stara wersja pliku. W takim przypadku zawarto pamici podrcznej musi zosta zaktualizowana
okres jej przydatnoci upyn.

Jak ASP.NET wykorzystuje pami


podrczn
ASP.NET dysponuje wieloma, wbudowanymi mechanizmami obsugi pamici podrcznej.
Przechowywanie informacji w pamici podrcznej jest bardzo wane dla aplikacji internetowych,
gdy szybko przesyu danych przez Internet moe by bardzo maa. Przechowujc dane,
ASP.NET daje aplikacjom pisanym w tej technologii, niezwykle potrzebn moliwo
poprawienia efektywnoci dziaania. ASP.NET daje take programistom moliwo
modyfikowania ustawie dziaania pamici podrcznej.
Naley zwrci uwag, i w ASP.NET dane zapisywane w pamici podrcznej mog by
przechowywane w dwch, oglnie pojtych miejscach po stronie klienta bd na serwerze.
Przechowywanie danych w pamici podrcznej realizowane przez przegldark WWW odbywa
si po stronie klienta w tym przypadku wszystkie informacje s przechowywane na komputerze
uytkownika, a cay proces jest inicjowany i zarzdzany przez przegldark. Z drugiej strony,
przechowywanie danych w pamici podrcznej na serwerze jest obsugiwane przez serwer WWW
i wykorzystuje jego zasoby; w tym przypadku przegldarka nie ma adnej kontroli nad
zapamitywanymi informacjami.
W tym rozdziale zajmiemy si wanie przechowywaniem danych w pamici podrcznej na
serwerze. Przekonasz si, i rozwizanie to jest znacznie bardziej elastyczne i ma wicej zalet ni
zapamitywanie danych w przegldarce. Rnice pomidzy obiema metodami zostay
przedstawione na rysunku 14.2.
Rysunek 14.2. Rnice pomidzy przechowywaniem informacji w pamici podrcznej po
stronie klienta oraz na serwerze
Opis rysunku
Client-side caching Przechowywanie informacji w pamici podrcznej po stronie klienta
Server Serwer
Client Klient
Step 1 Retrieve Etap 1. Pobranie danych z serwera
Step 2 Cache to hard Etap 2. Zapisanie danych na dysku twardym
Step 3 Retrieve Etap 3. Pobranie danych z dysku twardego przy obsudze kolejnych da
Server-side caching Przechowywanie informacji w pamici podrcznej na serwerze
Server Serwer
Client Klient
ASP.NET Engine Mechanizm ASP.NET
Step 1 Etap 1. Przesanie danych przez ASP.NET
Step 2 Etap 2. Zapisanie danych w pamici podrcznej
Step 3 Etap 3. Przesanie danych z pamici podrcznej przy obsudze kolejnych da.

Czytajc ten rozdzia przekonasz si rwnie, e moliwoci przechowywania informacji w


pamici podrcznej nie ograniczaj si wycznie do stron WWW i obrazw, lecz obejmuj dane
wielu rnych typw.

Przechowywanie stron w pamici podrcznej


W momencie obsugi da kierowanych do stron ASP.NET, strony te s kompilowane. Jeli
kiedykolwiek tworzye aplikacje w dowolnym jzyku programowania wymagajcym kompilacji
kodu rdowego, to doskonale wiesz, i proces kompilacji zajmuje nieco czasu i mocy
obliczeniowej komputera. Gdyby strona ASP.NET musiaa by kompilowana za kadym razem
gdy zostanie odebrane skierowane do niej danie, to efektywno dziaania aplikacji ASP.NET
byaby niezwykle niska.
Na szczcie, gdy strony ASP.NET zostan skompilowane, s one przechowywane w pamici
podrcznej na serwerze. To wanie te skompilowane strony s wykorzystywane przy obsudze
nadsyanych da. Uytkownik zaobserwuje zmniejszenie efektywnoci dziaania wynikajce z
koniecznoci kompilacji strony wycznie w momencie obsugi pierwszego skierowanego do niej
dania; wszystkie kolejne dania dotyczce tej samej strony bd obsugiwane znacznie
szybciej.
Maszyna wirtualna CLR przeglda kod rdowy stron ASP.NET w poszukiwaniu wszelkich
zmian. Jeli zawarto oryginalnego pliku .aspx zostanie zmodyfikowana, fakt ten zostanie
odkryty, a ASP.NET uniewani kod przechowywany w pamici podrcznej i zapisze w niej jego
now wersj.
A zatem, ASP.NET poprawia efektywno dziaania aplikacji przechowujc w pamici podrcznej
skompilowane strony, dziki czemu nie trzeba ich kompilowa przy obsudze wszystkich da.

Przechowywanie ustawie konfiguracyjnych


Jeli czytajc t ksik tworzye jednoczenie przykadowe aplikacje ASP.NET, moge
zauway jeszcze jeden czynnik spowalniajcy ich dziaanie. Ot podczas pierwszego
uruchamiania aplikacji czyli podczas obsugi pierwszego dania skierowanego do
ktrejkolwiek ze stron przechowywanych w katalogu wirtualnym ASP.NET musi pobra
wszystkie ustawienia konfiguracyjne podane w pliku web.config (wicej informacji na ten temat
znajdziesz w rozdziale 18., pt.: Konfiguracja i wdraanie aplikacji ASP.NET. W zalenoci od
stopnia zoonoci aplikacji, czynno ta moe zaj nieco czasu.
Przyjrzyjmy si systemowemu plikowi web.config (zazwyczaj jest on zapisany w folderze
C:\WinNT\Microsoft.NET\Framework\wersja\config.web). Jak wida plik ten moe by cakiem
zoony. Zazwyczaj pliki te maj ponad 450 wierszy dugoci! Wszystkie te ustawienia
konfiguracyjne s zapamitywane w pamici podrcznej w chwili uruchamiania aplikacji, dziki
czemu ASP.NET moe znacznie szybciej wykorzystywa informacje konfiguracyjne podczas
obsugi stron wchodzcych w skad aplikacji, ni w przypadku gdyby informacje te nie byy
zapamitywane.

Zapisywanie w pamici podrcznej wynikw i


danych
Zapamitywanie w pamici podrcznej wynikw jest procesem polegajcym na zapisaniu
zawartoci wygenerowanej przez dynamiczne strony ASP.NET; na przykad, moe to dotyczy
obliczonych wartoci a nawet elementw sterujcych DataGrid. Zapamitywanie wynikw nie
jest wykonywane automatycznie, lecz mona je atwo zrealizowa. Informacje na ten temat
znajdziesz w dalszej czci rozdziau, w podrozdziale pt.: Jak korzysta z pamici podrcznej.

Notatka
Nie naley myli przechowywania danych w pamici podrcznej z buforowaniem. Bufory s
wykorzystywane do tymczasowego przechowywania wynikw do momentu zakoczenia
przetwarzania. W odpowiednim momencie bufory s oprniane. Pami podrczna
wykorzystywana jest w celu przechowania informacji na duszy okres czasu, tak aby mona ich
byo powtrnie uy. Obie te metody mog si myli pocztkujcym programistom.

Zapisywanie danych w pamici podrcznej umoliwia zapamitywanie informacji dowolnych


typw, poczynajc od rekordw baz danych, a koczc na elementach sterujcych tworzonych
przez uytkownikw. Rozwizanie to przypomina nieco zapisywanie wynikw w pamici
podrcznej, jednak jego moliwoci nie ograniczaj si wycznie do zapamitywania samych
wynikw wygenerowanych przez stron ASP.NET. Ta metoda wykorzystania pamici podrcznej
nie jest uywana automatycznie, a zatem tylko od programisty zaley co zostanie zapamitane.

Jak korzysta z pamici podrcznej


ASP.NET umoliwia kontrolowanie sposobw przechowywania w pamici podrcznej zarwno
wynikw jak i danych. Dziki temu istnieje moliwo dostosowania sposobw dziaania pamici
podrcznej do potrzeb konkretnej aplikacji. Kada z tych metod udostpnia nieco inne
mechanizmy wykorzystania pamici podrcznej, a zatem niezwykle wanym zagadnieniem jest
poznanie ich wszystkich.
W trzech kolejnych podrozdziaach opisane zostan trzy rne metody przechowywania danych w
pamici podrcznej udostpniane przez ASP.NET. Kada z nich ma swoje zalety i wady. Na
szczcie jednak, ich wykorzystanie nie przysparza najmniejszych problemw. Zatem ju wkrtce
bdziesz mg w peni korzysta z moliwoci pamici podrcznej!

Zapamitywanie wynikw wykonania stron


ASP.NET
Wczenie zapisywania wynikw wykonania stron ASP.NET w pamici podrcznej jest bardzo
proste sprowadza si ono do wykorzystania dyrektywy OutoutCache:
<%@ OutputCache Duration="czasSkadowania" Location="miejsceSkadowania" %>

Umieszczenie tej dyrektywy w kodzie strony ASP.NET spowoduje, e wygenerowane przez ni


wyniki zostan zapisane w pamici podrcznej, w miejscu okrelony przy uyciu parametru
miejsceSkadowania i pozostan tam przez okres czasu okrelony przy uyciu parametru
czasSkadowania (i wyraony w sekundach). Parametrowi Location mona przypisa jedn z
wartoci przedstawionych w tabeli 14.1. (Naley pamita, i jest to parametr opcjonalny).

Tabela 14.1. Wartoci parametru Location


Warto Opis
Any Pami podrczna wynikw moe by umieszczona w kadym z dostpnych
miejsc. To domylna warto tego parametru.
Client Pami podrczna wynikw bdzie umieszczona na komputerze uytkownika.
Downstream Pami podrczna bdzie umieszczona na serwerze znajdujcym si poniej
serwera ktry obsuguje dania (czyli pomidzy nim a komputerem
uytkownika). Warto ta jest stosowana w przypadku korzystania z serwerw
poredniczcych.
None Wynikw tej strony nie naley przechowywa w pamici podrcznej.
Server Pami podrczna bdzie umieszczona na serwerze obsugujcym dania.

Gdy przechowywanie wynikw w pamici podrcznej jest wczone, to wszystkie generowane


informacje s zapisywane nie w pamici, lecz na dysku twardym komputera okrelonego za
pomoc parametru Location. Ma to ogromny wpyw na efektywno. Oznacza to rwnie, e
przechowywanie wynikw daje niemal nieograniczone moliwoci, gdy nie wykorzystuje
adnych cennych zasobw.
Przeanalizujmy teraz konkretny przykad. Strona przedstawiona na listingu 14.1 wywietla prost
wiadomo powitaln oraz aktualny czas.

Listing 14.1. Wykorzystanie przechowywania wynikw w pamici podrcznej


1 <%@ Page Language="VB" %>
2 <%@ OutputCache Duration="30" VaryByParam="none" %>
3
4 <script runat="server">
5 sub Page_Load(obj as object,e as eventargs)
6 lblMessage.Text ="Witaj! Teraz jest " & _
7 DateTime.Now.ToString("T")
8 end sub
9
10 </script>
11
12 <html><body>
13 <font size="5 ">Wykorzystanie przechowywania
14 wynikw w pamici podrcznej</font><hr>
15 <asp:Label id="lblMessage" runat="server"/>
16 </body></html>

Analiza
Powyszy przykad przypomina zwyczajn stron ASP.NET z dodatkow dyrektyw
OutputCache. Dyrektywa ta powoduje, e wyniki wykonania strony zostan zapisane w pamici
podrcznej i przechowane przez 30 sekund. Po upyniciu tego okresu czasu zawarto pamici
podrcznej zostanie uniewaniona, a kolejne danie spowoduje ponowne wykonanie strony i
zapamitanie wygenerowanych przez ni wynikw. Wyniki wykonania powyszej strony zostay
przedstawione na rysunku 14.3.
Rysunek 14.3. Wyniki zapamitania w pamici podrcznej informacji o aktualnym czasie

Zwr uwag na informacje o czasie wywietlone na wynikowej stronie. Po klikniciu przycisku


Odwie w przegldarce, informacje te nie ulegn zmianie. Dziej si tak dlatego, i strona jest
pobierana z pamici podrcznej na serwerze, a jej kod nie jest wykonywany. Wyniki
przechowywane w pamici podrcznej zostan uniewanione po 30 sekundach, dlatego te, jeli
ponowne odwiedzenie strony po upyniciu 30 sekund spowoduje wywietlenie biecego czasu.
Mechanizmy przechowywania wynikw w pamici podrcznej s jednak znacznie potniejsze ni
mona by przypuszcza na podstawie tego prostego przykadu. Na przykad, pami podrczna
moe porwna acuch zapytania dodany do adresu strony i na tej podstawie okreli co naley
zapamita. Zmodyfikujmy nieco nasz przykadow stron, aby zademonstrowa ten efekt.

Listing 14.2. Zapamitywanie acucha zapytania


1 <%@ Page Language="VB" %>
2 <%@ OutputCache Duration="30" VaryByParam="*" %>
3
4 <script runat="server">
5 sub Page_Load(obj as object,e as eventargs)
6 lblMessage.Text ="Witaj! " & Request.Params("id") & _
7 "! Teraz jest " & DateTime.Now.ToString("T")
8 end sub
9
10 </script>
11
12 <html><body>
13 <font size="5 ">Wykorzystanie przechowywania
14 wynikw w pamici podrcznej</font><hr>
15 <asp:Label id="lblMessage" runat="server"/>
16 </body></html>

Analiza
W wierszu 6. listingu 14.2 zostaa dodana metoda umoliwiajca pobranie wartoci parametru id.
W tym przykadzie zosta take wyduony czas przechowywania wynikw w pamici podrcznej,
dziki czemu bdziemy mieli wicej czasu na wyprbowanie dziaania przykadu, zanim
zawarto pamici zostanie uniewaniona. Zapisz powyszy kod w pliku o nazwie
listing1402.aspx i wywietl j w przegldarce podajc swoje imi w acuchu zapytania (na
przykad: http://localhost//rozdzial13/listing1402.aspx?id=Chris). Teraz we wiadomoci
powitalnej powinno si pojawi podane imi. Naley take zwrci uwag na informacje o czasie
nawet po klikniciu przycisku Odwie nie ulegn one zmianie.
A teraz zmodyfikujmy nieco adres URL listing1402.aspx?id=Zenek. W przegldarce zostanie
wywietlona strona zawierajca now wiadomo powitaln i bardziej aktualny czas. Odwie t
stron kilka razy, aby upewni si, e jest ona przechowywana w pamici podrcznej.
A teraz ponownie wpisz pocztkowy adres URL listing1402.aspx?id=Chris. W przegldarce
pojawi si strona z oryginaln wiadomoci powitaln i oryginalnym czasem! Na szczcie nie
podrujesz wstecz w czasie, lecz zadae strony, ktra ju jest przechowywana w pamici
podrcznej. Na rysunku 14.4 przedstawiem wyniki uzyskane po wykonaniu opisanych wczeniej
trzech da dotyczcych tej samej strony.

Rysunek 14.4. ASP.NET odczytuje parametry acucha zapytania aby okreli sposb
przechowywania stron w pamici podrcznej

Nowe okrelenie
ASP.NET odczytuje parametry przekazywane w acuchu zapytania, aby okreli czy dana
strona znajduje si ju w pamici podrcznej. Jeli acuch zapytania uleg zmianie, to ASP.NET
rejestruje brak trafienia, co oznacza, e strony nie odnaleziono w pamici. W tym przypadku
ASP.NET ponownie wykonuje kod strony i zapamituje wygenerowane przez ni wyniki. (Naley
zauway, i brak trafienia zachodzi take w przypadku gdy upynie termin wanoci wynikw
przechowywanych w pamici podrcznej, co sprawi, e strona zostanie ponownie wykonana.)

Notatka
Oznacza to, e dania zawierajce dwa parametry o tych samych wartociach lecz zapisane w
innej kolejnoci spowoduj zapisanie w pamici podrcznej dwch rnych stron: Na przykad:

strona.aspx?imie=XX&nazwisko=YY

Zadanie wywietlenia strony o poniszym adresie spowoduje dodanie jej wynikw do pamici
podrcznej:

strona.aspx?nazwisko=YY&imie=XX
Sposb dziaania tego mechanizmu mona kontrolowa dodajc do dyrektywy OutputCache
nowe parametry VaryByParam, VaryByHeader oraz VaryByCustom. Jako wartoci tych
parametrw mona poda list zmiennych, ktrych naley uy przy rozrnianiu wynikw
przechowywanych w pamici podrcznej; przy czym poszczeglne elementy tej listy s od siebie
oddzielane przecinkami. Na przykad, ponisza dyrektywa informuje ASP.NET e wyniki stron
naley uwaa za rne, tylko jeli zmieni si warto parametru imie:
<%@ OutputCache Duration="600" VaryByParam="imie" %>

Dodaj powysz dyrektyw do przykadu przedstawionego na listingu 14.2 i wywietl t stron w


przegldarce posugujc si nastpujcym adresem URL:
http://localhost/rozdzial14/listing1402.aspx?imie=Chris&nazwisko=Payne. Zwr uwag na czas
wywietlony na stronie.
A teraz zmie adres URL zapisujc go w nastpujcej postaci: listing1402.aspx?
imie=Chris&nazwisko=Saravia i odwie stron wywietlan w przegldarce. Zauwa, e czas
wywietlony na stronie si nie zmieni, gdy strona z acuchem zapytania zawierajcym parametr
imie o wartoci Chris, jest ju zapisana w pamici podrcznej. W tym przypadku wartoci
parametru nazwisko s ignorowane. Mona doda ten parametr do dyrektywy OutpuCache, tak
aby strona bya zapamitywana w pamici podrcznej na podstawie wartoci obu parametrw:
<%@ OutputCache Duration="600" VaryByParam="imie,nazwisko" %>

Naley wiedzie, e jeli parametr VaryByParam zostanie pominity, to domylne dziaanie


dyrektywy bdzie polegao na zapamitywaniu stron na podstawie wszystkich parametrw
przekazywanych w acuchu zapytania. Parametr VaryByParam zostanie bardziej szczegowo
opisany w podrozdziale Mechanizmy uzaleniania pamici podrcznej od innych informacji.
Parametr VaryByHeader dziaa podobnie jak VaryByParam, lecz zapisuje strony w pamici
podrcznej na podstawie wartoci nagwkw HTTP a nie parametrw przekazywanych w
acuchu zapytania. Poniewa nie omawiaem zagadnie zwizanych z okrelaniem wartoci
nagwkw HTTP nie bd take opisywa parametru VaryByHeader. W kocu ostatni z
parametrw dyrektywy OutputCache VaryByCustom pozwala na zapisywanie stron w
pamici podrcznej na podstawie innych czynnikw ni parametry acucha zapytania oraz
nagwki HTTP na przykad, na podstawie nazwy bd numeru wersji przegldarki.
Na przykad, moliwoci te mog si przyda na witrynie sprzedajcej bilety na koncerty. W
pierwszej kolejnoci uytkownik wybiera wojewdztwo w jakim koncert si odbdzie oraz cen
jak jest skonny zapaci za bilet. Informacje te zostaj zapisane w acuchu zapytania. Kolejna
strona pobiera z bazy danych i wywietla list wszystkich zaplanowanych koncertw, posortowan
wedug daty koncertu i zapisuje j w pamici podrcznej. Strona ta powinna by zapisywana w
pamici podrcznej wycznie na podstawie wybranego wojewdztwa. Informacje wywietlane na
tej stronie nie maj bowiem adnego zwizku z kwot jak uytkownik jest skonny zapaci za
bilet. Umieszczajc w dyrektywie OutputCache jedynie parametr
VaryByParam="wojewodztwo" i pomijajc parametr zapytania kwota, mona ograniczy ilo
stron przechowywanych w pamici podrcznej oraz ilo wykorzystywanych zasobw.

Elementy sterujce uytkownika


W pamici podrcznej mona take zapisywa elementy sterujce uytkownikw. Na przykad,
jeli chcemy zapamita tylko wybrany fragment strony, na przykad element sterujcy
DataGrid, mona umieci go w elemencie sterujcym uytkownika i, w dyrektywie
OutpuCache, okreli opcje umoliwiajce zapisanie go w pamici podrcznej. Rozwizanie to
nazywane jest zapisywaniem w pamici podrcznej fragmentw stron (ang.: fragment caching).
Moliwo ta jest niezwykle przydatna w tych wszystkich sytuacjach gdy w pamici podrcznej
naley zapisywa tylko wybrane fragmenty stron. Na przykad, zamy, e stworzylimy prosty
element sterujcy wywietlajcy dwa pola tekstowe, suce do podania nazwy uytkownika oraz
hasa. Element ten nie musi by generowany przy obsudze wszystkich da, gdy nigdy si nie
zmienia. Dlatego te mona go zapisa w pamici podrcznej. Jednak strona uywajca elementu
sterujcego uytkownika moe zawiera jakie wane informacje, takie jak czas, bd dane
wygenerowane specjalnie dala danego uytkownika. W takim przypadku zapamitanie w pamici
podrcznej caej strony nie jest dobrym rozwizaniem, gdy w przegldarce uytkownika byyby
wywietlane nieaktualne informacje. A zatem w pamici podrcznej powinny si znale
wycznie elementy, ktre nie ulegaj zmianie; takie jak elementy sterujce uytkownika.
Poniewa mechanizm zapisu fragmentw stron w pamici podrcznej jest jedynie bardziej
zaawansowan form zapamitywania wynikw, wic wszystkie zapamitywane informacje s
przechowywane na dysku. Rozwizanie to wymaga uycia bardzo niewielu zasobw serwera. Na
listingu 14.03 przedstawiona zostaa definicja bardzo prostego elementu sterujcego uytkownika
(wicej informacji na temat ich tworzenia znajdziesz w rozdziale 6., pt.: Cig dalszy wiadomoci
na temat tworzenia formularzy internetowych).

Listing 14.03. Element sterujcy uytkownika przechowywany w pamici podrcznej


(control.ascx)
1 <%@ Control Language="VB" %>
2 <%@ OutputCache Duration="30" VaryByParam="none" %>
3
4 <script runat="server">
5 sub Page_Load(obj as object, e as eventargs)
6 lblMessage.Text = "Element sterujcy ostatni raz " & _
7 "zosta wywietlony o " & DateTime.Now.ToString("T")
8 end sub
9 </script>
10
11 <font size="5">Dane zapamitywane w pamici podrcznej</font>
12 <hr>
13 <asp:Label id="lblMessage" runat="server" />

Analiza
Przedstawiony powyej element sterujcy wywietla jedynie etykiet prezentujc godzin o
ktrej element zosta wykonany po raz ostatni. Naley zwrci uwag, i dyrektywa OutpuCache
umieszczona w wierszu 2. okrela, e element bdzie przechowywany w pamici podrcznej przez
30 sekund. Zapisz kod tego elementu sterujcego w pliku o nazwie control.ascx. Na listingu 14.4.
zostaa przedstawiona strona ASP.NET wykorzystujca element sterujcy control.ascx.

Listing 14.4. Wykorzystanie elementu sterujcego uytkownika.


1 <%@ Page Language="VB" %>
2 <%@ Register TagPrefix="MyControl" TagName="View"
3 Src="control.ascx" %>
4
5 <script runat="server">
6 sub Page_Load(obj as object,e as eventargs)
7 lblMessage.Text = "Strona zostaa ostatni raz " & _
8 "wywietlona o " & DateTime.Now.ToString("T")
9 end sub
10
11 </script>
12
13 <html><body>
14 <MyControl:View runat="server" /><p>
15 <asp:Label id="lblMessage" runat="server" />
16 </body></html>

Analiza
Take ta strona ASP.NET jest bardzo prosta. W wierszu 2. jest rejestrowany element sterujcy
uytkownika. Procedura Page_Load prezentuje godzin, o ktrej strona zostaa wykonana.
Element sterujcy uytkownika zosta wykorzystany w wierszu 13. Naley zwrci uwag, i w
kodzie tej strony nie zostaa umieszczona dyrektywa OutputCache wykorzystalimy j
jedynie w elemencie sterujcym z listingu 14.3.
Gdy wywietlimy t stron w przegldarce, wywietlone czasy dostpu do elementu sterujcego
oraz do samej strony powinny by takie same. Jednak po odwieeniu strony pojawi si rnice
w wywietlonych na niej godzinach. Element sterujcy jest przechowywany w pamici
podrcznej, a zatem zostanie wywietlona jest poprzednia wersja. Z drugiej strony, sama strona nie
jest przechowywana w pamici podrcznej, co oznacza, e czas dostpu do niej bdzie
aktualizowany. Te rnice zostay zaprezentowane na rysunku 14.5.

Rysunek 14.5. Praktyczne wykorzystanie selektywnego zapisywania informacji w pamici


podrcznej

Ostrzeenie
Poniewa element sterujcy uytkownika jest przechowywany w pamici podrcznej, zatem
wszelkie prby programowego zmodyfikowania go na stronie ASP.NET mog spowodowa
wystpienie bdw. Bdy mog si pojawi, na przykad, po przypisaniu elementowi
sterujcemu nowego identyfikatora (id) lub zmianie ktrej z jego waciwoci. Element jest
przechowywany w pamici podrcznej, a zatem jego kod nie jest przetwarzany w trakcie
obsugi da i wszelkie prby jego modyfikacji nie dadz oczekiwanych rezultatw.

Moe si wydawa, i jest to ogromna wada mechanizmw wykorzystania pamici podrcznej,


jednak jeli bdziesz z nich korzysta w odpowiedni sposb, to nigdy nie napotkasz adnych
problemw. W pamici podrcznej powinny by zapisywane wycznie te elementy stron, ktre
nie ulegaj zmianie. Zazwyczaj sposb ich wykorzystywania w stronach ASP.NET take nie
ulega zmianie. Jeli okae si, e bdziesz musia zmieni co w elemencie sterujcym
przechowywanym w pamici podrcznej, to moe w ogle nie powiniene go zapamitywa.

Moliwo zapisywania w pamici podrcznej wybranych fragmentw stron ASP.NET jest


niezwykle przydatna. Jednak nastpnej czci rozdziau przekonasz si, e jeszcze bardziej
przydatnym narzdziem jest obiekt Cache.

Zapisywanie obiektw w pamici podrcznej


Obiekty klasy Cache mona wykorzysta do programowego dodawania innych obiektw do
pamici podrcznej, co moe poprawi efektywno dziaania aplikacji. Wyobra sobie proces
tworzenia duego elementu sterujcego DataGrid na pewno zabiera on wiele czasu. Trzeba
najpierw nawiza poczenie ze rdem danych, pobra je, a nastpnie utworzy i zapisa
informacje w samym elemencie DataGrid. Czy nie byoby wspaniale gdyby istniaa moliwo
wykonania tego procesu tylko raz i zapisania uzyskanego obiektu DataGrid w pamici
podrcznej? W rzeczywistoci jednym z najczciej wykorzystywanych zastosowa obiektw
Cache jest wanie zapamitywanie informacji pobieranych z baz danych.

Obiekt klasy Cache jest tworzony w momencie uruchamiania aplikacji. W odrnieniu od


zapamitywania wynikw stron, obiekty umieszczane w obiektach Cache s przechowywane w
pamici komputera. A zatem, w zalenoci od wielkoci obiektw, zapisywanie ich w pamici
podrcznej moe doprowadzi do spadku efektywnoci dziaania serwera. Z tego powodu obiekty
klasy Cache powinny by wykorzystywane rzadziej i z wiksz rozwag ni mechanizmy
przechowywania wynikw w pamici podrcznej.
By moe zacze si zastanawia dlaczego, w takim razie, w ogle uywa obiektw Cache.
C, maj one trzy podstawowe zalety w porwnaniu z mechanizmami zapamitywania wynikw.
Po pierwsze, przy ich pomocy mona zapisa w pamici podrcznej dowolny obiekt nasze
moliwoci nie ograniczaj si do zapisywania caych stron bd elementw sterujcych
uytkownika. Dziki obiektom Cache mona bardziej wybirczo wykorzystywa pami
podrczn, na przykad zapisywa w niej informacje pobrane z bazy danych lub wybrane elementy
sterujce serwera. Po drugie, obiekty klasy Cache powalaj na wykorzystania modyfikowalnego
czasu upynicia wanoci obiektw przechowywanych w pamici podrcznej. I w kocu ostatni
zalet stosowania obiektw Cache jest moliwo okrelania zalenoci obiektw
przechowywanych w pamici podrcznej. Oznacza to, i moesz zada, aby informacje
przechowywane w pamici podrcznej byy zalene od innego, wybranego elementu. Na przykad,
przechowywany w pamici element sterujcy DataGrid moe by zaleny od umieszczonych w
nim informacji. Jeli rdo danych zostanie zmodyfikowane, zaleny od niego element sterujcy
DataGrid zostanie uznany za niewany i stworzony ponownie. Wicej informacji na ten temat
podam w dalszej czci rozdziau, pt.: Zalenoci informacji przechowywanych w pamici
podrcznej.
Listing 14.5 przedstawia przykad strony wykorzystujcej obiekty klasy Cache do zapamitania w
pamici podrcznej informacji pobranych z bazy danych. W momencie pierwszego wywietlenia
tej strony, z bazy danych s pobierane informacje, ktre nastpnie zostaj skojarzone z elementem
sterujcym DataGrid. Informacje te zostan take zapisane w pamici podrcznej, dziki czemu
podczas obsugi kolejnego dania bdzie mona je pobra bezporednio z pamici. W ten sposb
nasza przykadowa storna bdzie wykonywana znacznie szybciej.

Listing 14.5. Uycie obiektu Cache do zapisania w pamici podrcznej informacji pobranych
z bazy danych.
1 <%@Page Language="VB" %>
2 <%@Import Namespace="System.Data" %>
3 <%@Import Namespace="System.Data.OleDb" %>
4
5 <script language="VB" runat="server">
6 sub Page_Load(obj as Object,e as EventArgs)
7 if not Page.IsPostBack then
8 CreateData()
9 end if
10 end sub
11
12 sub CreateData
13 dim source as DataView
14
15 source = Cache("DataView")
16
17 if source is nothing then
18 dim strConnString as string = "Provider=" & _
19 "Microsoft.Jet.OLEDB.4.0;" & _
20 "Data Source=C:\ASPNET\Data\banking.mdb"
21
22 dim objCmd as OleDbDataAdapter = new _
23 OleDbDataAdapter("select * from tblUsers", _
24 strConnString)
25
26 dim ds as DataSet = new DataSet()
27 objCmd.Fill(ds, "tblUsers")
28
29 source = new DataView(ds.Tables("tblUsers"))
30 Cache("DataView") = source
31
32 lblMessage.Text ="Informacje pobrane bezporednio z bazy danych"
33 else
34 lblMessage.Text ="Informacje pobrane z pamici podrcznej"
35 end if
36
37 dgData.DataSource =source
38 dgData.DataBind()
39 end sub
40
41 sub ExpireCache(obj as object, e as eventargs)
42 Cache.Remove("DataView")
43 CreateData()
44 end sub
45 </script>
46
47 <html><body>
48 <form runat="server">
49 <asp:Label id="lblMessage" runat="server"
50 maintainState=false/><p>
51 <asp:Button id="btSubmit" runat="server"
52 text="Wyczy pami podrczn"
53 OnClick="ExpireCache" /><p>
54 <asp:DataGrid id="dgData" runat="server"
55 BorderColor="black"
56 GridLines="Vertical"
57 cellpadding="4"
58 cellspacing="0"
59 width="450"
60 Font-Name="Arial"
61 Font-Size="8pt"
62 HeaderStyle-BackColor="#cccc99"
63 ItemStyle-BackColor="#ffffff"
64 AlternatingItemStyle-Backcolor="#cccccc" />
65 </form>
66 </body></html>

Analiza
Procedura Page_Load zdefiniowana w wierszach od 6. do 10. wyglda dosy standardowo.
Najwaniejsze czynnoci s jednak wykonywane w procedurze CreateData zdefiniowanej w
wierszach do 12. do 39.
W tym przykadzie w pamici podrcznej chcemy zapisa obiekt DataView zawierajcy
informacje pobrane z bazy danych, dziki czemu, przy obsudze kolejnych da, dostp do nich
bdzie znacznie atwiejszy. W tym celu, w wierszu 13. tworzony jest obiekt DataView. W
wierszu 15. prbujemy pobra ten obiekt z pamici podrcznej (czyli obiektu Cache). Jeli jednak
w pamici nie ma adnego obiektu o podanej nazwie (sytuacja taka powinna mie miejsce podczas
pierwszego wywoania strony), to zmiennej source zostanie przypisana warto nothing.
Warto zmiennej source jest sprawdzana w warunku zapisanym w wierszu 17. Jeli jest ona
rwna nothing (co oznacza, e z pamici podrcznej nie zostay pobrane adne informacje),
bdziemy musieli pobra odpowiednie informacje z bazy danych. Stosowne czynnoci s
wykonywane przez kod zapisany w wierszach od 18. do 27. cay ten proces powiniene ju
doskonale zna. W wierszu 29. w zmiennej source zapisywany jest nowy obiekt DataView
utworzony na podstawie informacji pobranych z bazy; a w wierszu 30. obiekt ten jest zapisywany
w pamici podrcznej. W efekcie, ten konkretny sposb prezentacji pobranych informacji zostaje
zapisany w pamici podrcznej, a to z kolei oznacza, e zapamitane zostay take pobrane z bazy
informacje. W wierszach 32. oraz 34. wywietlany jest komunikat skd pochodz informacje
wywietlone na stronie.
Aby przetestowa t aplikacj warto by take mie moliwo rcznego wyczyszczenia zawartoci
pamici podrcznej. Suy do tego procedura ExpireCache zdefiniowana w wierszach od 41. do
44. Procedura ta zostanie wywoana za kadym razem gdy uytkownik kliknie przycisk
zdefiniowany w wierszach 51. i 52. Metoda Remove klasy Cache usuwa z pamici podrcznej
wybrany obiekt. W naszym przypadku usuwany jest obiekt o nazwie DataView. Drug i ostatni
czynnoci wykonywan przez procedur ExpireCache jest wywoanie procedury CreateData,
ktre spowoduje ponowne pobrania informacji z bazy danych i ich wywietlenie.

Notatka
Metoda Remove zwraca obiekt ktry ma zosta usunity z pamici podrcznej. Dziki temu, w
razie koniecznoci, na obiekcie tym mona wykona jakie dodatkowe czynnoci. Na przykad,
kod umieszczony w wierszu 42. ostatniego przykadu mona by zastpi nastpujcym:

dim dv as DataView = Cache.Remove("DataView")

Dziki temu na zwrconym obiekcie tym mona wykona jakie kocowe czynnoci, nim
ostatecznie zostanie on usunity z pamici podrcznej; na przykad, po raz ostatni pobra z
niego dane.

Jeli w wywoaniu metody Remove zostanie podana nazwa obiektu ktrego nie ma w pamici
podrcznej, to metoda zwrci warto nothing.

Po wywoaniu metody Remove i usuniciu z pamici podrcznej obiektu DataView, naley


ponownie pobra informacje z bazy danych. Oznacza to, e zostanie podjta prba wykonania
kodu umieszczonego wewntrz instrukcji if z wiersza 17. Na rysunku 14.6 przedstawione zostay
wyniki pierwszego wykonania strony z listingu 14.5, natomiast na rysunku 14.7 wyniki
uzyskane po odwieeniu strony wywietlonej w przegldarce.
W przypadku pierwszego wywietlenia strony, powinien si na niej pojawi komunikat
Informacje pobrane bezporednio z bazy danych. Odwieenie strony spowoduje, e
wywietlony komunikat zmieni si na: Informacje pobrane z pamici podrcznej. Kliknicie
wywietlonego na stronie przycisku Wyczy pami podrczn spowoduje ponowne
pocztkowego komunikatu. W zalenoci od konfiguracji komputera, bdzie mona zauway
wiksz lub mniejsz zmian w efektywnoci dziaania tej strony wynikajc z uycia pamici
podrcznej. Cho w naszym przypadku rnica ta moe nie by ogromna, to jednak trzeba sobie
wyobrazi co si stanie jeli t stron bd prboway jednoczenie pobra dziesitki tysicy
uytkownikw. Korzyci jakie daje przechowywanie danych w pamici podrcznej rosn
wykadniczo wraz ze wzrostem obcienia witryny.
Rysunek 14.6. Informacje przeznaczone do przechowania w pamici podrcznej pobrane z bazy
danych
Rysunek 14.7. Podczas obsugi kolejnych da skierowanych do tej samej strony informacje s
pobierane z pamici podrcznej

Notatka
Warto zwrci uwag, i kliknicie przycisku Odwie w przegldarce po klikniciu przycisku
Wyczy pami podrczn spowoduje, e przegldarka zada pytanie czy naley ponownie
przesa dane z formularza. Kliknicie przycisku Tak sprawi, i na serwer ponownie zostan
przesane informacje o klikniciu przycisku Wyczy pami podrczn, a to z kolei spowoduje
wyczyszczenie pamici podrcznej. W ten sposb, niewiadomi niczego uytkownicy mog si
zastanawia dlaczego na stronie wci jest wywietlana informacja o pobraniu danych z bazy
danych, a nie z pamici podrcznej.

Aby odwiey stron po klikniciu przycisku Wyczy pami podrczn, naley ponownie
wpisa jej adres na pasku adresu przegldarki. Mona take umieci na stronie poczenie
wskazujce na ni sam. Kliknicie takiego poczenia spowoduje odwieenie strony.

Istniej trzy rne sposoby zapisywania danych w pamici podrcznej. Pierwszy z nich zosta
przedstawiony w ostatnim przykadzie. Dwa nastpne bazuj na wykorzystaniu metod Add oraz
Insert. S one bardzo podobne do siebie, cho metoda Insert daje wiksze moliwoci.
Poniej przedstawiem skadni wywoania metody Add:
Cache.Add(klucz, warto, zalenoci, bezwzgDataWygWanosci, _
zmiennyCzasWygWanoci, priorytet, zmniejszeniePriorytetu, _
onRemoveCallBack)
Metoda ta ma wiele argumentw, ktre poniej szczegowo opisz. Pierwsze dwa z nich
klucz oraz warto byy wykorzystywane take w poprzednim przykadzie. Klucz to nazwa
obiektu, ktry ma zosta zapisany w pamici podrcznej, a warto to ten obiekt. Argument
zalenoci zostanie dokadniej opisany w dalszej czci rozdziau. BezwzgDataWygWanoci
to bezwzgldna data okrelajca kiedy ma upyn wano elementu przechowywanego w
pamici podrcznej, na przykad June 6, 2002 (czyli 6 czerwca 2002 roku).
Argument zmiennyCzasWygWanoci przypomina nieco argument bezwzgDataWygWanoci,
z tym i okrelany przez niego moment wyganicia wanoci elementu przechowywanego w
pamici podrcznej jest zmieniany po otrzymaniu kadego dania dotyczcego stron. Na
przykad, jeli wykorzystujc argument bezwzgDataWygWanoci okrelimy, e element ma
zosta usunity z pamici podrcznej za pi godzin od chwili obecnej, po piciu godzinach
zostanie on z niej usunity bez wzgldu na to co si bdzie dziao w midzyczasie. W przypadku
uycia argumentu zmiennyCzasWygWanoci element zostanie usunity z pamici podrcznej
dopiero po upyniciu piciu godzin od czasu otrzymania ostatniego dania skierowanego do
danej strony. Oznacza to, e jeli kto zada wywietlenia strony 4 godziny od chwili obecnej, to
obiekt zostanie usunity 5 godzin od tego momentu czyli 9 godziny od chwili obecnej. A
zatem, czas wyganicia wanoci elementu przechowywanego w pamici podrcznej zmienia si
wraz z obsug kolejnych da. Przy okrelaniu wartoci tego argumentu wykorzystywane s
obiekty klasy TimeSpan.
Argument priorytet okrela w jaki sposb, w okrelonych sytuacjach (na przykad, w razie
braku pamici), obiekty bd usuwane z pamici podrcznej. Oglnie rzecz biorc elementy o
wyszym priorytecie bd przechowywane w pamici podrcznej duej, ni obiekty o niszym
priorytecie. Priorytet elementu odpowiada kosztowi jego zachowania w pamici. Im stworzenie
elementu jest bardziej kosztowe pod wzgldem czasu i wykorzystywanych zasobw, tym duej
element ten powinien by przechowywany w pamici podrcznej.
Argument zmniejszeniePrioryteu okrela z jak szybkoci priorytet elementu bdzie mala
wraz z upywem czasu innymi sowy jak wany bdzie dany element za 20 minut, gdy zasoby
pamici serwera zaczn si wyczerpywa. Ostatni argument wywoania metody Add
onRemoveCallBack jest metod, ktr naley wywoa w momencie usuwania danego
elementu z pamici podrcznej.

A teraz dodajmy nasz obiekt DataView do pamici podrcznej przy uyciu metody Add. W tym
celu zamiemy wiersz 30. listingu 14.5 w poniszy sposb (zmodyfikowany kod przykadu
znajduje si w pliku listing1405-v2.aspx):
Cache.Add("DataView", source, nothing, DateTime.new.AddMinutes(1), _
TimeSpan.Zero, CacheItemPriority.High, _
CacheItemPriorityDecay.Slow, addressof HandleRemove)

Analiza
Powysze wywoanie metody Add dodaje do pamici podrcznej zmienn source zawierajc
obiekt DataView, ktrych chcemy zapamita. W wywoaniu okrelamy, e obiekt nie bdzie
mia adnych zalenoci, a bezwzgldna data upynicia wanoci zostaje ustawiona na minut po
momencie wywoania metody. Zmienny czas upynicia wanoci obiektu zostaje ustawiony na 0,
co w praktyce oznacza i nie bdzie on brany pod uwag. Priorytetowi obiektu zapisywanego w
pamici podrcznej zostaje przypisana warto High (oznaczajca wysoki priorytet), a szybkoci
zmniejszania priorytetu warto Slow (okrelajca, e bdzie on zmniejszany powoli).
Dostpne wartoci argumentw priorytet oraz zmniejszeniePriorytetu zostay
przedstawione w tabeli 14.2. Ostatni argument wywoania metody Add okrela procedur jaka
zostanie wywoana w momencie usuwania danego obiektu z pamici podrcznej. (W przypadku,
gdy nie mamy zamiaru obsugiwa tego zdarzenia, argumentowi temu mona przypisa warto
nothing.) Jeli argumentem tym bdzie nazwa nieistniejcej procedury, to podczas wykonywania
strony pojawi si bd.
Poniej przedstawiony zosta oglny sposb definicji procedury HandleRemove:
sub HandleRemove(klucz as string, wartosc as object, _
powod as CacheItemRemovedReason)
'... kod
end sub

Do tej metody jest przekazywany klucz oraz obiekt ktry zosta usunity z pamici, jak rwnie
powd jego usunicia. Argument powod moe przyjmowa jedn z nastpujcych wartoci:
DependencyChanged obiekt od ktrego zalea ten element pamici podrcznej uleg
zmianie (przykadem takiego obiektu moe by baza danych);
Expired upyn okres wanoci elementu pamici podrcznej;

Removed element zosta usunity z pamici podrcznej w wyniku wywoania metody


Remove;

Underused system usun element z pamici podrcznej gdy na komputerze


zaczynao brakowa pamici.

W tabeli 14.2 przedstawione zostay dostpne wartoci okrelajce priorytet elementu pamici
podrcznej oraz szybko zmniejszania tego priorytetu (wartoci te nale odpowiednio do typw
wyliczeniowych CacheItemPriority oraz CacheItemPriorityDecay).

Tabela 14.2. Wartoci argumentw okrelajcych priorytet oraz szybko zmniejszania


priorytetu.
Priorytet Opis
AboveNormal Prawdopodobiestwo usunicia tych elementw z pamici podrcznej jest
mniejsze ni w przypadku elementw o priorytecie Normal.
BelowNormal Prawdopodobiestwo usunicia tych elementw z pamici podrcznej jest
wiksze ni w przypadku elementw o priorytecie Normal.
Default Ta warto odpowiada priorytetowi Normal.
High Prawdopodobiestwo usunicia elementw o tym priorytecie z pamici
podrcznej jest najmniejsze.
Low Prawdopodobiestwo usunicia elementw o tym priorytecie z pamici
podrcznej jest najwiksze.
Normal Podstawowa warto priorytetu.
NotRemovable Te elementy w ogle nie bd usuwane z pamici podrcznej.

Szybko Opis
zmniejszania
priorytetu
Default Odpowiada wartoci Medium.
Fast W przypadku sporadycznego odwoywania si do tych elementw,
prawdopodobiestwo usunicia ich z pamici podrcznej jest najwiksze.
Medium Podstawowa warto.
Never Te elementy nigdy nie bd usuwane z pamici podrcznej.
Slow W przypadku sporadycznego odwoywania si do tych elementw,
prawdopodobiestwo usunicia ich z pamici podrcznej jest najmniejsze.
Notatka
Naley pamita, i wartoci opisane w tabeli 14.2 maj znaczenie wycznie w przypadku gdy
elementy s usuwane z pamici podrcznej automatycznie, w wyniku ograniczenia iloci
dostpnej pamici. W przypadku rcznego usuwania elementw z pamici podrcznej wartoci
te nie odgrywaj adnego znaczenia.

Wywoanie metody Insert klasy Cache ma taka sam posta, lecz niektre z jej argumentw s
opcjonalne. Poniej przedstawione zostay wszystkie dostpne sposoby wywoania tej metody:
Cache.Insert(klucz, warto)

Cache.Insert(klucz, warto, zalenoci)

Cache.Insert(klucz, warto, zalenoci, bezwzgDataWygWanosci, _


zmiennyCzasWygWanoci)

Cache.Insert(klucz, warto, zalenoci, bezwzgDataWygWanosci, _


zmiennyCzasWygWanoci, priorytet, zmniejszeniePriorytetu, _
onRemoveCallBack)

Ostrzeenie
Dodanie lub wstawienie do pamici podrcznej elementu o takiej samej nazwie jak nazwa
elementu ju zapisanego w pamici spowoduje e element zapisany w pamici zostanie
zastpiony nowym.

Dziki temu mechanizmowi mona zapisywa w pamici podrcznej niemal wszystkie fragmenty
stron ASP.NET poczynajc od obiektw DataView, poprzez elementy sterujce DataGrid, a
na elementach sterujcych uytkownika koczc.

Zalenoci informacji przechowywanych w pamici


podrcznej
Mechanizmy obsugi pamici podrcznej w ASP.NET umoliwiaj okrelenie, e elementy
zapisywane w pamici za porednictwem obiektw klasy Cache, mog zalee od innych
elementw. Na przykad, zamy, e utworzylimy obiekt DataView na podstawie danych
przechowywanych w pliku XML. Jeli plik XML ulegnie zmianie, bdziemy chcieli, aby zmienia
si take zawarto obiektu DataView. Zalenoci pamici podrcznej od zewntrznych rde
danych zostay przedstawione na rysunku 14.8.

Rysunek 14.8. Zalenoci pozwalaj aby zawarto pamici podrcznej bya zalena od
zewntrznego rda danych
Opis rysunku
Cache Pami podrczna
XML File Plik XML
DataView Obiekt prezentujcy dane (DataView)
Invalid! Zawarto niewana!
1. 1. Pobranie danych z pliku
2. 2. Zapisanie danych w pamici podrcznej
3. 3. Okrelenie i dodanie zalenoci
4. 4. Przesanie danych do przegldarki
5. 5. Modyfikacja pliku
6. 6. Ponowne pobranie danych i przejcie do etapu 2.
Bez zalenoci przedstawionych na rysunku 14.8, pami podrczna nie miaaby pojcia o tym, i
dane zostay zmienione, a uytkownik wci otrzymywaby nieaktualne informacje.
Elementy pamici podrcznej mog zalee od plikw, folderw bd te innych elementw
przechowywanych w pamici podrcznej. Zmodyfikujmy zatem przykad z listingu 14.5 w taki
sposb, aby pobiera dane z pliku XML stworzonego w rozdziale 11, pt.: Uycie XML w
ASP.NET; dodatkowo wprowadzimy take zaleno informacji przechowywanych w pamici
podrcznej do pliku z ktrego zostay pobrane. Kod przykadu zosta przedstawiony na listingu
14.6.

Listing 14.6. Wykorzystanie zalenoci przy obsudze pamici podrcznej


1 <%@Page Language="VB" %>
2 <%@Import Namespace="System.Data" %>
3 <%@Import Namespace="System.Data.OleDb" %>
4 <%@Import Namespace="System.IO" %>
5
6 <script language="VB" runat="server">
7 sub Page_Load(obj as Object,e as EventArgs)
8 if not Page.IsPostBack then
9 CreateData()
10 end if
11 end sub
12
13 sub CreateData
14 dim source as DataView
15 dim objFs as FileStream
16 dim objReader as StreamReader
17 dim ds as new DataSet()
18
19 source =Cache("DataView")
20
21 if source is nothing then
22 objFs =New FileStream(Server.MapPath _
23 ("../rozdzial11/books.xml"),FileMode.Open, _
24 FileAccess.Read)
25 objReader =New StreamReader(objFs)
26 ds.ReadXml(objReader)
27 objFs.Close()
28
29 dim objDepend as new _
30 CacheDependency(Server.MapPath("../rozdzial11/books.xml"))
31
32 source =new DataView(ds.Tables(0))
33 Cache.Insert("DataView",source,objDepend,
DateTime.Now.AddMinutes(1),TimeSpan.Zero)
34
35 lblMessage.Text ="Informacje pobrane bezporednio z pliku XML"
36 else
37 lblMessage.Text ="Informacje pobrane z pamici podrcznej"
38 end if
39
40 dgData.DataSource =source
41 dgData.DataBind()
42 end sub
43
44 </script>
45
46 <html><body>
47 <form runat="server">
48 <asp:Label id="lblMessage" runat="server"
49 maintainState=false/><p>
50 <asp:DataGrid id="dgData" runat="server"
51 BorderColor="black"
52 GridLines="Vertical"
53 cellpadding="4"
54 cellspacing="0"
55 width="450"
56 Font-Name="Arial"
57 Font-Size="8pt"
58 HeaderStyle-BackColor="#cccc99"
59 ItemStyle-BackColor="#ffffff"
60 AlternatingItemStyle-Backcolor="#cccccc" />
61 </form>
62 </body></html>

Analiza
Fragment kodu definiujcy posta wynikow strony WWW nie zosta w aden sposb
zmodyfikowany (za wyjtkiem usunicia przycisku Wyczy pami podrczn). Wikszo
pozostaej czci kodu take nie ulega zmianie w porwnaniu z listingiem 14.5. Przyjrzyjmy si
jednak rnicom pomidzy obydwoma przykadami.
W wierszach do 22. do 27. pobierane s dane z pliku XML; w przykadzie z listingu 14.5
informacje byy pobierane z bazy danych. Niemniej jednak, podobnie jak w poprzednim
przypadku, take i teraz informacje s umieszczane w obiekcie DataSet. (Naley zwrci uwag,
i w nowej wersji przykadu koniecznie trzeba zaimportowa przestrze nazw System.IO.) W
wierszu 29. tworzony jest nowy obiekt CacheDependency zwizany z plikiem books.xml, z
ktrego korzystalimy w rozdziale 11. W dalszej czci kodu wywietlany jest komunikat
informujcy skd zostay pobrane informacje, a pobrane informacje s wizane z elementem
sterujcym DataGrid.
Sam sposb dziaania strony nie uleg zmianie w porwnaniu z poprzednim przykadem. Podczas
obsugi pierwszego dania dotyczcego danej strony tworzony jest obiekt DataView, a
zapisywane w nim informacje s pobierane bezporednio z pliku XML. Podczas obsugi kolejnych
da dane bd pobierane z pamici podrcznej. Otwrzmy teraz nasz przykadowy plik XML w
dowolnym edytorze (na przykad Notatniku) i dodajmy do niego nowy rekord. Gdy ponownie
zadamy wywietlenia strony, zostanie wywietlony komunikat informujcy, e dane zostay
pobrane z pliku. W przypadku gdyby zaleno (obiekt CacheDependency) nie zostaa
utworzona, mechanizmy obsugi pamici podrcznej w ASP.NET nie wiedziayby jak sprawdzi
czy dane zostay zmienione i cay czas przekazyway uytkownikom zapamitane, nieaktualne
informacje. Na rysunku 14.9 przedstawione zostay wyniki wygenerowane przez stron po
zmodyfikowaniu pliku XML.

Rysunek 14.9. Uaktualnienie pliku od ktrego zaley element pamici podrcznej powoduje
uniewanienie tego elementu i jego powtrne utworzenie.
Uycie klasy HttpCachePolicy
We wczeniejszej czci rozdziau przedstawiem podstawowe informacje dotyczce sposobw
przechowywania stron w pamici podrcznej. Prawdopodobnie, przedstawione moliwoci byyby
w stanie zaspokoi Twoje potrzeby, jednak ASP.NET udostpnia kolejn klas, ktra zapewnia
znacznie wiksze moliwoci kontroli nad sposobem dziaania mechanizmw obsugi pamici
podrcznej. Klasa ta nosi nazw HttpCachePolicy.
Dostp do obiektu tej tek klasy mona uzyska za porednictwem waciwoci Cache obiektu
HttpResponse (Response.Cache). Klasa HttpCachePolicy zawiera zaawansowane metody
umoliwiajce precyzyjne okrelenie sposobu obsugi pamici podrcznej. Obiekty tej klasy
zarzdzaj pamici podrczn przy wykorzystaniu nagwkw HTTP, co oznacza, e kontroluj
sposb przechowywania strony w pamici podrcznej. Rnica pomidzy wykorzystaniem
obiektw klasy HttpCachePolicy a zwyczajnym zapamitywaniem w pamici podrcznej
wynikw wykonania strony polega na tym, i klasa HttpCachePolicy daje moliwo uzyskania
znacznie wikszej kontroli nad mechanizmem obsugi pamici podrcznej.

Operacje na pamici podrcznej


Klasa HttpCachePolicy udostpnia kilka metod sucych do operowania dat wyganicia
wanoci informacji przechowywanych w pamici podrcznej. Dziki niej, umieszczanie
dyrektywy OutputCache w kodzie strony ASP.NET nie bdzie konieczne.
Pierwsza z tych metod SetExpires okrela bezwzgldny czas wyganicia wanoci
zawartoci pamici podrcznej. Przykadowo, ponisze wywoanie informuje, e wano
zawarto pamici podrcznej ma upyn po 30 sekundach.
Response.Cache.SetExpires(DateTime.Now.AddSeconds(30))

Ponisze wywoanie metody SetExpires sprawi, e zawarto pamici podrcznej utraci


wano o godzinie 15.00, lokalnego czasu:
Response.Cache.SetExpires("3:00 PM".ToDateTime())

Kolejnym sposobem okrelenia bezwzgldnego czasu wyganicia wanoci zawartoci pamici


podrcznej, jest uycie metody SetMaxAge. Metoda ta okrela jak dugo informacje mog by
przechowywane w pamici podrcznej zanim zostan uniewanione. Na przykad, ponisze
wywoanie informuje, e zawarto pamici podrcznej ma zosta uniewaniona po 30 minutach
(pierwszym argumentem wywoania metody jest ilo godzin, drugim ilo minut, a ostatnim ilo
sekund):
Response.Cache.SetMaxAge(new TimeSpan(0,30,0))

Obie te metody s do siebie bardzo podobne. Pierwszej z nich SetExpires naley uywa
gdy znana jest dokadna godzina o ktrej warto pamici podrcznej ma utraci wano (nawet
jeli jest on wyraony wzgldem aktualnego czasu). Drugiej z metod SetMaxAge gdy
dokadna godzina o ktrej naley uniewani zawarto pamici podrcznej nie jest znana lub nie
ma znaczenia; jednak gdy zawarto pamici musi zosta uniewaniona po pewnym okresie czasu.
Warto take zauway, e metoda SetExpires pobiera argument typu DateTime, natomiast
metoda SetMaxAge typu TimeSpan.
Obiekty klasy HttpCachePolicy umoliwiaj take okrelanie wartoci zmiennego czasu
upynicia wanoci elementw przechowywanych w pamici podrcznej. (O zmiennym czasie
upynicia wanoci pisaem we wczeniejszej czci rozdziau, pt.: Zapisywanie obiektw w
pamici podrcznej.) Aby umoliwi zastosowanie zmiennego czasu wyganicia wanoci,
wystarczy poda warto true w wywoaniu metody SetSlidingExpiration:
Response.Cache.SetSlidingExpiration(true)

W tym przypadku zawarto pamici podrcznej zostanie uniewaniona po upyniciu okresu


czasu, ktry jest aktualizowany wraz z otrzymywaniem kolejnych da.
Istnieje take moliwo okrelania czy oraz gdzie bdzie przechowywana pami podrczna.
Metoda SetCacheability pozwala okreli kto bdzie mia prawo do zapisywania stron w
pamici podrcznej. Wartoci jakie mona przekaza w wywoaniu tej metody zostay opisane w
tabeli 14.3.

Tabela 14.3. Wartoci okrelajce prawa do korzystania z pamici podrcznej.


Typ Opis
NoCache Nikt nie ma prawa do zapisywania danych w pamici podrcznej. Klient musi
potwierdzi wano elementu pamici podrcznej na serwerze.
Private Okrela, e klient moe zapisa odpowied w pamici podrcznej, jednak nie mog
tego robi serwery poredniczce. Jest to warto domylna argumentu metody
SetCacheability.
Public Okrela e zarwno klienci jak i serwery poredniczce mog zapisywa odpowiedzi
w pamici podrcznej.

Notatka
Warto zwrci uwag, i w przypadku uycia zmiennego czasu upynicia wanoci zawartoci
pamici podrcznej (podania wartoci true w wywoaniu metody SetSlidingExpiration),
czas ten naley okreli w sposb wzgldny (czyli jako okres czasu liczony od chwili obsugi
dania, po upyniciu ktrego zawarto pamici podrcznej zostanie uniewaniona). Na
przykad, wykonanie poniszego fragmentu kodu nie spowoduje uycia zmiennego czasu
upynicia wanoci:

Response.Cache.SetExpires("11/21/01 3:00:00PM".ToDateTime)
Response.Cache.SetSlidingExpiration(true)

W powyszym przypadku ASP.NET nie jest w stanie okreli dugoci okresu czasu po jakim
naley uniewani zawarto pamici podrcznej. Przykad poprawnego sposobu okrelenia
zmiennego czasu upynicia wanoci przedstawiem poniej:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(30))
Response.Cache.SetSlidingExpiration(true)

W tym przypadku zmienny czas upynicia wanoci danych przechowywanych w pamici


podrcznej, zostanie ustawiony na 30 sekund po chwili zakoczenia obsugi ostatniego
dania.

Waciwo ta jest przydatna w sytuacjach gdy wiadomo gdzie s kierowane odpowiedzi oraz jak
maj by traktowane. Na przykad, jeli s one kierowane na sie poprzez serwer poredniczcy,
to mona zapobiec zapamitywaniu ich na tym serwerze. W ten sposb klienty nie bd korzystay
z poredniej pamici podrcznej:
Response.Cache.SetCacheability(HttpCacheability.Private)

Na podobnej zasadzie, wywoanie metody SetNoServerCaching cakowicie uniemoliwia


przechowywanie dokumentu w pamici podrcznej na serwerze. Wszystkie kolejne dania
dotyczce danego dokumentu bd obsugiwane bez wykorzystania pamici podrcznej. Oto
przykad wykorzystania tej metody:
Response.Cache.SetNoServerCaching()

Notatka
By moe zastanawiasz si, gdzie naley umieci wszystkie te instrukcje wykorzystujce
waciwo Response.Cache. W tym przypadku masz du swobod mona je bowiem
umieci w dowolnej metodzie zapisane w bloku deklarowania kodu. Zazwyczaj jednak
instrukcje te umieszczane s na samym pocztku procedury Page_Load, dziki czemu cao
danych wynikowych generowanych przez stron ASP.NET zostanie poprawnie obsuona.
Mechanizmy uzaleniania zapisu danych w pamici podrcznej od
innych informacji
Czy przypominasz sobie podane wczeniej informacje o mechanizmach obsugi pamici
podrcznej oraz o sprawdzaniu parametrw acucha zapytania kontrolowanym przy uyciu
parametru VaryByParam? Domylnie ASP.NET zapisuje wyniki obsugi kadego dania o
unikalnym acuchu zapytania jako niezaleny element pamici podrcznej. Jednak zachowanie to
mona bardzo atwo zmienia.
Waciwo VaryByParams obiektu HttpCachePolicy dostpnego za porednictwem
waciwoci Response.Cache okrela, na podstawie parametrw podawanych przez stron
ASP.NET (bd to za porednictwem acucha zapytania, bd wartoci pl formularzy), w jaki
sposb naley przechowywa obiekty w pamici podrcznej. Przykad wykorzystania tej
waciwoci przedstawiony zosta na listingu 14.7.

Listing 14.7. Wykorzystanie parametrw do okrelania dziaania pamici podrcznej


1 <%@ Page Language="VB" %>
2 <%@ OutputCache Duration="60" VaryByParam="none" %>
3
4 <script runat="server">
5 sub Page_Load(obj as object,e as eventargs)
6 Response.Cache.VaryByParams.Item("imie") = true
7 Response.Cache.VaryByParams.Item("nazwisko") = false
8
9 lblMessage.Text ="Witam " & Request.Params("imie") & _
10 "! Aktualna godzina to " & DateTime.Now.ToString("T")
11
12 lblMessage.Text +="<br>" & Response.Cache. _
13 VaryByParams.Item("imie").ToString
14 lblMessage.Text +="<br>" & Response.Cache. _
15 VaryByParams.Item("nazwisko").ToString
16 end sub
17 </script>
18
19 <html><body>
20 <font size="5">Wykorzystanie pamici podrcznej</font><hr>
21 <form runat="server">
22 <asp:Label id="lblMessage" runat="server"/><p>
23 </form>
24 </body></html>

Analiza
Przykad przedstawiony na powyszym listingu przypomina nieco przykad z listingu 14.2; przy
czym zosta do niego dodany fragment kodu operujcy na waciwociach VaryByParams
(zapisany w wierszach od 12. do 15.). Wywoujc t stron naley poda dwa parametry imie
oraz nazwisko reprezentujce odpowiednio imi oraz nazwisko uytkownika. Wyniki
pierwszego wykonania strony zostay przedstawione na rysunku 14.10.
Rysunek 14.10. Prezentacja elementw waciwoci VaryByParams

Jak wida na powyszym rysunku, elementy imie oraz nazwisko waciwoci VaryByParams
(odpowiadajce parametrom acucha zapytania o tych samych nazwach) zawieraj wartoci
false. Oznacza to, e w pamici podrcznej, dla kadego parametru jest dostpna odrbna wersja
dokumentu. Przechowywane w pamici wersje dokumentw rni si w zalenoci od wartoci
parametru.
To domylny sposb dziaania mechanizmw obsugi pamici podrcznej, z ktrym spotkalimy
si ju wczeniej, w czci pod tytuem Zapamitywanie wynikw wykonania stron ASP.NET.
Podanie unikalnych wartoci parametrw imie oraz nazwisko spowoduje zapisanie w pamici
podrcznej nowej wersji strony. Podanie uytej wczeniej kombinacji parametrw spowoduje
natomiast pobranie wersji przechowywanej w pamici podrcznej.
W tym miejscu zaczyna si robi interesujco. Dodajmy poniszy wiersz kodu do na samym
pocztku procedury Page_Load:

Response.Cache.VaryByParams.Item("imie")=true

A teraz sprbujmy zmieni wartoci parametrw podanych w acuchu zapytania. Podanie nowej
wartoci parametru imie spowoduje zapisanie w pamici podrcznej nowej wersji strony. Jednak
podanie nowej wartoci parametru nazwisko przy jednoczesnym pozostawieniu uytej wczeniej
wartoci parametru imie nie spowoduje zapamitania nowej wersji strony. W takim przypadku
zostanie zwrcona wczeniejsza wersja strony, o czym mona si przekona na podstawie
wywietlonego na niej czasu. Rnica ta zostaa przedstawiona na rysunku 14.11.
Rysunek 14.11. Modyfikacja parametru nazwisko nie powoduje zapamitania nowej wersji
strony.

Na powyszym przykadzie, przypisujc elementowi waciwoci VaryByParams warto true


poinformowalimy ASP.NET, i naley zapamita now wersj strony wycznie w sytuacji gdy
zmieni si warto parametru imie. Podobnie, uycie nastpujcej instrukcji spowoduje, e
ASP.NET bdzie zapamitywa strony wycznie w przypadku podania nowej wartoci parametru
nazwisko:
Response.Cache.VaryByParams.Item("nazwisko") = true

Waciwo VaryByParams jest niezwykle przydatna. Wyobramy sobie na przykad, i strony s


zapisywane w pamici podrcznej na witrynie, okrelajcej status podatkowy uytkownika na
postawie stanu w ktrym dana osoba mieszka. W acuchu zapytania przekazywany jest skrt
nazwy stanu oraz nazwa uytkownika. Jednak dla okrelenia statusu podatkowego znaczenie ma
jedynie informacja o stanie. Zapisywanie stron w pamici podrcznej na podstawie nazwy
uytkownika jest w tym przypadku niepotrzebne. A zatem, aby aktualizowa zawarto pamici
podrcznej wycznie w przypadku zadania strony dotyczcej nowego stanu, moglibymy
posuy si nastpujcym wywoaniem:
Response.Cache.VaryByParams.Item("stan") = true

Moliwoci te, wykorzystane w poprawny sposb, mog przynie ogromne korzyci dla
efektywnoci dziaania aplikacji.
Dostpna jest take waciwo umoliwiajca uzalenienie zapisywania stron w pamici
podrcznej na postawie nagwkw HTTP; nosi ona nazw VaryByHeaders. Waciwo ta
dziaa analogicznie do atrybutu VaryByHeader opisanego w czci rozdziau powiconej
zapamitywaniu wynikw realizacji stron. W niniejszej ksice nie opisywaem wszystkich
dostpnych nagwkw HTTP, dlatego te te zagadnienia bdziesz musia pozna samemu. Obiekt
HttpCachePolicy dostpny za porednictwem waciwoci Response.Cache nie udostpnia
adnej waciwoci odpowiadajcej parametrowi VaryByCustom dyrektywy OutputCache.
Dostpna jest jednak metoda SetVaryByCustom, ktra ma podobne dziaanie. (Wicej informacji
na ten temat znajdziesz w dokumentacji .NET SDK.)
Efektywne korzystanie z pamici podrcznej
Pami podrczna moe w ogromnym stopniu poprawi efektywno dziaania aplikacji
ASP.NET. W aplikacjach o bardzo duym obcieniu, zapamitywanie stron nawet na okres
jednej minuty moe ogromnie pomc. Jeli kady element zapisany w pamici podrcznej moe
skrci obsug dania o jedn sekund, to wyobra sobie jakie korzyci moe da wykorzystanie
pamici podrcznej w przypadku gdy witryna obsuguje setki da na minut.
Oglnie rzecz biorc, w pamici podrcznej mona z powodzeniem przechowywa bardzo wiele
informacji, na przykad informacje pobierane z baz danych lub plikw, wyniki zoonych oblicze
oraz ustawienia konfiguracyjne aplikacji.
Jednak zdarzaj si take przypadki, gdy wykorzystanie pamici podrcznej nie jest najlepszym
rozwizaniem. Wyobra sobie internetow witryn giedow, ktra musi prezentowa informacje z
ostatnich sekund. Zapisywanie takich informacji w pamici podrcznej nie byoby dobrym
rozwizaniem, chyba e jednoczenie byyby wykorzystywane odpowiednie zalenoci.
Tak Nie
Zapisuj w pamici podrcznej czsto Nie zapisuj w pamici podrcznej informacji
wykorzystywane informacje, ktre rzadko kiedy personalnych dotyczcych uytkownikw
s modyfikowane. korzystajcych z aplikacji, na przykad hase.
Inni uytkownicy bardzo atwo mogliby uzyska
Zapisuj w pamici podrcznej ustawienia i
do nich dostp.
obiekty, ktre s wykorzystywane w wielu
miejscach aplikacji a jednoczenie nie s w Nie zapisuj w pamici podrcznej stron, ktrych
aden sposb modyfikowane. zawarto zaley od czasu. Uytkownicy mog
nie rozumie dlaczego ich zegarki si spniaj.
Nie zapisuj w pamici podrcznej obiektw,
ktre uytkownicy mog zmodyfikowa w
dowolnym momencie, takich jak koszyki w
internetowych sklepach.

To nie jest ASP!


Oryginalna wersja technologii ASP umoliwiaa jedynie kontrol zarzdzania pamici podrczn
po stronie klienta. Suyy do tego waciwoci Response.Expires oraz
Response.ExpiresAbsolute. ASP.NET pozwala na kontrol sposobw dziaania
mechanizmw obsugi pamici podrcznej zarwno po stronie serwera jak i klienta. To jedna z
najwikszych zmian jakie wprowadzono w ASP.NET w porwnaniu z poprzednimi wersjami
technologii ASP. Teraz programici dysponuj mechanizmem obsugi pamici podrcznej o
bardzo potnych moliwociach, ktrym mona zarzdza bardzo atwo i na wiele sposobw (w
tym take programistycznie). Tak potne mechanizmy wykorzystania pamici podrcznej mog
w ogromnym stopniu poprawi efektywno dziaania aplikacji.
Rozdzia 15.
Zastosowanie obiektw
biznesowych
W tym rozdziale zajmiemy si nowym obszarem zastosowa ASP.NET. W dwch poprzednich
czciach ksiki przedstawione zostay podstawowe informacje na temat tej technologii oraz
mechanizmy dostpu do danych. Teraz zajmiemy si zagadnieniami zaawansowanymi, ktre
pozwol Ci na tworzenie penych aplikacji ASP.NET.
W tym rozdziale poznasz obiekty biznesowe czyli komponenty ktrych bdziesz mg uywa
w swoich aplikacjach ASP.NET. Rnica pomidzy obiektami biznesowymi a komponentami
ktrych uywalimy do tej pory (takimi jak obiekty ADO.NET oraz obiekty do obsugi danych
XML) polega na tym, i obiekty biznesowe bdziemy w caoci tworzyli wasnorcznie. W tym
rozdziale dowiesz si do czego one su oraz jak naley je tworzy i uywa.
W tym rozdziale zostan omwione nastpujce zagadnienia:
Czym s komponenty i obiekty biznesowe.
W jaki sposb ASP.NET korzysta z komponentw.
Jak mona uywa komponentw.
Jak tworzy i uywa obiektw biznesowych.
W jaki sposb mona korzysta z komponentw, ktre nie zostay utworzone w
rodowisku .NET.

Prezentacja komponentw
Komponenty to obiekty, ktre mog by wielokrotnie wykorzystywane w wielu rnych
aplikacjach. Zazwyczaj odwzorowuj one obiekty spotykane w realnym wiecie. Wykorzystajmy
jeszcze raz przykad z fabryk zegarw, przedstawiony w rozdziale 3, pt.: Stosowanie Visual
Basic.NET. Aby zbudowa zegar naley przygotowa odpowiednie komponenty, takie jak
spryny, koa zbate, szko, drewno oraz wahado i zoy je w jedn cao. W bardzo podobny
sposb s tworzone aplikacje ASP.NET oraz zwyczajne aplikacje. Skadaj si one z wielu czci,
ktre po zoeniu tworz jedn spjn cao.
Wyobra sobie, e tworzone przez Ciebie zegary skadaj si tylko z jednego komponentu
kady zegar jest jednym kawakiem drzewa. Takie zegary nie bd dziaa najlepiej wskazwki
nie bd si krci, a wahado porusza. Jednak jeli podzielisz zegar na oddzielne komponenty
wskazwk godzinow, minutow i sekundow, wahado oraz tarcz znacznie atwiej
bdzie Ci stworzy zegar dziaajcy zgodnie z oczekiwaniami. Co wicej, jeli przy budowie
zegara wykorzystasz wiele rnych czci, znacznie atwiej bdzie je wymienia. Na przykad,
jeli wskazwka minutowa si zamie, to bez problemu bdziesz mg j wymontowa i zastpi
inn. Lub jeli zostanie opracowane bardziej zaawansowane wahado, bdziesz mg je
wykorzysta w swoim zegarze oszczdzajc tym samym zarwno czasu jak i pienidzy.
Jest jednak jeden argument przemawiajcy przeciwko wykorzystywaniu komponentw. Ot
wykorzystanie zbyt wielu komponentw moe przekreli wszelkie korzyci poprzez zbytnie
skomplikowanie aplikacji. Dlaczego niby miaby dzieli na czci wahado? Czci dziaajce
dobrze jako jedna cao nie naley niepotrzebnie dzieli.
W kontekcie ASP.NET komponenty s fragmentami kodu, ktry mona wielokrotnie
wykorzystywa w celu rozszerzenia moliwoci aplikacji lub wzbogacenia jej o nowe funkcje.
Elementy sterujce uytkownika o ktrych pisaem w rozdziale 5. s wanie przykadem
komponentw. Take kod obsugi formularzy mona traktowa jako komponent. Nawet
internetowe elementy sterujce s komponentami, ktrych mona uywa przy tworzeniu stron
ASP.NET. Komponenty s wykorzystywane w celu opisania istniejcych obiektw, takich jak
kalendarz bd ksika. W przypadku storn ASP.NET przykadami komponentw mog by pola
tekstowe bd zbiory wynikw pobrane z bazy danych.

Czym s obiekty biznesowe?


Nowe okrelenie
Obiekty biznesowe s komponentami zawierajcymi kod wykorzystywany w tworzonej aplikacji.
Kod udostpniajcy moliwoci funkcjonalne niezwizane z obsug interfejsu uytkownika jest
nazywany logik biznesow lub reguami biznesowymi. A zatem, komponenty implementujce
logik biznesow s nazywane obiektami biznesowymi.
Na przykad, jeli by pisa aplikacj prezentujc informacje pobierane z bazy danych, to cay
kod zwizany z obsug bazy i stanowicy warstw poredni pomidzy baz a interfejsem
uytkownika byby logik biznesow. W optymalnym przypadku, kod stanowicy logik
biznesow powinien by oddzielony od strony ASP.NET i zaimplementowany w formie obiektu
biznesowego. Strony ASP.NET powinny by wykorzystywane wycznie jako interfejs
uytkownika i realizowa przetwarzanie zwizane z obsug klienckiej czci aplikacji.
Bardzo popularny przykad obiektw biznesowych mona spotka na witrynach zajmujcych si
handlem elektronicznym, ktre musz pobiera informacje o kosztach wysyki od rnych firm
przewozowych. Programista mgby zaimplementowa t logik w formie strony ASP.NET, lecz
w takim przypadku, modyfikacja tej logiki w razie zmiany sposobu obliczania kosztw wysyki
byaby znacznie utrudniona (nie wspominajc w ogle, o znacznie ograniczonych moliwociach
wielokrotnego wykorzystania takiego kodu). Sprytniejszy programista mgby natomiast stworzy
obiekt obliczajcy koszty wysyki towarw, ktry mona by wykorzystywa w dowolnych
aplikacjach ASP.NET. Komponent ten pobieraby informacje o kosztach wysyki z bazy danych
firmy przewozowej i dostarcza aplikacji internetowej wszelkich koniecznych informacji.
Komponent taki mona by wielokrotnie wykorzystywa, a jakiekolwiek zmiany logiki biznesowej
musiayby by wprowadzane tylko w jednym miejscu, bez koniecznoci modyfikowania stron
ASP.NET.

Dlaczego warto uywa komponentw?


By moe syszae o trjwarstwowym modelu aplikacji, w ktrym aplikacje s dzielone na trzy
(czasami niezbyt rozdzielne) warstwy prezentacji lub interfejsu uytkownika, logiki biznesowej
oraz danych. Model ten z powodzeniem mona wykorzysta przy tworzeniu aplikacji
internetowych, a jego implementacja nie nastrcza zbyt wielu problemw. Trjwarstwowy model
aplikacji zosta przedstawiony na rysunku 15.1.

Rysunek 15.1. Trjwarstwowy model aplikacji skada si z warstwy interfejsu uytkownika,


logiki biznesowej oraz danych
Opis rysunku
UI layer Warstwa interfejsu uytkownika
ASP.NET pages Strony ASP.NET, elementy sterujce uytkownika, itp.
Bisiness objects Warstwa obiektw biznesowych
Business rules Reguy biznesowe (logika biznesowa), pomocnicze moliwoci funkcjonalne,
itp.
Data layer Warstwa danych
Database Baza danych, procedury zachowane, itp.

Trjwarstwowy model aplikacji przypomina nieco produkcj teatraln. Pierwsz warstw s


aktorzy wystpujcy na scenie. Stanowi oni interfejs uytkownika dla widzw siedzcych na
widowni, przycigajc ich uwag i dostarczajc wrae. Z t warstw aplikacji maj kontakt
widzowie ogldajcy przedstawienie.
Drug warstw stanowi osoby odpowiedzialne za produkcj przedstawienia i pomoc przy jego
realizacji orkiestra, osoby obsugujce scenografi, itp. Wszystkie te osoby prowadz interakcj
z aktorami wystpujcymi na scenie, jednak pozostaj niewidoczni dla publicznoci. Osoby te
kieruj wykonaniem przedstawienia i dziki nim aktorzy mog odtwarza swoje role.
I w kocu trzeci warstw stanowi osoby odpowiedzialne za materia i scenografi pisarze,
artyci, scenografowie, i tak dalej. Wszystkie te osoby pracuj wsplnie, aby nada produkcji
znaczenie. Publiczno nigdy ich nie widzi, dostrzega jedynie efekty ich pracy.
Ten model realizacji przedstawie jest doskonale zdefiniowany i dostosowany do konkretnych
potrzeb. Wyobra sobie co by si stao gdyby zabrako jednej z jego warstw. Bez aktorw, w
ogle nie mona by wystawi adnego przedstawienia. Bez pisarzy i artystw nie byoby czego
wystawia. Natomiast bez warstwy poredniej na przykad scenografw aktorzy mieliby
bardzo due trudnoci z wykonywaniem swej pracy, a osoby zaliczajce si do innej warstwy
musiayby zaj ich miejsce.
Ten sam model mona zastosowa przy tworzeniu aplikacji internetowych. Pominicie jednej z
warstw sprawa, e stworzenie aplikacji staje si o wiele trudniejsze. W przypadku witryn
zajmujcych si handlem elektronicznym, pierwsz warstw jest interfejs uytkownika
formularze, koszyki, obrazy, itp. Porednia warstwa logiki biznesowej skada si z
mechanizmw okrelajcych ceny towarw, koszty wysyki, itd. I w kocu trzecia warstwa
warstwa danych skada si z listy towarw przechowywanych w bazie danych. Jeli
ktrejkolwiek z tych warstw zabraknie, inna bdzie musiaa przej jej funkcje.
Rozpatrujc cae zagadnienie bardziej konkretnie, wykorzystanie obiektw biznesowych jako
warstwy poredniej pozwala na lepsz separacj kodu oraz lepsze zdefiniowanie aplikacji. Dziki
nim, strony ASP.NET nie musz ju zawiera tajemniczego, dugiego kodu, ktry w aden sposb
nie jest zwizany z interfejsem uytkownika. Przeznaczeniem tych stron jest wizualne
przedstawianie informacji i przycignicie uwagi uytkownika. Po co zatem umieszcza w nich
kod, ktry z wizualn prezentacj informacji nie ma niczego wsplnego?
W porzdku, wanie tym zajmowalimy si w kilku ostatnich rozdziaach ksiki. Moliwoci
funkcjonalne, takie jak mechanizmy zapewniajce dostp do baz danych mona umieci w
obiektach biznesowych zaliczanych do rodkowej warstwy aplikacji. Jednak w wielu spord
przedstawianych przykadw, wykorzystywane moliwoci funkcjonalne byy tak proste, i nie
trzeba byo implementowa ich jako trzeciej warstwy i niepotrzebnie komplikowa konstrukcji
caej aplikacji. Obiekty biznesowe doskonale nadaj si implementacji moliwoci
funkcjonalnych, ktre nie maj niczego wsplnego z interfejsem uytkownika. Niemniej jednak to
Ty jako programista, musisz okreli czy aplikacja jest na tyle skomplikowana, aby warto byo
wprowadza do niej trzeci warstw. Komponenty zapewniaj take znacznie efektywniejszy
sposb wykorzystania moliwoci funkcjonalnych. Na przykad, przypomnij sobie kalendarz,
przedstawiony w rozdziale 5, pt.: Podstawowe wiadomoci o tworzeniu formularzy
internetowych. Przy uyciu zaledwie kilku wierszy kodu, pozwala on na wywietlenie w peni
funkcjonalnego kalendarza dostosowanego do wygldu tworzonej aplikacji. Twrca strony nie
musi si przejmowa sposobem generacji kalendarza, wywietlaniem poszczeglnych tygodni,
okrelaniem iloci dni w miesicu, itp. Wszystkie te czynnoci s wykonywane za nas.
Komponenty naley tworzy wanie w taki sposb tak, aby uywajcy ich programici nie
musieli zaprzta sobie gowy niewidocznymi sposobami dziaania komponentu. Wystarczy, e
bd ich uywa. Nawet jeli si zdarzy, e uytkownik komponentu oraz jego twrca to ta sama
osoba (czyli Ty), to wci komponenty s atwym sposobem implementacji moliwoci
funkcjonalnych.
Nie naley take zapomina o oczywistych korzyciach jakie daje stosowanie komponentw.
Dziki nim wzrasta moliwo wielokrotnego wykorzystywania tego samego kodu, dziki czemu
aplikacje s mniejsze. Kompilacja komponentw niezalenie od stron ASP.NET zwiksza
efektywno dziaania tych stron. atwiejsza jest take pielgnacja aplikacji zmiana logiki
biznesowej w jednym miejscu bdzie od razu zauwaalna w caej aplikacji. A co wicej, tworzone
komponenty s elementami rodowiska .NET, co oznacza, e w razie koniecznoci mona je
rozbudowywa lub uywa przy tworzeniu innych komponentw.
Niemniej jednak, zdarza si, e wydzielenie poszczeglnych warstw aplikacji nie jest spraw
oczywist. W jakim miejscu naley przeprowadzi lini podziau pomidzy interfejsem
uytkownika, a logik biznesow? To pytanie programici zadaj ju od jakiego czasu. Przykady
podane w tym rozdziale maj za zadanie, w moliwie najwikszym stopniu, pokaza jak naley
rozdziela obie warstwy. Czasami jednak, zaley to wycznie od oceny programisty.

W jaki sposb ASP.NET korzysta z komponentw


ASP.NET przechowuje skompilowane obiekty w folderze /bin, nazywanym take pamici
podrczn komponentw. Gdy czytajc ten rozdzia stworzysz przykadowe komponenty, to po ich
skompilowaniu, umiecisz je wanie w tym folderze. Obiekty zapisane w tym folderze s
automatycznie adowane podczas uruchamiania aplikacji ASP.NET. Wanie dziki temu bdziesz
mg uywa wasnych komponentw w tworzonych stronach ASP.NET.
Istnieje take moliwo rcznego zaadowania obiektw, ktre nie s przechowywane w folderze
/bin. W tym celu wykorzystywany jest plik konfiguracyjny web.config, jednak zagadnienia te
wykraczaj poza ramy tematyczne niniejszej ksiki. W wikszoci przypadkw, wszystkie
argumenty bd przemawiay za tym, aby wasne obiekty przechowywa w folderze /bin.
Po zaadowaniu wasnych obiektw, mona z nich korzysta tak samo, jak z wbudowanych
obiektw ASP.NET. Na przykad, przestrze nazw System oraz wszystkie dostpne w niej klasy
zostay skompilowane w formie jednego pliku, przechowywanego w globalnej pamici podrcznej
komponentw. Podczas tworzenia stron ASP.NET mona zaimportowa przestrze nazw System,
bd te odwoywa si do klas za pomoc penych nazw, na przykad: System.Integer. Jak si
przekonasz w dalszej czci rozdziau, dokadnie w taki sam sposb mona korzysta z wasnych
obiektw.

Tworzenie obiektw biznesowych


Tworzenie obiektw biznesowych do zudzenia przypomina tworzenie kodu obsugi formularzy.
Obiekty takie to po prostu klasy stworzone w jzyku VB.NET (lub innym jzyku ktrym potrafisz
si posugiwa) i zorganizowane w logiczne grupy.
Ale nie marnujmy czasu i zabierzmy si w kocu za stworzenie przykadowego obiektu
biznesowego. Oglny szablon takiego obiektu przedstawiony zosta na listingu 15.1.

Listing 15.1. Podstawowa struktura obiektw biznesowych.


1 Imports System
2 Imports System.Data
3 Imports System.Data.OleDb
4
5 Namespace TYASPNET
6
7 Public Class Database
8 End Class
9
10 End Namespace
Analiza
Zapisz ten plik pod nazw Database.vb. Ten obiekt biznesowy zapewni nam oglne moliwoci
funkcjonalne zwizane z obsug baz danych, z ktrych bdziemy korzysta przy tworzeniu stron
ASP.NET. Za porednictwem tego obiektu bdziemy mogli nawiza poczenie z baz danych,
wykona zapytanie oraz pobra uzyskane wyniki. Innymi sowy obiekt reprezentuje baz danych i
powinien mie wszystkie waciwoci i metody ktre definiuj tak baz.
Posta powyszego przykadu przypomina format zapisu kodu obsugi formularzy. W pierwszej
kolejnoci s importowane przestrzenie nazw, ktre bd wykorzystywane w tworzonym obiekcie.
W tym przypadku s to przestrzenie System, System.Data oraz System.Data.OleDb
(importowane odpowiednio w wierszach 1., 2. oraz 3.). W wierszu 5. definiowana jest przestrze
nazw do ktrej bdzie nalee tworzony obiekt. Skd pochodzi nazwa ASPNETDK? Znikd
utworzylimy j wanie w tej chwili. Na tym przykadzie wida jak atwo mona rozszerza
rodowisko .NET sama deklaracja uycia nowej przestrzeni nazw powoduje jej automatyczne
utworzenie. Tworzc nowe obiekty na potrzeby aplikacji mona je dodawa do tej samej
przestrzeni nazw. A zatem, przestrze nazw stanowi logiczn grup, zawierajc wszystkie
wykorzystywane obiekty biznesowe.

Notatka
Na przykad, przestrze nazw System.Data.OleDb zawiera wiele klas, takich jak
OleDbCommand, OleDbConnection czy te OleDbDataAdapter. Jak wida, przestrzenie
nazw s uywane do logicznego grupowania klas.

Gdybymy chcieli, moglibymy take poda nazw ju istniejcej przestrzeni nazw, na przykad
System.Web. W takim przypadku tworzony obiekt zostaby dodany do tej przestrzeni. Naley
jednak pamita, i przestrzenie nazw su do logicznego grupowania obiektw. Nasze
przykadowe obiekty nie pasuj do adnej z istniejcych przestrzeni, a zatem powinnimy je
umieci w nowej, stworzonej specjalnie dla nich. Mona tworzy osobne przestrzenie nazw dla
poszczeglnych tworzonych aplikacji ASP.NET.

Tak Nie
Umieszczaj obiekty tworzone na potrzeby Nie umieszczaj wasnych obiektw w
aplikacji ASP.NET w unikalnych przestrzeniach predefiniowanych przestrzeniach nazw, moe to
nazw. bowiem wprowadzi zamieszanie i spowodowa
niepotrzebne problemy.

I w kocu, w 7. wierszu listingu 15.1, zostaa umieszczona deklaracja klasy. Na razie jest ona
pusta, jednak ju wkrtce dodamy do niej waciwoci i metody. Nie naley take zapomnie o
dopisaniu instrukcji zamykajcych deklaracj klasy oraz przestrzeni nazw.

Skompilujmy nasz przykadowy obiekt biznesowy, abymy mogli go uy w stronie ASP.NET. W


tym celu wykorzystamy kompilator jzyka VB.NET dostarczany wraz z .NET SDK. Aby uy
kompilatora kliknij przycisk Start i wybierz opcj Uruchom. Nastpnie, w wywietlonym okienku
dialogowym wpisz cmd.exe i kliknij przycisk OK na ekranie pojawi si okno interpretera
polece. Pierwsz czynnoci jak bdziesz musia teraz wykona, jest przejcie do gwnego
folderu aplikacji (w naszym przypadku jest to C:\inetpub\wwwroot\aspnetdlakazdego) i
utworzenie folderu bin. W tym celu naley wyda polecenie:
mkdir bin

Za chwil w tym folderze umiecimy nasz przykadowy obiekt biznesowy. Teraz przejd do
folderu w ktrym zapisae kod rdowy tworzonego obiektu, na przykad:
C:\inetpub\wwwroot\aspnetdlakazdego\rozdzial15. Nastpnie wpisz ponisze polecenie i nacinij
klawisz Enter:
vbc /t:library /out:..\bin\ASPNETDK.dll /r:System.dll /r:System.Data.dll
Database.vb

Kompilator jzyka VB.NET ma wiele opcji i jest bardzo skomplikowany; dlatego te omwimy tu
wycznie opcje uyte w powyszym poleceniu. (Istnieje due prawdopodobiestwo, e piszc
aplikacje ASP.NET nie bdziesz musia uywa adnych innych opcji.)
vbc.exe to nazwa kompilatora jzyka VB.NET. Program ten posuy nam do skompilowania
naszego przykadowego obiektu biznesowego do postaci biblioteki DLL, ktra bdzie
wykorzystywana w aplikacji ASP.NET. Parametr /t okrela typ wynikowego pliku, ktry ma
zosta utworzony. Library oznacza, e utworzony zostanie obiekt, ktry bdzie mg by
wykorzystywany przez inne aplikacje, ale nie samodzielnie jak inne programy. Parametrowi /t
mona take przypisa warto exe, co spowoduje wygenerowanie standardowego pliku
wykonywalnego.
Parametr /out okrela folder oraz nazw pliku, w ktrym zostan zapisane wyniki dziaania
kompilatora. W naszym przypadku, wygenerowana biblioteka DLL ma zosta umieszczona w
folderze /bin, a zatem, w parametrze /out podalimy wzgldn ciek dostpu do tego folderu
oraz nazw wynikowego pliku. Parametr /r oznacza odwoanie. W naszym przykadowym
obiekcie biznesowym odwoujemy si do trzech przestrzeni nazw System, System.Data oraz
System.Data.OleDb. Przestrze nazw System zostaa zapisana w pliku System.dll, natomiast
pozostae dwie przestrzenie System.Data oraz System.Data.OleDb w pliku
System.Data.dll.

Ostrzeenie
Pamitaj, aby okrela odwoania w poleceniu uruchamiajcym kompilator a nie ogranicza si
do instrukcji Import w kodzie rdowym programw. Bez tych odwoa, polecenia Import nie
bd miay adnego znaczenia, a przy prbie kompilacji pliku pojawi si bdy.

Ostatnim elementem powyszego polecenia jest nazwa kompilowanego pliku Database.vb. To


wanie ten plik zostanie skompilowany i umieszczony w pamici podrcznej komponentw, gdzie
bdzie dostpny dla tworzonych stron ASP.NET. Wyniki kompilacji kodu z listingu 15.1 zostay
przedstawione na rysunku 15.2.

Rysunek 15.2. Uycie kompilatora jzyka VB.NET do tworzenia obiektw biznesowych


Notatka
Nie przejmuj si, jeli nie jeste w stanie wprawnie posugiwa si kompilatorem VB.NET.
Zazwyczaj bdziesz musia posugiwa si jednym i tym samym poleceniem, a jeli jego
skadnia bdzie musiaa ulec zmianie wyranie zaznacz to w tekcie. Wicej informacji na
temat tego programu znajdziesz w dokumentacji .NET SDK.

Na listingu 15.2 przedstawiony zosta kod strony, ktra bdzie korzysta z naszego przykadowego
obiektu biznesowego.

Listing 15.2. Wykorzystanie obiektu biznesowego na stronie ASP.NET.


1 <%@ Page Language="VB" %>
2
3 <script runat="server">
4 sub Page_Load(obj as object, e as eventargs)
5 dim objDatabase as ASPNETDK.Database
6 lblMessage.Text = "Obiekt zosta pomylnie utworzony!"
7 end sub
8
9 </script>
10
11 <html><body>
12 <asp:Label id="lblMessage" runat="server" />
13 </body></html>

Analiza
W wierszu 5. deklarowany jest nowy obiekt, bazujcy na stworzonym przed chwil obiekcie
biznesowym. Jak na razie obiektu tego nie mona w aden sposb wykorzysta, gdy nie
implementuje on adnych metod ani waciwoci; zostan one dodane w kolejnej czci rozdziau,
pod tytuem Implementacja obiektw biznesowych.
Warto zwrci uwag, i przy tworzeniu obiektu zostaa uyta jego pena nazwa
ASPNETDK.Database. Mona by take uy samej nazwy klasy Database wymagao by
to jedynie zaimportowania stworzonej przez nas przestrzeni nazw. W tym celu naleao by uy
dyrektywy Import, podobnie jak przy importowaniu wszelkich innych przestrzeni nazw.
Przykadowo zamy, e w 2. wierszu powyszego kodu zostaa dodana nastpujca dyrektywa:
<%@ Import Namespace="ASPNETDK" %>

W takim przypadku instrukcj tworzc nowy obiekt mona by zapisa w postaci:


dim objDatabase as new Database

Dlaczego konieczna jest kompilacja obiektu?


A do momentu kompilacji, proces tworzenia naszego przykadowego obiektu biznesowego by
niezwykle podobny do sposobu tworzenia kodu obsugi formularzy. A jednak kodu obsugi
formularzy nie trzeba byo kompilowa. Dlaczego zatem konieczna jest kompilacja kodu
rdowego obiektw biznesowych?
Kod obsugi formularzy jest kas ASP.NET zawierajc kod, ktry definiuje specyficzne
moliwoci funkcjonalne i z tego wzgldu moe by wykorzystywany wycznie na konkretnej
stronie ASP.NET. Klasa ta nie bdzie wykorzystywana przez adn inn aplikacj, a bardzo czsto
nawet przez adne inne strony ASP.NET. W momencie nadesania dania dotyczcego strony
ASP.NET kompilowany jest zarwno kod strony jak i kod obsugi formularza. Nastpnie, metody
i waciwoci kodu obsugi formularza s wykorzystywane przez stron ASP.NET. Jak zatem
wida, w rzeczywistoci kod obsugi formularzy te jest kompilowany.
Natomiast obiekty biznesowe z zaoenia s wykorzystywane w wielu rnych miejscach i nie
nale do adnej konkretnej strony ASP.NET. Obiekty te nie musz take zawiera kodu
sucego do interakcji z ASP.NET. Obiekty te bd wykorzystywane w wielu miejscach
aplikacji, a moe nawet w kilku rnych aplikacjach. Na przykad, nasz przykadowy obiekt
Database bdzie wykorzystywany w wielu rnych miejscach. Cay kod musi zosta
skompilowany nim bdzie go mona uy, a zatem bdziemy musieli zawczasu skompilowa nasz
obiekt biznesowy, gdy nie jest on skojarzony z adn konkretn stron ASP.NET.
Mona take zawczasu kompilowa kod obsugi formularza i wykorzystywa go w stronach
ASP.NET jako obiekt biznesowy, ale dlaczego mielibymy utrudnia sobie ycie? Kod obsugi
formularza bdzie wykorzystywany tylko w jednym miejscu i tak czy inaczej zostanie
skompilowany. A zatem nie ma adnego powodu, aby wczeniej kompilowa go rcznie.

Implementacja obiektw biznesowych


Wrmy do naszego przykadowego obiektu biznesowego z listingu 15.1. i dodajmy do niego
jakie moliwoci funkcjonalne. Poniewa obiekt ten ma reprezentowa baz danych, pierwsz
rzecz jaka bdzie w nim potrzebna jest waciwo okrelajca acuch poczenia. Waciwo
ta zostanie zaimplementowana w klasie Database, jak pokazano na listingu 15.3.

Listing 15.3. Waciwo okrelajca acuch poczenia.


1 Imports System
2 Imports System.Data
3 Imports System.Data.OleDb
4
5 Namespace ASPNETDK
6
7 Public Class Database
8 public ConnectionString as String
9 private objConn as OleDbConnection
10 private objCmd as OleDbCommand
11

Kada strona wykorzystujca ten obiekt biznesowy bdzie w stanie, w dowolnej chwili, okreli
oraz pobra acuch poczenia. Do kodu zostay take dodane dwie prywatne zmienne
reprezentujce obiekty bazy danych. Poniewa s to zmienne prywatne, bd one dostpne dla
metod klasy Database, jednak nie poza nimi. Innymi sowy, strona ASP.NET wykorzystujca ten
obiekt biznesowy nie bdzie w stanie uzyska do nich dostpu; bdzie natomiast miaa dostp do
publicznej zmiennej ConnectionString.

Podpowied
Moesz wyobrazi sobie klas jako silnik samochodu. Wszystkie prywatne elementy klasy s
ukryte wewntrz silnika i nie mona ich zobaczy z zewntrz. Zapewne wiesz, e wewntrz
silnika znajduj si cylindry i toki, lecz nie moesz ich zobaczy ani dotkn (chyba e
rozbierzesz silnik na czci, ale to ju zupenie inna sprawa). Z drugiej strony, publiczne
elementy klasy s dostpne dla wiata zewntrznego. W prawdziwym silniku takimi
elementami s na przykad: prtowy wskanik poziomu oleju, gniazda do wkrcania wiec czy
te filtr powietrza.

Kolejnym elementem, ktry bdzie nam potrzebny, s metody pobierajce informacje z bazy
danych. Nasz przykadowy obiekt biznesowy zostanie wyposaony w metod, ktra wykona
podane zapytania SQL i zwrci uzyskane wyniki w formie obiektu OleDbDataReader. Przyda
si nam take metoda, ktra pozwoli na wykonywanie operacji na bazie danych, lecz nie bdzie
zwraca adnych wynikw. Dziki niej, bdzie mona wykonywa, na przykad, polecenia SQL
Insert oraz Update. Na listingu 15.4. przedstawione zostay dwie metody suce do
wykonywania zapyta SQL, pierwsza z nich zwraca dane, a druga nie.

Listing 15.4. Metody klasy Database suce do wykonywania polece SQL.


12 public function SelectSQL(strSelect as string) as _
13 OleDbDataReader
14 try
15 objConn = new OleDbConnection(ConnectionString)
16 objCmd = new OleDbCommand(strSelect, objConn)
17 objCmd.Connection.Open
18 return objCmd.ExecuteReader
19 objCmd.Connection.Close()
20 catch ex as OleDbException
21 return nothing
22 end try
23 end function
24
25 public function ExecuteNonQuery(strQuery as string) as _
26 Boolean
27 try
28 objConn = new OleDbConnection(ConnectionString)
29 objCmd = new OleDbCommand(strQuery, objConn)
30 objCmd.Connection.Open()
31 objCmd.ExecuteNonQuery
32 objCmd.Connection.Close()
33 return true
34 catch ex as OleDbException
35 return false
36 end try
37 end function
38
39 End Class
40
41 End Namespace

Metoda SelectSQL jest zupenie standardowa. Otwiera ona poczenie przy wykorzystaniu
obiektu OleDbCommand, wykonuje zapytanie, po czym zwraca wyniki w formie obiektu
OleDbDataReader (patrz wiersz 18.). W wierszu 19. zamykane jest poczenie z baz danych.
Jeli w trakcie wykonywania metody cokolwiek pjdzie nie tak jak naley, to blok try
przechwyci zgaszane bdy i zwrci warto nothing.
Metoda ExecuteNonQuery jest bardzo podobna, lecz nie zwraca obiektu OleDbDataReader.
Zamiast tego zwracana jest warto logiczna true bd false okrelajca czy polecenie SQL
zostao wykonane poprawnie czy nie.
Ponownie skompiluj kod rdowy naszego obiektu biznesowego posugujc si tym samym
poleceniem co poprzednio:
vbc /t:library /out:..\bin\ASPNETDK.dll /r:System.dll /r:System.Data.dll
Database.vb

A teraz zmodyfikujmy przykadow stron ASP.NET wykorzystujc ten obiekt biznesowy. Na


listingu 15.5. przedstawiony zosta zmodyfikowany kod strony. Jak wida posuguje si ona
waciwoci ConnectionString oraz metod SelectSQL obiektu Database i wywietla
wyniki przy uyciu elementu sterujcego DataGrid.

Listing 15.5. Wykorzystanie metod i waciwoci obiektu biznesowego.


1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Data" %>
3 <%@ Import Namespace="System.Data.OleDb" %>
4
5 <script runat="server">
6 sub Page_Load(obj as object, e as eventargs)
7 dim objDatabase as new ASPNETDK.Database
8
9 objDatabase.ConnectionString = "Provider=" & _
10 "Microsoft.Jet.OLEDB.4.0;" & _
11 "Data Source=C:\ASPNET\data\banking.mdb"
12
13 dim objReader as OleDbDataReader
14 objReader = objDatabase.SelectSQL _
15 ("Select * from tblUsers")
16
17 if not objReader is nothing then
18 DataGrid1.DataSource = objReader
19 DataGrid1.DataBind()
20 objReader.Close
21 end if
22 end sub
23
24 </script>
25
26 <html><body>
27 <asp:Label id="lblMessage" runat="server" />
28
29 <asp:DataGrid id="DataGrid1"
30 runat="server" BorderColor="black"
31 GridLines="Vertical" cellpadding="4"
32 cellspacing="0" width="100%"
33 Font-Name="Arial" Font-Size="8pt"
34 HeaderStyle-BackColor="#cccc99"
35 ItemStyle-BackColor="#ffffff"
36 AlternatingItemStyle-Backcolor="#cccccc" />
37 </body></html>

Analiza
W wierszu 7. powyszego przykadu deklarowany jest obiekt Database, a w wierszu 9. okrelana
warto waciwoci ConnectionString. Nastpnie, w wierszu 14. wywoywana jest metoda
SelectSQL przedstawiona na listingu 15.4. Metoda ta pobiera wyniki z bazy danych i zwraca je w
formie obiektu OleDbDataReader.
Pamitasz zapewne, e w przypadku wystpienia jakichkolwiek bdw, metoda SelectSQL
zwraca warto nothing. Dlatego, zanim w jakikolwiek sposb wykorzystamy obiekt czytelnika
(OleDbDataReader), musimy sprawdzi, czy w ogle dysponujemy jakimikolwiek danymi. Jeli
informacje zostay poprawnie pobrane z bazy danych, s one wizane z elementem sterujcym
DataGrid (patrz wiersz 19.), po czym obiekt czytelnika jest zamykany (w wierszu 20.). Wyniki
wykonania powyszej strony zostay przedstawione na rysunku 15.3.

Rysunek 15.3. Przykadowy obiekt biznesowy zwraca dane, ktre mona wykorzysta na
stronie ASP.NET

Notatka !!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Wykorzystania stworzonego przez nas obiektu Database niczym si nie rni od sposobw
uycia wszystkich innych obiektw stosowanych do tej pory przy tworzeniu stron ASP.NET. W
standardowy sposb tworzona jest nowa kopia obiektu, okrelane wartoci jego waciwoci i
wywoywane metody.
By moe zastanawiasz si dlaczego wykonalimy t ca prac tylko i wycznie po to, by
zaoszczdzi kilka wierszy kodu w stronie ASP.NET. W przypadku prostych stron, takich jak
nasza, tworzenie obiektu biznesowego w celu wykonania zapytania SQL i pobrania wynikw z
bazy danych nie jest konieczne. Jednak gdy Twoje tworzone aplikacje bd znacznie wiksze,
obiekty biznesowe mog si sta znacznie bardziej skomplikowane. W tym przypadku
wykorzystanie tych obiektw przy tworzeniu stron ASP.NET moe zaoszczdzi bardzo wiele
czasu.
Poza tym nasz przykadowy obiekt biznesowy moe zosta wykorzystany na dowolnej stronie
ASP.NET. Mona w nim zmieni acuch zapytania, aby nawiza poczenie z inn baz danych
i poda inne zapytanie SQL, aby pobra zupenie nowe wyniki. Cho w przedstawionym
przykadzie wykorzystanie obiektu biznesowego przynioso korzyci w postaci skrcenia kodu
strony ASP.NET o do 10 do 15 wierszy, wyobra sobie ile mona by zyska gdyby w tworzonej
aplikacji byo 10 lub 20 takich stron.
Moesz si take zastanawia dlaczego stworzylimy obiekt biznesowy reprezentujcy baz
danych, jeli moglimy wykorzysta klasy OleDb. Czy nie mona byo stworzy czego bardziej
uytecznego? Ot w rzeczywistoci nasz obiekt biznesowy jest bardzo przydatny. Obiekt ten nie
tylko pozwala uytkownikom na pobieranie informacji z baz danych przy uyciu jednego wiersza
kodu, lecz take jednoczenie ukrywa ca zoono procesu wykorzystania bazy danych.
Uytkownik tego obiektu (w tym przypadku inny programista) nie musi si przejmowa
tworzeniem obiektu OleDbCommand ani nawizywaniem poczenia z baz. Nie musi zawraca
sobie gowy umieszczaniem instrukcji w bloku try, ani przechwytywaniem i obsug
ewentualnych bdw. Nasza klasa wykonuje wszystkie te czynnoci za uytkownikw obiektu
biznesowego. Na rysunku 15.4. zostaa przedstawiona rnica pomidzy tym co widzi uytkownik
obiektu, a faktycznie wykonywanymi czynnociami.

Rysunek 15.4. Programista widzi wycznie to na co pozwoli mu twrca obiektu biznesowego;


caa zoono implementacji zostaa przed nim ukryta
Opis rysunku
What the user doesnt see To czego uytkownik nie widzi
What the user sees To co uytkownik widzi
Object Obiekt
Properties Waciwoci
Methods Metody
ConnectionString, SelectSQL, ExecuteNonQuery bez zmian

try
objConn = new OleDbConnection(ConnectionString)
objCmd = new OleDbCommand(strSelect, objConn)
objCmd.Connection.Open
return objCmd.ExecuteReader
objCmd.Connection.Close()
catch ex as OleDbException
return nothing

Praktyczny przykad
Teraz, kiedy ju wiesz jak napisa prosty obiekt biznesowy, wykorzystajmy t wiedz do
stworzenia czego bardzie przydatnego. Wiele witryn posiada obszary dostpne wycznie dla
zarejestrowanych uytkownikw lub strony, ktrych zawarto zarejestrowani uytkownicy mog
dostosowywa do wasnych potrzeb. W takich witrynach warto wydzieli kod zwizany z obsug
zarejestrowanych uytkownikw. Wszystkie moliwoci funkcjonalne zwizane z obsug
uytkownikw, takie jak logowanie, uaktualnianie informacji o uytkowniku przechowywanych w
bazie danych i tak dalej, mona z atwoci zaimplementowa w postaci obiektu biznesowego.
W zasadzie obiekt ten bdzie reprezentowa uytkownika oglnego i powinien zawiera wszystkie
waciwoci i metody konieczne do penego opisania tego uytkownika. Powinien on take
zawiera metody suce do wykonywania operacji zwizanych z obsug uytkownikw, takich
jak dodawanie nowych, usuwanie niepotrzebnych uytkownikw oraz uwierzytelnianie
uytkownikw. Konkretnie rzecz biorc chcemy, aby obiekt ten zawiera:
obiekt reprezentujcy tosamo uytkownika, w tym jego imi i nazwisko, nazw
uytkownika, identyfikator, i tak dalej;
metody suce do dodawania nowych i usuwania starych uytkownikw oraz
aktualizacji danych uytkownikw;
metody umoliwiajce uwierzytelnianie uytkownikw.
Powysze moliwoci funkcjonalne zostan zaimplementowane jako dwie niezalene klasy.
Pierwsza z nich bdzie reprezentowa szczegowe informacje o uytkowniku, a druga udostpni
metody pozwalajce na wykonywanie opisanych wczeniej czynnoci zwizanych z obsug
uytkownikw. W ten sposb wszystkie dane uytkownika bd mogy by traktowane jako
odrbna, niezalena cao, na ktrej mona wykonywa jakie operacje. Wzajemne zalenoci
pomidzy tymi dwoma obiektami zostay przedstawione na rysunku 15.5.

Rysunek 15.5. Informacje na temat uytkownika bd przechowywane w obiektach klasy


UserDetail, natomiast wszelkie moliwoci funkcjonalne zwizane z obsug uytkownikw,
zostan zaimplementowane w klasie User
Opis rysunku
ASP.NET page Strona ASP.NET
UserDetails, User bez zmian
Firstname, Lastname Firstname, LastName, i tak dalej
Update data Aktualizacja danych
Retrieve data Pobranie danych
Login user Zalogowanie uytkownika, Pobranie informacji, i tak dalej
Database Baza danych

W przykadzie tym moesz wykorzysta baz danych uytkownikw stworzon w rozdziale 8, pt.:
Podstawowe wiadomoci na temat tworzenia baz danych. Pocztek kodu naszego nowego,
przykadowego obiektu biznesowego zosta przedstawiony na listingu 15.6.

Listing 15.6. Klasa UserDetails (User.vb).


1 Imports System
2 Imports System.Data
3 Imports System.Data.OleDb
4
5 Namespace TYASPNET
6
7 Public Class UserDetails
8 public FirstName as string
9 public LastName as string
10 public UserName as string
11 public Password as string
12 public UserID as string
13 End Class

Analiza
Zapisz powyszy fragment kodu w pliku User.vb. Jak wida rozpoczyna si on tak samo jak
obiekt biznesowy stworzony we wczeniejszej czci rozdziau. W wierszach od 1. do 3. s
importowane uywane przestrzenie nazw, a w wierszu 5. jest deklarowana przestrze nazw do
ktrej naley tworzony obiekt. Deklaracja klasy UserDetails zaczyna si w wierszu 7. i zawiera
wycznie waciwoci, ktre bd potrzebne do reprezentacji uytkownikw. (Odpowiadaj one
informacjom o uytkownikach przechowywanym w bazach danych; niektre z informacji
dostpnych w bazie zostay jednak pominite w celu uproszczenia naszego przykadu. Jeli chcesz
bdziesz je mg doda.)
Kolejn czci naszego obiektu biznesowego bdzie klasa User, implementujca potrzebne nam
moliwoci funkcjonalne. Jej kod zosta przedstawiony na listingu 15.7.

Listing 15.7. Klasa User (User.vb).


14 Public Class User
15 public function Login(UserName as string, Password as _
16 string) as string
17 dim intId as string = "0"
18 dim Conn as new OleDbConnection("Provider=" & _
19 "Microsoft.Jet.OLEDB.4.0;" & _
20 "Data Source=C:\ASPNET\data\banking.mdb")
21
22 dim objCmd as OleDbCommand = new OleDbCommand _
23 ("SELECT UserID FROM tblUsers WHERE " & _
24 "UserName = '" & UserName & "' AND " & _
25 "Password = '" & Password & "'", Conn)
26 dim objReader as OleDbDataReader
27
28 try
29 objCmd.Connection.Open()
30 objReader = objCmd.ExecuteReader
31
32 do while objReader.Read
33 intId = objReader.GetInt32(0).ToString
34 loop
35 catch ex as OleDbException
36 throw ex
37 end try
38
39 return intID
40 end function
41
42 public function GetDetails(UserID as integer) as _
43 UserDetails
44 dim Conn as new OleDbConnection("Provider=" & _
45 "Microsoft.Jet.OLEDB.4.0;" & _
46 "Data Source=C:\ASPNET\data\banking.mdb")
47
48 dim objCmd as OleDbCommand = new OleDbCommand _
49 ("SELECT FirstName, LastName, UserName, " & _
50 "Password FROM tblUsers WHERE UserID = " & _
51 UserID, Conn)
52 dim objReader as OleDbDataReader
53
54 try
55 objCmd.Connection.Open()
56 objReader = objCmd.ExecuteReader
57 catch ex as OleDbException
58 throw ex
59 end try
60
61 dim objDetails as new UserDetails
62
63 while objReader.Read()
64 objDetails.FirstName = objReader.GetString(0)
65 objDetails.LastName = objReader.GetString(1)
66 objDetails.UserName = objReader.GetString(2)
67 objDetails.Password = objReader.GetString(3)
68 objDetails.UserID = UserID.ToString
69 end while
70 objReader.Close
71
72 return objDetails
73 end function
74
75 public function Update(objDetails as UserDetails, _
76 intUserID as integer) as boolean
77 dim objOldDetails as new UserDetails
78 objOldDetails = GetDetails(intUserID)
79
80 with objDetails
81 if .FirstName = "" then
82 .FirstName = objOldDetails.FirstName
83 end if
84 if .LastName = "" then
85 .LastName = objOldDetails.LastName
86 end if
87 if .Username = "" then
88 .UserName = objOldDetails.UserName
89 end if
90 if .Password = "" then
91 .Password = objOldDetails.Password
92 end if
93 end with
94
95 dim Conn as new OleDbConnection("Provider=" & _
96 "Microsoft.Jet.OLEDB.4.0;" & _
97 "Data Source=C:\ASPNET\data\banking.mdb")
98
99 dim strSQL as string = "UPDATE tblUsers SET " & _
100 "FirstName = '" & objDetails.FirstName & "', " & _
101 "LastName = '" & objDetails.LastName & "', " & _
102 "UserName = '" & objDetails.UserName & "', " & _
103 "[Password] = '" & objDetails.Password & "' " & _
104 "WHERE UserID = " & intUserID
105 dim objCmd as OleDbCommand = new OleDbCommand _
106 (strSQL, Conn)
107
108 try
109 objCmd.Connection.Open()
110 objCmd.ExecuteNonQuery
111 catch ex as OleDbException
112 throw ex
113 finally
114 objCmd.Connection.Close
115 end try
116
117 return true
118 end function
119 End Class
120
121 End Namespace

Analiza
Jak wida klasa User jest cakiem spora, a powyszy kod nie zawiera jeszcze wszystkich metod
jakie maj si w niej znale. Na szczcie zrozumienie zasad dziaania metod tej klasy nie
powinno przysporzy Ci problemw i dlatego przeanalizujemy je dosy pobienie.
Metoda Login rozpoczynajca si w wierszu 15. pobiera nazw uytkownika i haso i porwnuje
je z informacjami zapisanymi w bazie danych. Jeli przekazane informacje reprezentuj
istniejcego uytkownika, metoda ta zwraca warto odpowiedniego pola UserID (czyli
identyfikator uytkownika).
Metoda GetDetails rozpoczynajca si w wierszu 42. pobiera identyfikator uytkownika
(UserID) i pobiera z bazy danych informacje na jego temat. W wierszu 61. tworzony jest nowy
obiekt klasy UserDetails. Metoda przypisuje waciwociom tego obiektu przypisywane
informacje pobrane z bazy danych, a nastpnie zwraca go jako wynik swego dziaania. Zapisujc
informacje o uytkowniku w publicznych waciwociach obiektu UserDetails, zapewniana jest
moliwo atwego dostpu do nich.
Metoda Update aktualizuje wiersz bazy danych zawierajcy informacje o konkretnym
uytkowniku. W wywoaniu tej metody przekazywany jest obiekt UserDetails zawierajcy
zaktualizowane dane dla kadej z waciwoci opisujcych uytkownika. Co si jednak dzieje jeli
trzeba zmieni tylko jedn warto? Nie chcemy, aby uytkownik musia podawa wszystkie
wartoci, jeli zmianie maj ulec tylko niektre z nich. Wanie z tego powodu, w obiekcie
przekazywanym w wywoaniu tej metody, mona poda tylko te waciwoci, ktre maj zosta
zmienione; metoda sam uzupeni pozostae waciwoci aktualnymi informacjami o uytkowniku.
Te moliwoci funkcjonalne zostay zaimplementowane w wierszach od 77. do 93.
Zmienna objOldDetails deklarowana w wierszu 77. przechowuje oryginalne informacje o
uytkowniku, ktre s pobierane z bazy danych przy uyciu metody GetDetails. Zapisana
poniej grupa instrukcji if sprawdza ktre z waciwoci opisujcych uytkownika nie zostay
podane i przypisuje im oryginalne wartoci. Po uzupenieniu informacji, na podstawie obiektu
objDetails mona ju utworzy zapytanie SQL bez obawy utracenia jakichkolwiek informacji.

Podpowied
Instrukcja With obiekt zapisana w wierszu 80. informuje, e wszystkie umieszczone
wewntrz niej odwoania do zmiennych poprzedzonych kropk, odnosz si do wskazanego
obiektu. Na przykad instrukcje

objDetails.FirstName = ""
objDetails.LastName = ""

oznaczaj dokadnie to samo co poniszy fragment kodu:

With objDetail
.FirstName = ""
.LastName = ""
end with

Wykorzystanie instrukcji With moe zaoszczdzi nieco pisania jeli naley poda wartoci
wielu waciwoci obiektu.

Tworzenie polecenia UPDATE SQL rozpoczyna si w wierszu 99., a samo polecenie wykonywane
jest wewntrz bloku try. Jeli aktualizacja danych przebiegnie pomylne, to metoda zwraca
warto true.
Kod przedstawiony na powyszym listingu dopisz do pliku User.vb. Gdy to zrobisz przejd do
odpowiedniego folderu i skompiluj obiekt posugujc si nastpujcym poleceniem:
vbc /t:library /out:..\bin\User.dll /r:System.dll /r:System.Data.dll
User.vb

Podpowied
Jeli chcesz, to nic nie stoi na przeszkodzie, aby wyniki kompilacji wielu rnych plikw
umieci w jednej bibliotece DLL. Na przykad:

vbc /t:library /out:..\bin\ASPNETDK.dll /r:System.dll /r:System.Data.dll


User.vb Database.vb

Powysze polecenie skompiluje zarwno plik z obiektem biznesowym sucym do obsugi bazy
danych jak rwnie obiekt biznesowy do obsugi uytkownikw, a wyniki kompilacji zapisze w
jednym pliku. Zarzdzanie jedn bibliotek DLL zawsze bdzie atwiejsze ni kilkoma. W
rzeczywistoci, zamiast podawa nazwy wszystkich plikw jakie maj wej w skad tworzonej
biblioteki DLL, mona posuy si znakami wieloznacznymi. Na przykad, ponisze polecenie
czy wszystkie pliki z rozszerzeniem .vb znajdujce si w biecym folderze i kompiluje je do
jednej biblioteki DLL:

vbc /t:library /out:..\bin\ASPNETDK.dll /r:System.dll


/r:System.Data.dll *.vb
Wydajc takie polecenie powiniene jednak mie pewno, e chcesz, aby wszystkie pliki .vb
znajdujce si w biecym folderze zostay skompilowane razem.

Listing 15.8. przedstawia stron ASP.NET wykorzystujc nasze nowe obiekty biznesowe
(zarwno User jak i UserDetails).

Listing 15.8. Wykorzystanie obiektw biznesowych.


1 <%@ Page Language="VB" %>
2
3 <script runat="server">
4 sub Page_Load(obj as object, e as eventargs)
5 if Not Page.IsPostBack then
6 dim objUser as new ASPNETDK.User
7 dim objDetails as new ASPNETDK.UserDetails
8
9 objDetails = objUser.GetDetails(1)
10 lblMessage.Text = "Witaj " & _
11 objDetails.FirstName & "!"
12 end if
13
14 end sub
15
16 sub Update(obj as object, e as eventargs)
17 dim objUser as new ASPNETDK.User
18 dim objDetails as new ASPNETDK.UserDetails
19
20 objDetails.FirstName = tbName.Text
21 if objUser.Update(objDetails, 1) then
22 objDetails = objUser.GetDetails(1)
23 lblMessage.Text = "Witaj " & _
24 objDetails.FirstName & "!"
25 else
26 lblMessage.Text = "Aktualizacja danych nie powioda si!"
27 end if
28 end sub
29 </script>
30
31 <html><body>
32 <form runat="server">
33 <asp:Label id="lblMessage" runat="server" /><p>
34 Zmieniasz imi?<br>
35 <asp:Textbox id="tbName" runat="server"/><br>
36 <asp:Button id="btSubmit" runat="server"
37 OnClick="Update" Text="Wylij" />
38 </form>
39 </body></html>

Gdy uytkownik po raz pierwszy wywietli t stron, zobaczy na niej wiadomo powitaln
wygenerowan dla uytkownika o identyfikatorze 1. W procedurze obsugi zdarzenia Page_Load
tworzone s dwa nowe obiekty, a metoda GetDetails pobiera z bazy informacje i zwraca obiekt
UserDetails. Nastpnie wywietlana jest prosta wiadomo powitalna.

Gdy uytkownik wpisze nowe imi w polu tekstowym i kliknie przycisk Wylij, wykonywana jest
procedura Update. Metoda ta tworzy nowy obiekt User oraz UserDetails, przypisuje podane
przez uytkownika imi waciwoci FirstName obiektu UserDetails, po czym wywouje
metod User.Update. Jeli aktualizacja danych zakoczy si pomylnie, to metoda
User.Update zwrci warto true i zostanie wygenerowana wiadomo powitalna dla nowego
imienia. Wyniki wykonania powyszej strony po zmianie imienia, zostay przedstawione na
rysunku 15.6.
Rysunek 15.6. Obiekty biznesowe manipuluj danymi uytkownika cho konieczny kod strony
ASP.NET zosta skrcony do zaledwie kilku wierszy

Teraz nasza strona ASP.NET jest bardzo krtka. Strona o takich samych moliwociach
funkcjonalnych, w ktrej nie byyby wykorzystywane obiekty biznesowe musiaaby by znacznie
dusza. Nasza strona zawiera teraz wycznie kod bezporednio zwizany z obsug interfejsu
uytkownika. Take wszystkie inne strony, na ktrych trzeba bdzie zaimplementowa te same
moliwoci funkcjonalne, nie bd ju musiay bezporednio uywa obiektw zwizanych z
obsug baz danych.
Wyobra sobie, co by si dziao jeli musielibymy doda now metod do obiektu User lub
zmieni struktur bazy danych. Jeli wszystkie te funkcje zostayby zaimplementowane na
wszystkich stronach ASP.NET ktre musiayby z nich korzysta, to jakakolwiek zmiana struktury
bazy danych pocignaby za sob konieczno zmiany wszystkich tych stron ASP.NET. Dziki
wykorzystaniu obiektu biznesowego wszystkie konieczne zmiany naley wprowadzi w jednym
pliku .vb i ponownie go skompilowa. Cay problem zostanie rozwizany bez koniecznoci
modyfikowania jakichkolwiek stron ASP.NET.

Podpowied
Zamiast od podstaw implementowa moliwoci funkcjonalne zwizane z obsug bazy danych
w obiekcie User, mona by take wykorzysta obiekt biznesowy Database stworzony we
wczeniejszej czci rozdziau. W takim przypadku, podczas kompilacji obiektu User
naleaoby si posuy nastpujcym poleceniem:

vbc /t:library /out:..\bin\User.dll /r:System.dll


/r:System.Data.dll /r:ASPNETDK.dll User.vb

Konkretnie rzecz biorc do wczeniej uywanego polecenia naley doda odwoanie do


biblioteki ASPNETDK.dll.
Kilka spraw jakie naley wzi pod uwag
Zauwa, i w pliku User.vb na stae podalimy kilka informacji, takich jak acuch poczenia z
baz danych. Informacje tego typu nie nale w zasadzie do obiektu biznesowego i naleao by
umieci je w osobnym pliku konfiguracyjnym, na przykad web.config. Obiekt biznesowy z
atwoci mgby odczyta taki acuch znakw przy wykorzystaniu metody GetConfig obiektu
klasy HttpContext (wicej informacji na ten temat znajdziesz w rozdziale 18., pt.: Konfiguracja
i wdraanie aplikacji ASP.NET). Dziki temu tworzone aplikacje mog by znacznie bardziej
elastyczne, gdy nie bd one wymagay ponownej rekompilacji w przypadku zmiany bazy
danych.
Sam fakt e obiekt biznesowy nie powinien by zaleny od uywanej bazy danych nie oznacza
wcale, e nie ma mie take adnej wiadomoci jaka baza jest uywana. Wykorzystanie w
obiekcie biznesowym polece SQL charakterystycznych dla danej bazy danych, nie jest niczym
zym, a w praktyce jest to bardzo czsto spotykane rozwizanie. Innymi sowy obiekt biznesowy
moe zalee od formatu wykorzystywanej bazy danych, lecz nie od jej pooenia.
Oczywicie, wszystkie wykorzystywane polecenia SQL mona take zaimplementowa w formie
procedur zachowanych. Dziki temu nasz obiekt biznesowy mgby przekazywa do nich
parametry. W takim przypadku, jeli tylko nazwy procedur pozostan takie same, to bdzie mona
dodawa do nich nowe moliwoci funkcjonalne bez koniecznoci modyfikacji kodu rdowego
obiektu biznesowego i jego ponownej kompilacji.
Tworzc obiekty biznesowe zawsze naley myle o logicznym rozdzieleniu moliwoci
funkcjonalnych. Dwa ostatnie obiekty reprezentoway uytkownika. Nie powinny one zawiera
adnego kodu wywietlajcego informacje na stronie, ani polece SQL zwracajcych dane.
Obiekty te powinny zawiera wycznie metody i waciwoci zwizane z obsug uytkownikw.
Taki sposb podejcia moe pomc przy projektowaniu aplikacji.
Nie naley rwnie prbowa implementowa zbyt wielu moliwoci funkcjonalnych w jednym
obiekcie biznesowym. Na przykad, na ostatnim przykadzie moge si przekona, e informacje
o uytkowniku mona w prosty i logiczny sposb oddzieli od metod zwizanych z obsug
uytkownika. A zatem, zamiast jednego obiektu dysponujcego wszystkimi moliwociami
funkcjonalnymi, mona stworzy dwa obiekty wzajemnie od siebie zalene.

Wykorzystanie komponentw stworzonych


poza rodowiskiem .NET
Przypomnij sobie, e kompilujc obiekty w rodowisku .NET, musz one wygenerowa opisujce
je metadane. Maszyna wirtualna CLR (Common Language Runtime) wykorzystuje te dane do
zaadowania obiektu bez jakiejkolwiek pomocy ze strony programisty. Wystarczy umieci obiekt
w folderze /bin i bez adnych problemw mona z niego korzysta.
Jednak wczeniejsze obiekty, ktre nie byy tworzone w rodowisku .NET (zazwyczaj okrelane
jako obiekty Component Object Model, lub w skrcie obiekty COM) nie dysponuj moliwoci
generacji metadanych. Wczeniej nie byo adnej wirtualnej maszyny CLR, ktra mogaby
zarzdza takimi obiektami i adowa je do pamici, ani adnych metadanych, ktre
poinformowayby wirtualn maszyn o fakcie istnienia obiektw. Programici musieli rcznie
rejestrowa komponenty przy wykorzystaniu programu REGSVR32.exe, ktry zapisywa
informacje o komponentach w Rejestrze systemu Windows (miejsca w ktrym gromadzone byy
wszelkie informacje na temat aplikacji i komponentw zainstalowanych na danym komputerze).

Notatka
Obiekty COM s starsze gdy technologia wykorzystywana do ich tworzenia jest starsza ni
technologia .NET a nie dlatego e same obiekty s starsze.
Obiekty COM nie byy tworzone w rodowisku .NET, a zatem CLR nie zarzdza nimi, dlatego te
s one czasami okrelane jako kod niezarzdzany (ang.: unmanaged code). Z podanych
powodw ASP.NET ma nieco wiksze problemy z okreleniem w jaki sposb naley korzysta z
tych obiektw. Jest to jednym z powodw dla ktrych nie mona okrela waciwoci obiektw
COM podczas projektowania programw.
ASP.NET wci pozwala na korzystanie z tych obiektw s one tworzone przy uyciu metody
CreateObject klasy HttpServerUtility. Metoda ta pobiera argument bdcy acuchem
znakw opisujcym pooenie obiektu w Rejestrze i wykorzystuje go do okrelenia waciwoci
obiektu. Ten szczeglny acuch znakw okrelany jest jako progId. Poniej przedstawiona
zostaa skadnia wywoania tej metody:
Server.CreateObject(progId)

Na przykad, w klasycznych stronach ASP operacje wejcia/wyjcia byy realizowane przy


wykorzystaniu obiektu FileSystemObject nalecego do biblioteki Scripting. Obiekt ten
udostpnia niemal te same moliwoci funkcjonalne co klasy omwione w rozdziale 13, pt.:
Odczytywanie i zapisywanie plikw na serwerze WWW. Aby uy tego obiektu na tworzonych
stronach ASP.NET naleaoby posuy si nastpujcym fragmentem kodu:
dim objFSO as object
objFSO = Server.CreateObject("Scripting.FileSystemObject")

Przykad przedstawiony na listingu 15.9 demonstruje w jaki sposb mona wywietli ciek
dostpu do pliku przy wykorzystaniu obiektu FileSystemObject.

Listing 15.9. Wykorzystanie obiektw COM.


1 <%@ Page Language="VB" %>
2
3 <script runat="server">
4 sub Page_Load(obj as object, e as eventargs)
5 dim objFSO, objFile
6 objFSO = Server.CreateObject _
7 ("Scripting.FileSystemObject")
8 objFile = objFSO.GetFile _
9 (Server.MapPath("../rozdzial13/log.txt"))
10
11 lblMessage.Text = objFile.Path
12 end sub
13 </script>
14
15 <html><body>
16 <asp:Label id="lblMessage" runat="server" />
17 </body></html>

Analiza
W powyszym przykadzie, w wierszach 6. i 8. tworzone s, odpowiednio, obiekty
Scripting.FileSystemObject oraz Scripting.File. Po utworzeniu, obiektw tych mona
uywa do wykonywania pewnych operacji wejcia/wyjcia, takich jak wywietlanie penej
cieki dostpu do pliku. Wyniki wykonania powyszej strony ASP.NET zostay przedstawione na
rysunku 15.7.
Rysunek 15.7. ASP.NET umoliwia wykorzystanie starszych obiektw COM

Jednak wykorzystanie obiektu FileSystemObject nie jest szczeglnie interesujce, gdy


rodowisko .NET udostpnia znacznie lepsze klasy, takie jak TextReader oraz TextWriter,
ktre s w peni obiektowe. W zasadzie, realne korzyci z moliwoci uycia obiektw COM w
rodowisku .NET odczuj wycznie programici, ktrzy dysponuj ju wieloma wasnymi
obiektami COM. Firmy posiadajce wasne witryny WWW bardzo czsto wykorzystyway kilka
obiektw COM w celu wykonywania tych samych czynnoci, do ktrych my wykorzystalimy w
tym rozdziale obiektw biznesowych. Postawienie tych wszystkich firm wobec koniecznoci
przepisania tych wszystkich obiektw COM i zamienienia je na obiekty biznesowe rodowiska
.NET, byoby koszmarn strat czasu.
Take wiele aplikacji udostpnia swoje moliwoci funkcjonalne pod postaci obiektw COM. Na
przykad, dziki metodom udostpnianym przez program Microsoft Word mona tworzy i
operowa na jego dokumentach z poziomu stron ASP.NET. Wszystkie obiekty COM udostpniane
przez ten program s przykadami kodu niezarzdzanego. Niemniej jednak w adnym stopniu nie
ogranicza to naszych moliwoci wykorzystania tych obiektw w rodowisku .NET.

Nowe okrelenie
Wykorzystanie obiektw COM na jednak pewn wad. Obiekty te nie dysponuj adnymi
metadanymi ktre by je opisyway, dlatego te ASP.NET ma wicej problemw z okreleniem
typw danych jakie obiekty te pobieraj i zwracaj, i dlatego bardzo czsto koniecznej jest
stosowanie konwersji typw. Proces ten okrelany jest mianem szeregowania1 (ang.: marshaling).
Szeregowanie, ze wzgldu na konieczno wykonywania dodatkowych operacji, pogarsza
efektywno dziaania aplikacji; z tego wzgldu naley unika stosowania obiektw COM.
Na szczcie rodowisko .NET zostao wyposaone w program narzdziowy, ktry suy do
konwersji obiektw COM do obiektw .NET. Program ten, nazywany importerem biblioteki
typw (ang.: Type Library Importer), analizuje obiekty COM i tworzy odpowiednie metadane
pozwalajc na atwiejsze wykorzystanie tych obiektw w aplikacjach ASP.NET. Pogram ten nosi
nazw tlbimp.exe.
Przykadowo zamy, e w naszych stronach ASP.NET chcielibymy wykorzysta obiekt
FileSytemObject, lecz nie mamy ochoty niepotrzebnie zmniejsza efektywnoci dziaania
aplikacji, ze wzgldu na konieczno wykonywania procesu szeregowania. Obiekt
FileSytemObject jest umieszczony w bibliotece scrrun.dll, ktra zazwyczaj jest
przechowywana w folderze c:\winnet\sytsem32. Otwrz okno wiersza polece i przejd do tego
folderu. Nastpnie wpisz ponisze polecenie:

1
Konkretnie rzecz biorc proces ten polega na konwersji typw danych, przekazywanych pomidzy
granicami dwch rnych procesw.
tlbimp scrrun.dll /out:scrrun_net.dll

Polecenie to utworzy now bibliotek o nazwie scrrun_net.dll bazujc na bibliotece COM o


nazwie scrrun.dll. Komunikaty wywietlane w oknie wiersza polece, powinny przypomina te,
przedstawione na rysunku 15.8.

Rysunek 15.8. Program tlbimp.exe importuje obiekty COM do rodowiska .NET

Skopiuj ten plik do pamici podrcznej komponentw .NET


(c:\inetpub\wwwroot\aspnetdlakazdego\bin). Teraz moemy zmodyfikowa kod z listingu 15.9 i
wykorzysta w nim now wersj obiektu FileSystemObject. Zmodyfikowana wersja kodu
zostaa przedstawiona na listingu 15.10.

Listing 15.10. Uycie zaimportowanych obiektw COM.


1 <%@ Page Language="VB" %>
2
3 <script runat="server">
4 sub Page_Load(obj as object, e as eventargs)
5 dim objFSO as new Scrrun_net.FileSystemObject
6 dim objFile as Scrrun_net.File
7 objFile = objFSO.GetFile(Server.MapPath("../rozdzial13/log.txt"))
8
9 lblMessage.Text = objFile.Path
10 end sub
11
12 </script>
13
14 <html><body>
15 <asp:Label id="lblMessage" runat="server" />
16 </body></html>

Teraz moglimy ponownie zastosowa dobrze znan metod tworzenia obiektw. Warto zwrci
uwag, i obiekt FileSystemObject naley teraz do przestrzeni nazw Scrrun_net, ktra
dokadnie odpowiada nazwie pliku nowoutworzonej biblioteki. Ta wersja strony bdzie dziaaa
znacznie efektywniej ni poprzednia, a dodatkowo mona wykorzystywa stare obiekty COM w
taki sam sposb jak obiekty rodowiska .NET.

Notatka
W rzeczywistoci rodowisko .NET nie konwertuje obiektw COM do postaci komponentw
.NET. Zamiast tego tworzy ono warstw poredni generujc konieczne metadane sam
obiekt COM nie jest w aden sposb zmieniany. Oznacza to, e wirtualna maszyna CLR wci
nie jest w stanie w peni wspiera obiektw COM.
To nie jest ASP!
By moe programici przyzwyczajeni do wczeniejszych wersji technologii ASP s teraz w stanie
gbokiego szoku. Jedn z najwikszych zalet ASP.NET jest moliwo tworzenia i wykorzystania
bibliotek DLL bez koniecznoci zatrzymywania i ponownego uruchamiania serwera WWW,
przejmowania si konfliktami wersji ani rejestracji bibliotek DLL przy uyciu programu
REGSVR32.exe.
Wczeniej, wszystkie obiekty COM musiay by rcznie rejestrowane, a aby zmiany mogy zosta
wykorzystane, konieczne byo ponowne uruchomienie serwera. W rzeczywistoci, czynniki te
uniemoliwiay wykorzystanie wielu rodzajw zdalnej administracji serwerem. Programista lub
administrator musia pracowa przy komputerze na ktrym dziaa serwer. W ASP.NET nie ma ju
tej koniecznoci.
Zgodnie z tym, czego dowiedziae si w rozdziale 7, technologia ASP.NET zostaa wyposaona
w nowy system konfiguracyjny, ktry bez trudu moe zmieni kada osoba dysponujca
odpowiednimi uprawnieniami. Pliki przechowywane w folderze /bin s automatycznie adowane
w czasie dziaania aplikacji, a wszelkie zmiany mona w nich wprowadza bez adnych
problemw, gdy serwer nie blokuje dostpu do nich. A zatem, bez zbytniego przejmowania si
mona je usun i zastpi now wersj.
Oznacza to rwnie, e proces uruchamiania aplikacji jest znacznie prostszy. Wystarczy
skopiowa potrzebne pliki do odpowiednich folderw i najnowsza wersja aplikacji jest gotowa
do uycia. Nie trzeba ju ponownie uruchamia serwera lub instruowa kogo jak wykona cay
proces jeli nie mona go przeprowadzi osobicie.
Proces tworzenia bibliotek DLL w rodowisku .NET nie zmieni si zbytnio. Wprowadzono w nim
jednak kilka innowacji, takich jak wykorzystanie przestrzeni nazw oraz nowy kompilator jzyka
VB.NET. Niemniej jednak przewaajca cz procesu projektowania i pisania kodu nie ulega
zmianie.
Programici ASP mog take by wdziczni, e wci mona korzysta z ich bibliotek obiektw
COM. ASP.NET daje moliwo posugiwania si tymi obiektami, dziki znanej ju metodzie
Server.CreateObject. Metoda ta tworzy obiekty czone w czasie realizacji programu,
podobnie jak we wczeniejszych wersjach technologii ASP. Mona take posuy si importerem
biblioteki typw, aby wzbogaci obiekty COM o pewne wsparcie ze strony wirtualnej maszyny
CLR i mechanizmu wczesnego czenia. Jednak w przewaajcej wikszoci przypadkw
optymalnym rozwizaniem bdzie konwersja istniejcych obiektw, dziki ktrej moliwe bdzie
wykorzystanie bogatych moliwoci rodowiska .NET.
Wiele poj zwizanych z tworzeniem i wykorzystaniem obiektw biznesowych nie ulego
zmianie w ASP.NET. Zmienio si rodowisko w ktrym obiekty te s tworzone i
wykorzystywane, jednak dziki temu moliwe byo wprowadzenie kilku niezwykle podanych
usprawnie w procesie implementacji obiektw biznesowych.
Naley pamita, e obiekty biznesowe tworzone w rodowisku .NET nie s zgodne z
wczeniejszymi wersjami technologii ASP. Oznacza to, e nie mona wykorzysta obiektu
Database z listingu 15.1, w klasycznych stronach ASP. Nie mona zapomina, e obiekty .NET
s kompilowane do postaci kodu poredniego MSIL, ktry z kolei musi zosta skompilowany do
waciwego kodu maszynowego przez wirtualn maszyn CLR. Jednak tradycyjne aplikacje ASP
nie mog korzysta z wirtualnej maszyny CLR i nie s w stanie zrozumie kodu poredniego
MSIL. Oznacza to, e nie bd one w stanie korzysta z nowych obiektw tworzonych w
rodowisku .NET.
Rozdzia 16.
Tworzenie serwisw sieci
WWW
W poprzednim rozdziale przedstawione zostay sposoby tworzenia komponentw
wykorzystywanych w aplikacjach ASP.NET. Z komponentw tych mona korzysta za
porednictwem Internetu, aby zapewni moliwoci funkcjonalne stronom ASP.NET. Co si
jednak stanie, jeli bdziemy chcieli udostpni te komponenty bez koniecznoci korzystania z
nich za porednictwem stron ASP.NET?
Serwisy sieci WWW s nowym sposobem uruchamiania aplikacji. Dziki wykorzystaniu XML-a
oraz innych standardowych technologii serwisy sieci WWW umoliwiaj aplikacjom oraz
komponentom na porozumiewanie si z innymi aplikacjami, niezalenie od miejsca w ktrym s
uruchamiane.
W tym rozdziale poznasz zasady tworzenia serwisw sieci WWW. S one rewolucyjnym
sposobem mylenia o aplikacjach internetowych i stanowi niezwykle wane zagadnienie dla
programistw ASP.NET. W kolejnym rozdziale dowiesz si, jak mona wykorzystywa serwisy
sieci WWW we wasnych aplikacjach.
W tym rozdziale omwione zostan nastpujce zagadnienia:
Czym s serwisy sieci WWW.
Jak dziaaj serwisy sieci WWW.
Kiedy naley ich uywa.
Sposoby tworzenia serwisw sieci WWW.
Sposoby tworzenia serwisw sieci WWW przy wykorzystaniu istniejcych obiektw
biznesowych.

Sposb dziaania WWW w nowym ujciu


Gdy na pocztku niniejszej ksiki zaczynae swoje spotkanie z ASP.NET, poznae podstawowy
sposb dziaania sieci WWW chodzi konkretnie o model operacji danie odpowied. Klient
(na przykad, przegldarka WWW) przesya na serwer danie dotyczce wybranej strony, a
serwer, w odpowiedzi, przesya klientowi t stron.
Pniej poznae rozwizania programistyczne zwizane z sieci WWW. ASP.NET oraz inne
technologie pozwalajce na wykonywanie okrelonych czynnoci w momencie odebrania dania.
Udostpniajc na serwerze moliwoci programistyczne, mona zwraca dane w sposb
dynamiczny. Cho ASP.NET rozszerza ten model o mechanizm dziaania sterowany zdarzeniami,
to jednak podstawowa zasada dziaania WWW pozostaje taka sama wci jest to danie i
odpowied.
Strony ASP.NET udostpniaj interfejs, pozwalajcy uytkownikom na interakcj z witryn
WWW. Poza tym interfejsem, zapewne pod postaci obiektw biznesowych, moe si kry
potna logika dziaania aplikacji. Ale co mona zrobi jeli moliwoci funkcjonalne jednej
aplikacji s tak potne, e inni programici chc korzysta z nich w swoich aplikacjach? Albo co
zrobi jeli kto chce wykorzysta moliwoci funkcjonalne, lecz nie moe uy interfejsu
uytkownika; co moe si zdarzy, na przykad, gdy pracuje z poziomu wiersza polece? Jak
mona wykorzysta model danie odpowied w takich sytuacjach?
To cakiem proste. Przeanalizuj sposb w jaki strony ASP.NET wykorzystuj obiekty biznesowe.
Ot uywaj one metod i waciwoci tych obiektw do wykonywania okrelonych operacji, a
obiekty mog, lecz nie musz zwraca informacji. W rezultacie strona wysya danie wykonania
pewnych czynnoci, a nastpnie czeka na otrzymanie wynikw.
Dlaczego inna aplikacja nie mogaby wykorzystywa obiektw w taki sam sposb wysa
danie przez Internet i poczeka na otrzymanie wynikw? Idea ta zostaa zilustrowana na
rysunku 16.1. Sam pomys jest bardzo prosty, cho a do tej pory nie istniaa adna technologia,
ktra pozwoliaby na jego realizacj.

Rysunek 16.1. Aplikacje powinny by w stanie prowadzi interakcj z serwisami sieci WWW
w podobny sposb, jak strony ASP.NET korzystaj z obiektw biznesowych
Opis rysunku
ASP.NET page Strona ASP.NET
Send commnads Przesya polecenia
Business Obiekt biznesowy
Return data Zwraca dane

A oto nieco bardziej praktyczny przykad jedna witryna WWW powinna by w stanie przesa
danie do innej witryny i poczeka na odpowied. Pierwsza z witryn mogaby wykorzystywa
metody i waciwoci udostpniane przez drug. Pomys ten zosta zilustrowany na rysunku 16.2,
na przykadzie witryny prezentujcej notowania giedowe. Uytkownik przesya danie do
witryny WWW, ktra z kolei przesya danie do witryny obsugujcej operacje giedowe. Druga
z witryn zwraca odpowiednie informacje pierwszej witrynie, ktra moe je zaprezentowa w
dowolnej formie.

Rysunek 16.2. Serwisy sieci WWW pozwalaj witrynom WWW na wykorzystanie moliwoci
funkcjonalnych innych witryn
Opis rysunku
User Uytkownik da informacji o ACME
Site 1 Witryna WWW nr. 1
Site 1 receives request Pierwsza witryna WWW otrzymuje danie. da informacji o
ACME od witryny WWW nr. 2.
Witryna nr. 1 otrzymuje informacje i wywietla je na stronie.
Site 2. Witryna WWW nr. 2 (operacje giedowe)
Witryna nr. 2 otrzymuje danie, pobiera informacje dotyczce ACME z bazy danych i przesya
je z powrotem do witryny nr. 1.
Prezentacja serwisw sieci WWW
Nowe okrelenie
Zanim poznasz serwisy sieci WWW warto okreli czym jest normalny serwis. Gdy kto
wykonuje dla Ciebie jak czynno, to wiadczy na Twoj rzecz pewn usug. Na przykad, na
pewno jedzisz na stacj benzynow aby zatankowa lub naprawi samochd. Te usugi wiadczy
stacja benzynowa i znajdujcy si przy niej warsztat, dziki czemu nie musisz samemu
wykonywa okrelonych czynnoci. Wyobra sobie co by byo, gdyby kady posiadacz
samochodu musia mie wasny dystrybutor z paliwem. Bez wtpienia nie byaby to idealne
rozwizanie. Na pewno chodzisz take do restauracji, ktre wiadcz usugi gastronomiczne. S to
wszystko zadania, ktre moesz wykona samodzielnie, cho moesz nie mie ochoty tego robi.
A zatem usuga (serwis) jest dodatkow operacj wiadczon przez pewn osob lub firm, dziki
ktrej nie musisz samodzielnie wykonywa okrelonych czynnoci.
Dokadnie tym samym s serwisy sieci WWW. Witryna WWW moe udostpnia takie serwisy, z
ktrych mog korzysta uytkownicy a nawet inne witryny WWW. Wyobra sobie portal, ktry
prezentuje informacje lokalne i oglnokrajowe, prognoz pogody, serwis sportowy oraz stron
zawierajc informacje wybrane przez uytkownika. Serwis udostpniany przez ten portal, polega
na gromadzeniu, przetwarzaniu i zapisywaniu informacji pochodzcych z wielu rnych rde.
Niemniej jednak, jeli portal nie dysponuje ogromnym budetem oraz rzesz pracownikw, to
gromadzenie i tworzenie aktualnych informacji dla wszystkich tych dziaw jest niemal
niemoliwe.
Jednak portal moe wykorzysta inne rozwizanie uy treci pochodzcej z innych witryn
zapewniajc jedynie mechanizm ich prezentacji. W takim przypadku wci bdzie on udostpnia
usugi dla swych uytkownikw lecz jednoczenie jego dziaanie bdzie zalene od usug
udostpnianych przez inne witryny.
Rozwizanie takie jest bardzo czsto wykorzystywane w witrynach informacyjnych. Na przykad,
Polska Agencja Prasowa udostpnia taki serwis, z ktrego mog korzysta wydawcy gazet.
Nastpnym razem gdy bdziesz czyta gazet, poszukaj w niej doniesie dostarczanych przez
PAP. Zostay one pobrane wanie z tego serwisu.
Systemy tego typu nie byy zbyt popularne na Internecie ze wzgldu na problemy dotyczce,
midzy innymi, sposobw komunikacji poszczeglnych serwisw. Wiele firm podejmowao prby
stworzenia wasnych, opatentowanych systemw komunikacyjnych, ktre umoliwiyby wymian
informacji z serwisami; rozwizania te s jednak przewanie zbyt drogie i skomplikowane, aby
moga z nich korzysta wikszo uytkownikw Internetu. Wystpoway take problemy innego
typu zwizane ze struktur systemw bezpieczestwa wykorzystywanych na Internecie. Wiele
spord tych specjalistycznych systemw komunikacyjnych miao powane trudnoci z
przekazywaniem informacji przez zapory ogniowe, ktre zostay zaprojektowane w celu
blokowania nieupowanionych transmisji sieciowych.
Serwisy sieci WWW dostpne w rodowisku .NET stanowi rozwizanie wymienionych powyej,
oraz wielu innych problemw. Serwis sieci WWW jest programowalnym obiektem
(przypominajcym nieco obiekt biznesowy) udostpniajcym moliwoci funkcjonalne, z ktrych
mona korzysta za porednictwem Internetu. Serwisy sieci Web dziaaj, gdy wykorzystuj
standardowe technologie zapewniajce moliwo wymiany informacji pomidzy obiektami. Ani
specjalistyczne systemy ani opatentowane mechanizmy nie s konieczne do zapewnienia
poprawnego funkcjonowania serwisw sieci WWW. Jedynym niezbdnym elementem jest
poczenie z Internetem.
Dziaanie serwisw sieci WWW opiera si na zaoeniu, e kady system oraz aplikacja moe
korzysta z protokou HTTP (standardowego protokou komunikacyjnego wykorzystywanego na
Internecie) oraz jest w stanie wykorzystywa informacje zapisane w jzyku XML (stanowicym
standardowy sposb dostarczania danych za porednictwem Sieci). Serwisy sieci WWW
wykorzystuj jzyk XML do przesyania polece oraz przesyania danych do oraz z obiektw
dostpnych na serwerze. Aplikacje korzystajce z tych danych i wysyajce polecenia, mog by
tworzone w dowolnym jzyku, na komputerach o dowolnej architekturze i mog by cakiem
proste lub bardzo zoone. Jedyna informacj jak taka aplikacja musi posiada, jest lokalizacja
serwisu sieci WWW (czyli jego internetowy adres).
Serwisy sieci WWW stanowi nowy poziom przetwarzania. Na tej samej zasadzie, ktra
pozwalaa programistom gromadzi rne obiekty i na ich podstawie tworzy aplikacj, teraz
mona wykorzysta grup serwisw dziaajcych w dowolnym miejscu i wykorzysta je w swojej
aplikacji. Dziki serwisom sieci WWW rne platformy komputerowe mog teraz bez przeszkd
wymienia informacje, czc i zapewniajc moliwo wsppracy zupenie niezalenych
systemw dziaajcych w miejscach kuli ziemskiej.

Scenariusze wykorzystania serwisw sieci WWW


Zamy, e stworzylimy komponent udostpniajcy podstawowe funkcje obliczeniowe, takie jak
te, zaimplementowane w kalkulatorze przedstawionym w rozdziale 2., pt.: Tworzenie stron
ASP.NET. Przypominasz sobie zapewne, e kalkulator wykonuje podstawowe operacje
arytmetyczne. Na potrzeby innej witryny, dziaajcej w innym miejscu kuli ziemskiej, zosta
stworzony komponent umoliwiajcy skadanie zamwie dla sklepu z materiaami budowlanymi
i remontowymi. Zakadajc, e oba te komponenty s serwisami sieci WWW, przezorny i sprytny
programista, moe je poczy i wykorzysta do stworzenia witryny umoliwiajcej
uytkownikom zaprojektowanie i obliczenie kosztw budowy lub remontu mieszkania lub domu.
Jeli uytkownik bdzie musia okreli wymiary i przeprowadzi obliczenia, bdzie mg
skorzysta z serwisu udostpniajcego funkcje obliczeniowe. Po zgromadzeniu wszystkich
potrzebnych informacji, moe on zoy zamwienie przy uyciu drugiego z serwisw. Wszystkie
te czynnoci mog by wykonane z poziomu jednej aplikacji, a uytkownik nie musi wiedzie
skd pochodz wykorzystywane moliwoci funkcjonalne. Przykad ten zosta zilustrowany na
rysunku 16.3.

Rysunek 16.3. Pojedyncza aplikacja wykorzystujca wiele serwisw sieci WWW


Opis rysunku
Internet - Internet
Calculator service Serwis sieci WWW zapewniajcy moliwoci obliczeniowe
Shopping service Serwis sieci WWW realizujcy skadanie zamwie
Calculate measurements Obliczenie wymiarw
Place Zoenie zamwienia
Home design Aplikacja umoliwiajca projektowanie domu lub mieszkania

Serwisy sieci WWW mog by wykorzystywane nawet przez aplikacje internetowe. Wyobra
sobie witryn zajmujc si handlem elektronicznym, ktra musi oblicza koszty wysyki towarw
zamawianych przez uytkownikw. W normalnym przypadku, witryna taka musiaaby posiada
tabel z aktualnymi informacjami na temat stawek usug kurierskich w zalenoci od wielkoci i
ciaru przesyki, jej miejsca docelowego, priorytetu oraz wielu innych czynnikw. W przypadku
wykorzystania serwisw sieci WWW, witryna taka mogaby przesa odpowiednie danie
bezporednio do witryny firmy kurierskiej uywajc w tym celu polece zapisanych w jzyku
XML i bezzwocznie otrzyma wyliczon kwot okrelajc kosz konkretnej przesyki. Serwisy
WWW pozwalaj na bardzo proste poczenie aplikacji, ktrych poczenie nastrczyoby
wczeniej bardzo duych problemw.

Model programistyczny serwisw sieci WWW


Jak ju wczeniej wspominaem, serwisy sieci WWW komunikuj si przy wykorzystaniu jzyka
XML. Jednak jakie informacje s wymieniane?
Nowe okrelenie
Pierwszy wysyany komunikat zazwyczaj wie si z procesem okrelanym jako odkrywanie,
ktry umoliwia klientowi odszukanie i zdobycie informacji na temat serwisu sieci WWW. Proces
ten wie si z wymian komunikatw zawierajcych informacje opisujce moliwoci
konkretnego serwisu sieci WWW. Klient musi zna te informacje, nim bdzie w stanie skorzysta
z serwisu. Serwis informuje rwnoczenie klienta o innych rodzajach komunikatw jakie mona
do niego przesya.
Proces odkrywania nie musi by wykonywany. Na przykad, jeli autorzy serwisu nie chc, aby
ktokolwiek niepowoany mg si dowiedzie o jego istnieniu i moliwociach, mog wyczy
obsug tego procesu. Jest to jeden ze rodkw zabezpieczajcych, dziki ktrym nie kady bdzie
mg korzysta z utworzonych serwisw sieci WWW.
Po fazie odkrycia, serwis powinien poinformowa klienta o informacjach jakie spodziewa si
otrzyma (czyli o poleceniach, ktre akceptuje) oraz o postaci zwracanych danych. Ten etap musi
by koniecznie wykonany, gdy dziki niemu zarwno serwis jak i klient wiedz jak mog si
wzajemnie komunikowa. Informacje wymieniane podczas tego etapu okrelane s mianem opisu
serwisu sieci WWW. W przypadku obiektw biznesowych programista zazwyczaj zawczasu wie
jaki polecenia obsuguje wykorzystywany obiekt (na przykad, na podstawie jego dokumentacji).
W zasadzie, opis serwisu sieci WWW jest dokumentacj tego serwisu zapisan w jzyku XML.
I w kocu ostatni etap polega na wymianie pomidzy klientem i serwisem, komunikatw
zawierajcych polecenia i wyniki; przy czym klient przesya polecenia, a serwis odpowiedzi
zawierajce wyniki. Take w tym przypadku, wszystkie wymieniane informacje s zapisane w
jzyku XML. Cay ten proces zosta przedstawiony na rysunku 16.4.

Rysunek 16.4. Wykorzystanie serwisu sieci WWW wie si z jego odkryciem, pobraniem
opisu oraz przesyaniem polece
Opis rysunku
UWAGA!!!! wszystkie strzaki na rysunku powinny by skierowane w przeciwnym kierunku!!
1. Discovery 1. Odkrycie
Application Aplikacja
Web service Serwis sieci WWW
What do you do? Jakie s moliwoci serwisu?
Description Opis
2. Service description Opis serwisu sieci WWW
What do you expect? Czego serwis oczekuje?
3. Commands Polecenia
Do this Wykonaj to
Here are Oto wyniki

Na szczcie ASP.NET zapewnia niemal ca infrastruktur konieczn do wykonania wszystkich


tych czynnoci. W kocu rodowisko to jest w stanie obsugiwa dania i odpowiedzi, operowa
na danych zapisanych w jzyku XML, korzysta z obiektw biznesowych przez co doskonale
si nadaje do tworzenia serwisw sieci WWW.

Protokoy umoliwiajce korzystanie z serwisw


sieci WWW
Ju wiesz, e serwisy sieci WWW przesyaj dane i otrzymuj polecenia przy uyciu
komunikatw zapisanych w jzyku XML. Konkretnie rzecz biorc, dane XML s wykorzystywane
przy odkrywaniu serwisu oraz do jego opisania. Natomiast komunikaty zawierajce polecenia
kierowane do serwisu nie musz by zapisywane w jzyku XML. Mona je przesya przy uyciu
dwch dodatkowych metod Http-Get oraz Http-Post. Metody te s uywane przez strony
ASP.NET do przesyania acuchw zapyta oraz informacji wpisywanych w polach formularzy.

Http-Get
Http-Get jest standardowym protokoem umoliwiajcym klientom komunikacj z serwerami przy
uyciu protokou HTTP. To wanie w ten sposb s zazwyczaj przesyane dania dotyczce
stron WWW. Operacj Http-Get mona sobie wyobrazi jako pobranie przez klienta strony z
serwera WWW. Oglnie rzecz biorc klient przesya na serwer danie HTTP dotyczce zasobu o
konkretnym adresie URL, a serwer w odpowiedzi zwraca odpowiedni kod HTML. Wszelkie
parametry konieczne do prawidowego obsuenia dania s doczone do adresu URL jako, tak
zwany, acuch zapytania. Oto przykad:
http://www.serwer.com.pl/default.aspx?id=Chris&plec=M

Parametry id oraz plec s przesyane na serwer jako dane wejciowe i zostaj dopisane na kocu
adresu URL. Strona ASP.NET moe pobra te wartoci przy uyciu poniszego fragmentu kodu:
Request.Querystring("id")
Request.Querystring("plec")

Serwisy sieci WWW mog wykorzystywa dania Http-Get i acuch zapytania do przesyania
polece i zwracania wynikw, zamiast komunikatw zapisanych w jzyku XML. Warto zwrci
uwag, e informacje przesyane w ten sposb stanowi cz adresu URL. Metoda ta ma jednak
ograniczone moliwoci, gdy umoliwia przesyanie wycznie par nazwa-warto.

Http-Post
Protok ten przypomina Http-Get, lecz rni si od niego tym, i informacje nie s przekazywane
w formie acucha zapytania, lecz zapisywane w nagwkach dania HTTP. Gdy klient przesya
danie przy uyciu tego protokou, generuje on danie HTTP zawierajce dodatkowe informacje
zapisane w formie par nazwa-warto. Serwer odbierajc takie danie musi je przetworzy, aby
okreli nazwy parametrw oraz ich wartoci. Protok ten jest najczciej wykorzystywany przy
przesyaniu formularzy HTML.
Na przykad, wyobra sobie formularz HTML zawierajcy pola tekstowe o nazwach id oraz
plec, ktrego kod przedstawiony zosta na poniszym przykadzie:
<form method="post">
<input type="text" id="id">
<input type="text" id="plec">

<input type="submit" id="idSubmit" value="Wylij" />


</form>

W momencie wysyania tego formularza przegldarka pobiera wartoci wprowadzone w polach


tekstowych i dopisuje je do nagwkw dania HTTP przesyanych na serwer. Na serwerze,
wartoci te mona pobra przy uyciu poniszego fragmentu kodu:
Request.Form("id")
Request.Form("plec")

Moliwoci tego protokou, podobnie jak poprzedniego, ograniczaj si jedynie do przesyania par
nazwa-warto.

Notatka
Zwr uwag, e informacje podawane w polach formularzy mona przesya take przy uyciu
protokou Http-Get. Aby to zrobi, atrybutowi METHOD znacznika <FORM> naley przypisa
warto GET. W tym przypadku, przy wysyaniu formularza na serwer informacje podane w jego
polach zostan dopisane do acucha zapytania i nie bd umieszczane w nagwkach HTTP.
Oto przykad:

<form method="get">
SOAP
SOAP prosty protok dostpu do obiektw (ang: Simple Object Access Protocol) jest
stosunkowo nowym standardem przesyania informacji z klienta na serwer. W odrnieniu od
dwch poprzednich protokow, SOAP przesya informacje w formie XML a nie przy uyciu
da HTTP. Oznacza to, e przy jego uyciu mona przesya nie tylko proste pary nazwa-
warto, lecz take znacznie bardziej skomplikowane obiekty, takie jak zoone typy danych,
klasy, obiekty, itp.
Wysyania komunikatw SOAP rni si nieco od sposobw przesyania komunikatw do ktrych
jestemy przyzwyczajeni. W przypadku uycia protokou Http-Get informacje byy przekazywane
w formie acucha zapytania, a w razie zastosowania protokou Http-Post poprzez przesyanie
formularzy (przy czym informacje byy zapisywane w nagwkach dania HTTP). Protok
SOAP take przesya dane przy wykorzystaniu HTTP, jednak jego dziaanie nie ogranicza si do
modelu danie odpowied. Za jego pomoc mona przesya dowolne komunikaty dowolnych
typw, niezalenie od tego czy klient zada ich czy nie. Dziki temu, protok SOAP jest
niezwykle elastycznym medium przesyu danych.
Poniewa protok ten bazuje na jzyku XML, mona go wykorzystywa do przesyania
informacji za porednictwem WWW. Dane zapisane w jzyku XML to zwyczajny tekst, ktry
mona przesya dokadnie tak samo jak strony WWW, w tym take poprzez zapory ogniowe.
SOAP jest standardowym protokoem wykorzystywanym przez serwisy sieci WWW do
komunikacji z klientami.

Notatka
Wiele osb moe si pogubi porwnujc SOAP i XML. Jeli protok SOAP jest tak
doskonaym sposobem przesyania komunikatw, to dlaczego nie wykorzysta go zamiast
XML? Rnica jednak polega na tym, e XML suy do okrelania formatu danych, podczas gdy
SOAP okrela protok uywany do ich przesyania. Protok SOAP wykorzystuje XML do
zapisu przesyanych komunikatw. Jzyk XML jest idealnym sposobem przesyania wikszoci
istniejcych typw danych. Protok SOAP uywany jest wycznie w przypadkach, gdy trzeba
przesya takie elementy jak polecenia bd instrukcje.

Dlaczego warto uywa serwisw sieci WWW?


Teraz kiedy ju wiesz czym s serwisy sieci WWW, moesz si zastanawia dlaczego warto ich
uywa.
Sprbuj przypomnie sobie wiat 10 lub 15 lat temu, zanim pojawi si Internet. W tamtych
czasach systemu komputerowe byy zupenie niezalenymi bytami, ktre nie dysponoway
adnym dostpem do innych systemw. Aplikacje byy projektowane w celu wykorzystania na
jednym komputerze i nie miay adnych moliwoci dzielenia si i wsplnego korzystania z
informacji. Take moliwoci wymiany informacji wewntrz firmy lub pomidzy firmami przy
wykorzystaniu komputerw, byy w tamtych czasach bardzo ograniczone. Nawet prywatne
wiadomoci byy przewanie dostarczane rcznie.
Internet cakowicie zmieni sposb komunikacji. Zmieni take sposb tworzenia aplikacji.
Aktualnie bardzo trudno spotka aplikacje, ktre w aden sposb nie wykorzystuj jego
moliwoci. Istnieje natomiast wiele aplikacji, takich jak internetowe komunikatory, w ktrych
dostarczanie danych uytkownikom jest w caoci zalene od Internetu.
Kolejnym etapem zapewniania cznoci pomidzy uytkownikami, jest dostarczanie aplikacji za
porednictwem Internetu. Ju teraz firmy staraj si czy tradycyjne aplikacje tak, aby tworzyy
cile zintegrowane, wieloelementowe pakiety. Wziwszy pod uwag ilo wci uywanych
starych aplikacji, jest to ogromne i przeraajce zadanie.
Serwisy sieci WWW udostpniaj bardzo prosty mechanizm sucy do wzajemnej wymiany
informacji pomidzy aplikacjami. Umoliwiaj one wspdzielenie komponentw i udostpniaj
moliwoci funkcjonalne, z ktrych mog korzysta wszyscy niezalenie od swego pooenia.
Wyobra sobie, e ju nigdy nie bdziesz musia instalowa na swoim komputerze jakiegokolwiek
oprogramowania wystarczy, e nawiesz poczenie z Internetem i skorzystasz z
odpowiedniego serwisu.
Wszystko dobrze, ale w jaki sposb serwisy sieci WWW s w stanie poprawi metody tworzenia
aplikacji internetowych? Jednym ze sposobw jest uatwienie wielokrotnego wykorzystywania
kodu. Przypomnij sobie, e jednym z powodw przemawiajcych za stosowaniem obiektw
biznesowych bya moliwo wielokrotnego wykorzystywania kodu, bez koniecznoci jego
powtrnego tworzenia. Nawet logika rozgaziania czyli funkcje i procedury uatwiaj
wielokrotne wykorzystywanie tego samego kodu (wicej informacji na ten temat znajdziesz w
rozdziale 3., pt.: Stosowanie Visual Basic.NET). Dziki serwisom sieci WWW mona korzysta
z kodu napisanego przez inne osoby bez koniecznoci kopiowania i instalowania czegokolwiek. W
ten sposb mona zaoszczdzi czas i energi, i uproci dodawanie nowych moliwoci
funkcjonalnych do tworzonych aplikacji ASP.NET.
Kolejn cenn zalet serwisw sieci WWW jest atwo wdraania i utrzymania. Dziki nim ju
nigdy nie bdzie trzeba instalowa wasnych komponentw i aplikacji na wielu rnych systemach
komputerowych. Zamiast tego uytkownicy bd dysponowa standardowym rodowiskiem
zapewniajcym moliwo korzystania z aplikacji za porednictwem Internetu. Co wicej, w
razie koniecznoci wprowadzenia jakich zmian, nie bdzie trzeba udostpnia adnych poprawek
ani nowych wersji programw. W zupenoci wystarczy wprowadzenie modyfikacji w jednym
miejscu serwisie sieci WWW a wszystkie korzystajce z niego klienty automatycznie bd
mogy z nich skorzysta. (Chyba e usuniesz moliwoci funkcjonalne od ktrych zaley dziaanie
tych klientw, gdy w takim przypadku konieczna bdzie ich modyfikacja. Niemniej jednak, w
obu przypadkach proces ten jest znacznie atwiejszy z punktu widzenia programisty.)

Tworzenie serwisw sieci WWW


Tworzenie serwisw sieci WWW skada si z kilku etapw, do ktrych mona zaliczy
implementacj moliwoci funkcjonalnych oraz tworzenie opisu serwisu. W kolejnych czciach
rozdziau zostan opisane poszczeglne etapy tworzenia prostego serwisu sieci WWW.

Implementacja moliwoci funkcjonalnych


Pliki serwisw sieci WWW s w zasadzie zwyczajnymi plikami zawierajcymi kod rdowy
napisany w jzyku VB.NET, ktrym nadano rozszerzenie .asmx. Sam serwis jest natomiast
reprezentowany przez klas potomn klasy WebService. Przykad bardzo prostego serwisu sieci
WWW zosta przedstawiony na listingu 16.1.

Listing 16.1. Prosty serwis sieci WWW.


1 <%@ WebService Language="VB" Class="Calculator" %>
2
3 Imports System.Web.Services
4
5 public Class Calculator : Inherits WebService
6 <WebMethod()> Public Function Add(intA As Integer, _
7 intB As Integer) As Integer
8 Return(intA + intB)
9 End Function
10 End Class

Analiza
Zapisz powyszy kod w pliku o nazwie Calculator.asmx. Jak wida, w 1. wierszu powyszego
przykadu zostaa umieszczona dyrektywa WebService; przypomina ona nieco dyrektyw Page
lecz informuje, i plik reprezentuje serwis sieci WWW. Dyrektywa ta umoliwia uycie znanego
ju atrybutu Language, ktry w naszym przypadku informuje, e serwis zosta napisany w jzyku
VB. Dyrektywa obsuguje take inny atrybut Class. Okrela on nazw klasy tworzonego
serwisu sieci WWW. I faktycznie, w wierszu 5. mona si przekona, e nazwa klasy naszego
serwisu to Calculator. W dalszej czci rozdziau poznasz interesujce i przydatne moliwoci
tego atrybutu.
Nastpnie, w wierszu 3. jest importowana przestrze nazw System.Web.Services. Dziki temu,
bdzie mona korzysta ze wszystkich koniecznych klas i metod serwisw sieci WWW. Klasa
definiowana w wierszu 5. musi dziedziczy po klasie WebService zdefiniowanej w przestrzeni
nazw System.Web.Services.

Notatka
W jednym pliku .asmx moe zdefiniowa dowoln ilo klas, jednak tylko jedna z nich moe by
uywana jako serwis sieci WWW. Moe nim by tylko ta klasa, ktrej nazwa zostaa podana w
dyrektywnie WebService umieszczanej na samym pocztku pliku.

Przeanalizujmy teraz jedyn metod zdefiniowan w klasie Calculator. Deklaracj metody Add
mona by uzna za cakiem standardow gdyby nie dwa wyrniajce j elementy. Po pierwsze
metoda ta musi zosta zadeklarowana jako publiczna (public); w przeciwnym razie klienty nie
bd w stanie uzyska dostpu to tej metody serwisu.
Drugim czynnikiem wyrniajcym metod Add, jest wykorzystanie atrybutu <WebMethod()>,
ktry informuje ASP.NET, e metoda ta ma by dostpna dla innych aplikacji w formie serwisu
sieci WWW. Jest to niezwykle wany atrybut, ktry musi zosta podany jeli klienty maj mie
moliwo dostpu do tej metody. W dalszej czci rozdziau, pt.: Atrybut WebMethod
atrybut ten zostanie omwiony bardziej szczegowo.
Podsumowujc, metoda ktra ma by dostpna dla klientw korzystajcych z serwisu musi zosta
zadeklarowana jako Public (publiczna) i musi uywa atrybutu <WebMethod()>.
Ogldnijmy teraz t stron przy uyciu przegldarki WWW. Jej wygld przedstawiony zosta na
rysunku 16.5.

Rysunek 16.5. Wywietlanie plikw .asmx w przegldarce WWW


To niezwykle interesujce! Co si stao z kodem naszego przykadowego serwisu sieci WWW? I
skd si wzi sposb prezentacji wywietlonej strony?
Podobnie jak strony ASP.NET, take pliki .asmx s kompilowane w momencie obsugi
pierwszego dotyczcego ich dania. Nastpnie, przy obsudze kadego zgaszanego dania
dotyczcego tego pliku, ASP.NET zwraca klientowi opis serwisu. A zatem, na rysunku 16.5,
zostay przedstawione informacje jakie uzyska klient po przesaniu dania dotyczcego serwisu
sieci WWW. Informacje te s zapisywane w jzyku XML. Przekazana odpowied zawiera nazw
klasy Calculator oraz jej publiczne metody i waciwoci. Poczenie umieszczone w
prawym, grnym wierzchoku strony odwouje si do niej samej, lecz dodatkowo w acuchu
zapytania przekazuje parametr WSLD:
http://localhost/aspnetdlakazdego/rozdzial16/Calculator.asmx?WSDL

Parametr ten informuje ASP.NET, i uytkownik yczy sobie zobaczy opis serwisu w formie
XML. Opis naszego przykadowego serwisu przedstawiony zosta na rysunku 16.6.

Rysunek 16.6. Opis naszego przykadowego serwisu sieci WWW zapisany w formie
dokumentu XML

Jak si okazuje, to cakiem spory dokument XML jak na taki may serwis. Plik XML zapisywany
jest w standardowym formacie okrelanym jako Service Description Language (w skrcie SDL
jzyk opisu serwisw); a jego przeznaczeniem jest udostpnienie klientom informacji o
moliwociach serwisu. W ogle nie bdziemy si zajmowa tym plikiem, lecz jeli go
przegldniesz, to powiniene zauway kilka znajomych elementw. Na przykad, niemal na
samym pocztku pliku mona znale nastpujcy fragment kodu:

1 <s:element name="Add">
2 <s:complexType>
3 <s:sequence>
4 <s:element minOccurs="1" maxOccurs="1" name="intA" type="s:int" />
5 <s:element minOccurs="1" maxOccurs="1" name="intB" type="s:int" />
6 </s:sequence>
7 </s:complexType>
8 </s:element>
9 <s:element name="AddResponse">
10 <s:complexType>
11 <s:sequence>
12 <s:element minOccurs="1" maxOccurs="1" name="AddResult"
type="s:int" />
13 </s:sequence>
14 </s:complexType>
15 </s:element>

Analiza
Pierwszy z dwch elementw przedstawionych w powyszym fragmencie kodu opisuje metod
Add oraz jej argumenty; natomiast drugi odpowied generowan przez t metod, stosownie
okrelon jako AddResponse. Pozostaa cz pliku zawiera informacje dotyczce sposobw
wykorzystania tego serwisu przy uyciu protokow Http-Get, Http-Post oraz SOAP.

Ponownie wywietl nasz przykadowy serwis sieci WWW w klasycznej postaci, a nastpnie
kliknij poczenie Add i przekonaj si czym jeszcze ASP.NET moe Ci zaskoczy. Wygld
strony wywietlanej po klikniciu poczenia Add przedstawiony zosta na rysunku 16.7.

Rysunek 16.7. Szczegowy opis metody Add

Jak wida, serwisy sieci WWW skadaj si z wielu elementw. Strona przedstawiona na
powyszym rysunku nazywana jest stron opisu; podaje ona wiele szczegowy informacji na
temat metody, a nawet pozwala j przetestowa. Podaj dwie liczby cakowite w polach
wywietlonego formularza i kliknij przycisk Invoke. Na ekranie pojawi si nowe okno
przegldarki, w ktrym zostanie wywietlona odpowied przedstawiona w formie kodu XML.
Odpowied o identycznej postaci otrzyma klient po wywoaniu tej metody serwisu sieci WWW.
Kolejne trzy czci strony SOAP, HTTP GET oraz HTTP POST pokazuj przykady
wywoania metody Add przy uyciu tych trzech protokow.
Strona opisu pozwala przetestowa dziaanie serwisu sieci WWW. Warto zauway i dane do
metody Add s podawane w formularzu, a zatem sama metoda zostaje wywoana przy uyciu
protokou Http-Post.

Umoliwienie odkrywania serwisw sieci WWW


Odkrywanie jest procesem za pomoc ktrego aplikacja kliencka odnajduje serwis sieci WWW i
okrela jego moliwoci. Wszystkie niezbdne informacje s podawane przez opis serwisu, jednak
wikszo klientw nie bdzie (ani nie powinna) zna nazwy pliku do ktrego naley si odwoa,
aby uzyska ten opis. A zatem, umoliwienie odkrywania serwisw sieci WWW oznacza
udostpnienie klientom pocze do ich opisw.
Wykonanie procesu odkrywania jest moliwe dziki plikom .disco udostpnianym na serwerze
WWW. Pliki te s dokumentami XML zawierajcymi poczenia z opisami serwisw sieci WWW.
A zatem, za porednictwem tych plikw, klient moe zdoby wicej informacji dotyczcych
dostpnych serwisw.
Stworzenie pliku .disco jest bardzo proste. Listing 16.2 przedstawia plik .disco dla naszego
przykadowego serwisu Calculator.

Listing 16.2. Plik .disco dla serwisu Calculator.


1 <?xml version="1.0" ?>
2 <disco:discovery
3 xmlns:disco="http://schemas.xmlsoap.org/disco/"
4 xmlns:scl="http://schemas.xmlsoap.org/disco/scl">
5 <scl:contractRef ref="Calculator.asmx?WSDL"/>
6 </disco:discovery>

Analiza
Zapisz powyszy kod w pliku Calculator.disco. Jak wida powyszy plik jest bardzo prosty, gdy
zawiera jedynie poczenie z opisem naszego przykadowego serwisu sieci WWW (w wierszu 5.).
Dodatkowe przestrzenie nazw okrelone przy uyciu znacznikw xmlns wskazuj adresy URL
dokumentw zawierajcych informacje o znacznikach ktrych mona uywa wewntrz
znacznikw scl oraz disco. Innymi sowy, znaczniki xmlns zawieraj poczenia ze
standardowymi definicjami znacznikw scl oraz disco. Bez tych przestrzeni nazw nasza
aplikacja nie widziaaby co naley zrobi z tymi dodatkowymi znacznikami.
Znacznik disco:discovery zawiera poczenia, ktrych klient moe uy jeli chce zdoby
wicej informacji na temat serwisu sieci WWW. Poczenia te mog wskazywa inne pliki .disco
lub opis serwisw. Poczenia wskazujce na pliki opisu serwisw s definiowane przy uyciu
znacznikw scl. Przykad takiego znacznika, mona zobaczy w 5. wierszu powyszego listingu.
Aby poda poczenie z innym plikiem .disco, naley uy nastpujcego znacznika:
<disco:discoveryRef ref="adres" />

Jeli zadamy wywietlenia tego pliku w przegldarce, powinien si w nim pojawi ten sam plik
XML.

Notatka
Plik .disco nie jest elementem koniecznym do zapewnienia poprawnego dziaania serwisu sieci
WWW. Jeli znany jest odpowiedni adres URL, to klienty mog uzyska bezporedni dostp do
pliku serwisu. Odkrywanie dokumentw pomaga wycznie anonimowych klientom, ktre dziki
temu procesowi s w stanie dowiedzie si o udostpnianych serwisach sieci WWW.
Atrybut WebMethod
Serwis sieci WWW moe mie metody, tak samo jak zwyczajna klasa lub obiekt biznesowy.
Jednak wycznie metody opatrzone atrybutem WebMethod (patrz wiersz 6. listingu 16.1) bd
dostpne dla klientw korzystajcych z serwisu. Przypomnij sobie, e wycznie publiczne
waciwoci i metody obiektw biznesowych s dostpne dla stron ASP.NET, ktre uywaj tych
obiektw; natomiast metody i waciwoci prywatne s dostpne wycznie dla samego obiektu.
W analogiczny sposb atrybut WebMethod ogranicza moliwo dostpu, jedynie do wybranych
metod serwisu.
Metody, w ktrych definicjach pojawi si atrybut WebMethod, nazywane take metodami sieci
WWW, dziaaj jak zwyczajne metody danej klasy. Mog one prowadzi interakcj z obiektami
Session oraz Cache ASP.NET (patrz rozdzia 4., pt.: Stosowanie obiektw ASP.NET w
jzykach C# i VB.NET oraz 14., pt.: Wykorzystanie ulepszonych mechanizmw obsugi
pamici podrcznej ASP.NET), podobnie jak stron ASP.NET daj moliwo buforowania
odpowiedzi (patrz rozdzia 4.) oraz prowadzi wymian informacji z bazami oraz innymi rdami
danych. W zasadzie od zwyczajnych metod rni si tylko pod jednym wzgldem mona z
nich korzysta za porednictwem Internetu.
To niezwykle wane. W kocu, metody s jednymi z najwaniejszych elementw klasy, gdy to
wanie one okrelaj w jaki sposb uytkownicy bd z tych klas korzysta. Metody zawierajce
w definicji atrybut WebMethod uwaaj, e wszystkie, oglnie pojte programy, ktre je
wywouj, dziaaj w sposb lokalny. Oznacza to, e nie ma adnej rnicy pomidzy
wywoaniem takiej metody ze strony ASP.NET znajdujcej si w tym samym folderze co plik
.asmx, ani z serwera znajdujcego si na drugim kocu wiata. Atrybut WebMethod jest
kluczowym elementem zapewniajcym moliwo wykorzystania serwisw sieci WWW; a zatem
przyjrzyjmy mu si dokadniej. Atrybut ten posiada wiele interesujcych moliwoci.
Reprezentuje on klas WebMethodAttribute, ktra dziaa tak samo jak kada inna klasa
rodowiska .NET i posiada swoje waciwoci i metody. Oznacza to, e umieszczajc w kodzie
ponisz deklaracj metody z atrybutem WebMethod, de facto tworzona jest nowy obiekt klasy
WebMethodAttribute:
<WebMethod()> Public Function Add(intA As Integer)

Przypisywanie wartoci waciwociom tej metody odbywa si nieco inaczej ni to do czego


moesz by przyzwyczajony. Oto przykad:
<WebMethod(Description:="Dodaj dwie liczby ")> Public Function _
Add(intA As Integer,intB As Integer)

Waciwo oraz warto podawane s w nawiasach bezporednio wewntrz deklaracji funkcji.


Naley zwrci szczegln uwag na znak dwukropka umieszczony przed znakiem rwnoci
oznacza on inicjalizacj waciwoci a nie podanie argumentu wywoania metody. W przypadku
uycia nastpujcego kodu:
<WebMethod(Description="Dodaj dwie liczby ")>
Public Function Add(intA As Integer,intB As Integer)

W przypadku uycia powyszego fragmentu kodu, wyraenie Description="Dodaj dwie


liczby " zostaoby potraktowane jako nazwa zmiennej, ktra ma zosta uyta przy tworzeniu
obiektu WebMethod. By moe poprawny sposb zapisu jest nieco dziwny, lecz przynajmniej
umoliwia on okrelanie wartoci waciwoci obiektw WebMethod. Aby okreli wartoci kilku
rnych waciwoci, naley je oddzieli od siebie przecinkami:
<WebMethod(Description:="Dodaj dwie liczby ", _
EnableSession:=False)> Add(intA As Integer, intB As Integer)

Waciwoci jakich mona uywa w atrybucie WebMethod zostay opisane w tabeli 16.1.

Tabela 16.1. Waciwoci atrybutu WebMethod.


Waciwo Opis
BufferResponse Waciwo ta okrela czy wyniki dziaania serwisu sieci WWW maj by
buforowane czy nie. Domyln wartoci tej waciwoci jest true. W
tym przypadku wszystkie generowane odpowiedzi zanim zostan
przesane do klienta s buforowane na serwerze. Dane s przesyane do
klienta w postaci niewielkich fragmentw.
W przypadku zwracania duych iloci informacji warto przypisa tej
waciwoci warto false, dziki czemu dane bd przesyane w sposb
cigy, co zapewni nieco lepsz efektywno dziaania. We wszelkich
innych przypadkach waciwo ta zawsze powinna mie warto true.
CacheDuration Wyniki zwracane przez metody sieci WWW, tak samo jak strony
ASP.NET, mona przechowywa w pamici podrcznej. Ta waciwo
podaje okres czasu (wyraony w sekundach) jaki odpowied powinna by
przechowywana w pamici podrcznej. Domylnie waciwo ta ma
warto 0, co oznacza, e wyniki dziaania metody sieci WWW nie s
buforowane.
Jeli waciwoci tej zostanie przypisana jakakolwiek warto wiksza od
zera, to wyniki wykonania metody zostan zapisane w pamici podrcznej
na podan ilo sekund; a wszystkie kolejne odwoania do tej metody nie
bd powodoway jej wykonania, lecz spowoduj pobranie danych z
pamici podrcznej.
Z przechowywania wynikw w pamici podrcznej warto korzysta w
przypadkach gdy zwracanych jest duo informacji. Wicej sugestii i
informacji na temat uycia pamici podrcznej znajdziesz w rozdziale 14.
Description Ta waciwo umoliwia podanie opisu metody, ktra bdzie
przekazywana klientom. Opis podany za jej porednictwem bdzie take
dostpny na stronie opisu serwisu sieci WWW. Domylna warto tej
waciwoci to String.Empty.
EnableSession Ta waciwo okrela czy dla danej metody naley wczy sesj czy nie.
Jeli sesja jest uywana (a tak si dzieje domylnie) to w metodzie bdzie
mona zapamitywa dane przy uyciu obiektu Session. Jeli jednak nie
ma koniecznoci zapisywania danych w zmiennych sesyjnych, to mona
wyczy t opcj. Wyczenie obsugi sesji umoliwia poprawienie
efektywnoci dziaania metody.
MessageName Ta waciwo okrela nazw uywan przez dane przesyane do oraz z
serwisu sieci WWW do wywoania tej metody. Domylnie nazwa ta
odpowiada nazwie metody sieci WWW.
Waciwo ta jest przewanie stosowana w celu zapewnienia unikalnoci
nazw metod. Na przykad, jeli dysponujemy dwiema przecionymi
metodami Add, ktre rni si typami pobieranych argumentw, to
dziki waciwoci MessageName mona im nada unikalne nazwy.
Warto tej waciwoci musi by unikalna w obrbie danego serwisu
sieci WWW.
TransactionOption Podobnie jak operacje na bazach danych, take i wywoania metod sieci
WWW mog by traktowane jako transakcje. Cay kod wykonywany
wewntrz transakcji zostanie wykonany poprawnie, lub w ogle nie
zostanie wykonany. Jeli podczas wykonywania jednego z wierszy kodu
pojawi si bd, to realizacja metody zostanie przerwana a wyniki
dziaania wszystkich wykonanych wiersz bd odtworzone. Wicej
informacji na temat transakcji znajdziesz w rozdziale 12., pt.:
Zastosowanie zaawansowanych technik obsugi danych.
Waciwo ta moe przyjmowa nastpujce wartoci:
Disabled metoda jest wykonywana bez wykorzystania transakcji;

NotSupported wykorzystanie transakcji nie jest moliwe;


Supported mona korzysta z transakcji, lecz metoda nie jest
wykonywana wewntrz adnej transakcji;
Required uycie transakcji jest wymagane, naley utworzy now
transakcj;
RequiresNew uycie transakcji jest wymagane, naley utworzy
now transakcj.
TypeID Unikalny identyfikator okrelajcy dany atrybut. Ta waciwo pomaga
w rozrnianiu atrybutw o identycznych typach.

Uruchamianie serwisw sieci WWW


Uruchomienie serwisu sieci WWW jest bardzo prostym zadaniem. Poniewa wirtualna maszyna
CLR w caoci zarzdza aplikacjami ASP.NET, wystarczy jedynie skopiowa wybrane pliki
.asmx, .disco oraz potrzebne obiekty biznesowe do odpowiedniego folderu. Uruchamianie
aplikacji nigdy nie byo prostsze!
Bardzo czsto w folderach zawierajcych serwisy sieci WWW tworzone s pliki konfiguracyjne
web.config. Bardzo czsto twrcy serwisw bd chcieli wykorzysta jakie mechanizmy
zabezpiecze, ktre uniemoliwi niepowoanym osobom wykorzystanie efektw ich pracy.
Przykadowo, jeli stworzye serwis sieci WWW dla jakiej firmy, to zapewne, bdzie on
wykorzystywany przez ni do zarabiania pienidzy. Gdyby wszyscy mieli nieograniczony dostp
do tego serwisu, firma nigdy by nic nie zarobia. Zabezpieczanie serwisw sieci WWW zapobiega
takim sytuacjom i pozwala na kontrol dostpu do serwisu. Zagadnienia dotyczce zabezpieczania
serwisw sieci WWW zostan omwione w kolejnym rozdziale.

Ostrzeenie
Folder w ktrym zostanie umieszczony serwis sieci WWW musi zosta oznaczony jako folder
aplikacji Internet Information Servera (IIS). W przeciwnym razie, serwis nie bdzie mg by
wykonywany i nie bdzie dostpny dla klientw.

Wszystkie foldery, ktre pozwalaj na wykonywanie stron ASP.NET s folderami aplikacji IIS.

Tworzenie serwisw sieci WWW na


podstawie istniejcych obiektw
biznesowych
Serwisy sieci WWW mona take tworzy na podstawie istniejcych obiektw biznesowych,
dziki czemu nie trzeba ponownie implementowa wszystkich moliwoci funkcjonalnych.
Niemniej jednak, aby wykorzysta obiekty biznesowe w serwisach sieci WWW trzeba je bdzie
nieco zmodyfikowa.
Zobaczmy zatem, jak naley zmodyfikowa obiekt biznesowy obsugujcy baz danych
(stworzony w poprzednim rozdziale), tak aby mona go byo wykorzysta z serwisie sieci WWW.
Aby zamieni nasz obiekt biznesowy w serwis naley wykona trzy czynnoci: poda, e obiekt
ten jest klas potomn klasy System.Web.Services.WebService, doda atrybut WebMethod
do deklaracji metod, ktre maj by udostpniane przez serwis oraz zastpi wykorzystywany
obiekt OleDbDataReader obiektem DataSet, ktrego zawarto mona przekaza w formie
danych XML (w dalszej czci rozdziau dokadniej opisz to zagadnienie). Zmodyfikowana
wersja naszego obiektu biznesowego, noszca teraz nazw DatabaseSerivce, zostaa
przedstawiona na listingu 16.4.
Listing 16.4. Przeksztacenie obiektu biznesowego Database do postaci serwisu sieci WWW
(DatabaseService.vb).
1 Imports System
2 Imports System.Data
3 Imports System.Data.OleDb
4 Imports System.Web.Services
5
6 Namespace ASPNETDK
7
8 Public Class DatabaseService : Inherits WebService
9 private objConn as OleDbConnection
10 private objCmd as OleDbCommand
11
12 <WebMethod()> Public Function SelectSQL(strSelect as _
13 string) as DataSet
14 try
15 objConn = new OleDbConnection("Provider=" & _
16 "Microsoft.Jet.OLEDB.4.0;" & _
17 "Data Source=C:\ASPNET\data\banking.mdb")
18 dim objDataCmd as OleDbDataAdapter = new _
19 OleDbDataAdapter(strSelect, objConn)
20
21 Dim objDS as new DataSet
22 objDataCmd.Fill(objDS, "tblUsers")
23 return objDS
24 catch ex as OleDbException
25 return nothing
26 end try
27 end function
28
29 <WebMethod()> Public Function ExecuteNonQuery(strQuery _
30 as string) as Boolean
31 try
32 objConn = new OleDbConnection("Provider=" & _
33 "Microsoft.Jet.OLEDB.4.0;" & _
34 "Data Source=C:\ASPNET\data\banking.mdb")
35 objCmd = new OleDbCommand(strQuery, objConn)
36 objCmd.Connection.Open()
37 objCmd.ExecuteNonQuery
38 objCmd.Connection.Close()
39 return true
40 catch ex as OleDbException
41 return false
42 end try
43 end function
44
45 End Class
46
47 End Namespace

W wierszu 4. importowana jest dodatkowa przestrze nazw System.Web.Services.


Deklaracja umieszczona w wierszu 8. informuje, e klas bazow naszego serwisu jest klasa
WebService, zdefiniowana w przestrzeni nazw zaimportowanej w wierszu 4. Kolejn
modyfikacj wprowadzona w kodzie naszego obiektu biznesowego s atrybuty <WebMethod()>
dodane do metod, ktre bdzie udostpnia tworzony serwis. I w kocu, w metodzie SelectSQL
obiekty OleDbDataReader i OleDbCommand zostay odpowiednio zastpione obiektami
DataSet oraz OleDbDataAdapter. I to wszystko. Teraz wystarczy ponownie skompilowa plik
posugujc si przy tym nastpujcym poleceniem:
vbc /t:library /out:..\bin\ASPNETDK.dll /r:System.dll
/r:System.Data.dll /r:System.Web.Services.dll /r:System.Xml.dll
DatabaseService.vb ..\rozdzial15\User.vb

Powysze polecenie kompiluje nowy plik DatabaseService.vb oraz plik User.vb z poprzedniego
rozdziau i generuje bibliotek DLL o nazwie ASPNETDK.dll. W poleceniu zostay take
wykorzystane dwie nowe biblioteki System.Web.Services.dll oraz System.Xml.dll. Powd
wykorzystania pierwszej z nich jest chyba oczywisty; odwoanie do drugiej zostao uyte gdy
zawiera ona metody konieczne do przesania zawartoci obiektu DataSet w formie danych XML.
Wicej informacji na temat kompilator jzyk VB.NET znajdziesz w poprzednim rozdziale, pt.:
Zastosowanie obiektw biznesowych.
Notatka !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Teraz nowe obiekty powinny ju by zapisane w pamici podrcznej komponentw .NET, gdzie
ASP.NET bdzie w stanie je zaadowa i uy. Teraz nadszed czas, aby stworzy plik .asmx,
ktry pozwoli klientom korzysta z naszego nowego obiektu. Zosta on przedstawiony na listingu
16.5.

Listing 16.5. Plik .asmx umoliwiajcy wykorzystanie serwisu DatabaseService.


1 <%@ WebService Class="ASPNETDK.DatabaseService" %>

To naprawd wszystko! Jedyn rzecz jak trzeba zrobi aby mc skorzysta z naszego nowego
serwisu sieci WWW, jest zmiana nazwy klasy. Teraz zapisz ten plik pod nazw Database.asmx i
wywietl go w przegldarce. Na wywietlonej stronie powiniene przekona si, e nasz serwis
udostpnia dwie metody SelectSQL oraz SelectNonQuery.

Ostrzeenie
Jeli w serwisie sieci WWW chcesz uywa jakiegokolwiek prekompilowanego obiektu, to musi
on zosta umieszczony w pamici podrcznej komponentw .NET (czyli folderze /bin). W
przeciwnym bowiem razie ASP.NET nie bdzie w stanie go odnale.

Kliknij poczenie z metod SelectSQL i w testowym formularzu wywietlonym na samym


pocztku strony wpisz nastpujce zapytanie SQL: SELECT * FROM tblUsers. Kliknij przycisk
Invoke. Na ekranie powinno pojawi si nowe okno przegldarki, a w nim nowa strona
przypominajce t przedstawion na rysunku 16.8.
Rysunek 16.8. Informacje zwrcone przez serwis DatabaseService

Dokument XML przedstawiony na rysunku 16.8 definiuje struktur obiektu DataSet zwrconego
przez nasz serwis sieci WWW. Przegldajc dalsz cz strony mona w niej znale take
faktyczne informacje pobrane z bazy danych. Klient ktry pobierze ten dokument, w razie
koniecznoci nie bdzie mia adnych problemw z przeksztaceniem jego zawartoci do postaci
obiektu DataSet.
Zwracanie informacji przez serwisy sieci
WWW
Jak pokazaem we wczeniejszej czci rozdziau, serwisy sieci WWW mog zwraca dane
przernych typw. Moliwo ta jest dostpna gdy serwisy zostay stworzone na podstawie
technologii wykorzystujcej jzyk XML, stanowicy niezwykle potne narzdzie reprezentacji
danych. Cho XML jest jzykiem tekstowym, wykorzystywany w nim system nazewnictwa typw
sprawia, e inne aplikacje nie maj wikszych problemw z okrelenie typw przesyanych
informacji.
Oto przykad. Doskonale wiemy, e obiekty DataSet s reprezentowane w pamici komputera
gwnie jaki dane XML, a zatem nie trudno domyli si, e obiekty te mog by przesyane w
formie dokumentw XML. Jzyk XML jest take w stanie reprezentowa inne typy danych, takie
jak acuchy znakw, liczby cakowite, tablice, obiekty DataTime, itd. W tabeli 16.2 zostay
przedstawione rne typy danych, ktre mog zwraca serwisy sieci WWW.

Tabela 16.2. Typy danych, ktre mog by zwracane przez serwisy sieci WWW.
Typ Opis
Tablice Serwisy sieci WWW s w stanie przesya tablice zawierajce dane
dowolnych typw podanych w dalszej czci tej tabeli, w tym: obiekty klas
DataSet i XmlNode, podstawowe typy danych oraz klasy.

Klasy Klasy posiadajce publiczne waciwoci.


Zbiory danych Informacje przechowywane w obiektach klasy DataSet s zapisane w
(DataSet) formie danych XML, a zatem serwisy sieci WWW nie maj adnych
problemw ich wykorzystaniem.
Naley pamita, i s to jedyne zbiory danych ADO.NET ktre mona
przesya. Obiekty klasy DataReader nie daj ju tych moliwoci.
Typy podstawowe Podstawowe typy danych to: byte, Boolean, char, DateTime, Decimal,
Double, GUID, int32, int64, uing16, uint32, uint64 oraz
XmlQualifiedName.

Klasy XmlNode Obiekty klasy XmlNode rodowiska .NET su do reprezentacji danych


XML w pamici komputera. Wicej informacji na ten temat znajdziesz w
rozdziale 11., pt.: Uycie XML w ASP.NET.

Serwisy sieci WWW mog zwraca dane wszystkich typw przedstawionych w tabeli 16.2; jednak
ilo typw danych, ktrych mona uy w celu przekazania informacji do serwisu, jest znacznie
bardziej ograniczona.
W przypadku przekazywania polece i parametrw z klienta do serwisu przy wykorzystaniu
protokou SOAP, mona stosowa wszystkie typy danych podane w tabeli 16.2. Jest to moliwe
gdy protok ten bazuje na jzyku XML.
Jednak w przypadku przekazywania danych przy uyciu protokow Http-Get lub Http-Post
dostpne moliwoci ograniczaj si do typw danych obsugiwanych przez te protokoy. S to
wybrane typy podstawowe oraz tablice zawierajce dane tych typw. Oba te protokoy pozwalaj
wycznie na wysyanie par nazwa-warto, co automatycznie wyklucza moliwo przesyania
bardziej zoonych struktur danych, takich jak klasy orz zbiory danych.
To nie jest ASP!
Serwisy sieci WWW s cakowicie nowym zagadnieniem wprowadzonym w technologii
ASP.NET. A zatem, jeli jeste programist, ktry do tej pory uywa tradycyjnej technologii
ASP, to poznae co zupenie nowego. Niemniej jednak kluczowe zaoenia zwizane z
wykorzystaniem serwisw sieci WWW, jak na przykad wzajemna komunikacja cakowicie
niezalenych systemw, przypominaj cele technologii COM (Component Object Model). (Wicej
informacji na temat obiektw COM znajdziesz w poprzednim rozdziale.)
Celem technologii COM byo umoliwienie tworzenia aplikacji zoonych z rnych
komponentw. Dziki temu, i obiekty te komunikoway si przy wykorzystaniu protokou COM,
mona je byo tworzy w rnych jzykach programowania. Jednak technologia ta miaa jedno
powane ograniczenie mona j byo stosowa tylko w systemach Windows.
Serwisy sieci WWW id znacznie dalej, gdy do komunikacji pomidzy obiektami nie
wykorzystuj adnych firmowych protokow ani nie przesyaj informacji w sposb binarny.
Serwisy sieci WWW bazuj wycznie na otwartych standardach, takich jak XML i HTTP.
Oznacza to, i zapewniaj one niczym nie ograniczone moliwoci wzajemnego wspdziaania
cakowicie niezalenych systemw informatycznych.
Sam pomys tworzenia aplikacji dostpnych i uywanych za porednictwem Internetu, nie jest
jednak cakiem nowy. Wczeniejsze prby jego realizacji, podobne do technologii COM,
bazoway na wykorzystaniu zoonych, opatentowanych standardw, ktre w powanym stopniu
ograniczay moliwoci ich zastosowania. Niezwyka efektywno serwisw sieci WWW wynika
z prostoty protokou HTTP i jzyka XML.
Rozdzia 17.
Wykorzystanie i
zabezpieczanie serwisw
sieci WWW
W poprzednim rozdziale podane zostay wszystkie informacje konieczne do tworzenia serwisw
sieci WWW czym one s, dlaczego warto ich uywa oraz jak naley je tworzy. Take ten
rozdzia bdzie powicony serwisom sieci WWW, lecz skoncentrujemy si w nim na sposobach
wykorzystania serwisw za porednictwem stron ASP.NET.
W tym rozdziale zostan omwione nastpujce zagadnienia:
W jaki sposb korzysta z procesu odkrywania w celu zdobycia informacji o istniejcych
serwisach sieci WWW.
Jak mona generowa klasy poredniczce, zapewniajce dostp do serwisw.
Jak implementowa klasy poredniczce na stronach ASP.NET.
W jaki sposb mona zabezpiecza serwisy przy uyciu nagwkw SOAP.

Wykorzystanie serwisw sieci WWW


W poprzednim rozdziale dowiedziae si w jaki sposb mona uywa serwisw sieci WWW do
tworzenia usug, z ktrych mona korzysta za porednictwem Internetu. Na przykad, witryna
moe udostpnia pewien zbir funkcji realizujcych obliczenia finansowe. Kiedy taki serwis
zostanie opracowany i udostpniony na witrynie, kady bdzie mg j odwiedzi i skorzysta z
oferowanych moliwoci funkcjonalnych.
Nowe okrelenie
Zamy, e twrca internetowej aplikacji bankowej chciaby wykorzysta dostpny serwis
oblicze finansowych, aby wykona interesujce go kalkulacje dotyczce CD-ROM-w. A zatem,
tworzona przez niego aplikacja bankowa musi wykorzysta (innymi sowy uzyska dostp i
uy) metody tego serwisu. Wykorzystanie serwisu sieci WWW oznacza po prostu uycie
udostpnianych przez niego moliwoci przez klienta. Uytkownicy witryny bankowej mog
uywa funkcji kalkulatora nie wiedzc nawet kto je wykonuje.
Gdy odwiedzasz stacj benzynow, jej obsuga wiadczy Ci okrelone usugi. Korzystajc z tych
usug stajesz si automatycznie ich konsumentem. Moesz wykorzysta wszelkie usugi i zasoby
udostpniane przez stacj benzynow dystrybutory paliwa, czas i prac zatrudnionych na niej
osb oraz wszelkie inne dobra, ktre mona na niej kupi. (Oczywicie za usugi te trzeba
zapaci, jednak naszym przypadku nie ma to na razie znaczenia.) Wykorzystanie usug
wiadczonych przez stacj benzynow umoliwia Ci uniknicie koniecznoci posiadania wasnego
dystrybutora paliwa oraz naprawy i konserwacji samochodu.
Klienci korzystajcy z serwisw sieci WWW robi dokadnie to samo. Odwiedzaj serwis i
korzystaj z zasobw, ktre udostpnia. Na przykad, Twj komputer mgby korzysta z serwisu
realizujcego przetwarzanie tekstw. W takim przypadku, wszystkie jego moliwoci
funkcjonalne byyby dla Ciebie dostpne, co oznacza, e nie musiaby kupowa, ani instalowa
edytora tekstw.
Klientami uywajcymi serwisw sieci WWW mog by niemal wszystkie aplikacje
komputery, strony ASP.NET lub nawet urzdzenia przenone, takie jak telefony komrkowe! W
tym rozdziale skoncentrujemy si na zagadnieniach zwizanych z wykorzystaniem serwisw sieci
WWW z poziomu stron ASP.NET.
Proces wykorzystania serwisu sieci WWW skada si z trzech etapw:
1. Zdobycia informacji o serwisie poprzez wykorzystanie mechanizmw odkrywania.
2. Stworzenia klasy poredniczcej w dostpie do serwisu.
3. Uycia klasy poredniczcej do wywoywania metod udostpnianych przez serwis.

Ostrzeenie
Nie naley myli klienta serwisu sieci WWW z klientem internetowym. Pierwszy z nich to
aplikacja lub witryna WWW wykorzystujca usugi udostpniane przez serwis sieci WWW.
Klientem internetowym nazywamy natomiast program sucy do przegldania zasobw
Internetu na przykad, przegldark WWW. Klient serwisw sieci WWW korzysta z
moliwoci udostpnianych przez te serwisy, natomiast klient internetowy z witryn WWW.
Oba te klienty maj ze sob bardzo niewiele wsplnego i zanim zaczniesz tworzy klientw
serwisw sieci WWW, powiniene dobrze zrozumie t rnic.

Zapewne przypominasz sobie, e odkrywanie jest procesem umoliwiajcym klientom


zdobywanie informacji o serwisach sieci WWW. Idc do nowej restauracji, pierwsz rzecz jak
robimy, jest przegldnicie menu i sprawdzenie jakie potrawy mona zamwi. W ten sam sposb
postpuj programy korzystajce z serwisw sieci WWW zanim bd w stanie wykorzysta
moliwoci serwisu, musz je okreli.
Informacje te s dostpne jako opis serwisu sieci WWW (wicej na jego temat znajdziesz w
poprzednim rozdziale). Przypominasz sobie zapewne, e opis ten jest plikiem XML
wygenerowanym przez sam serwis. Klient uywa tego pliku do okrelenia moliwoci serwisu;
mona by rzecz, e analizujc go czyta menu udostpnianych moliwoci funkcjonalnych. Klient
moe take stworzy wasn kopi tego menu, ktra moe mu si przyda w przyszoci.
Czy przypominasz sobie pliki .disco o ktrych bya mowa w poprzednim rozdziale? S one
tworzone wycznie po to, aby pomaga klientom serwisw sieci WWW. Pliki te zawieraj
poczenia z opisami serwisw sieci WWW udostpnianymi na serwerze, ktre z kolei pozwalaj
klientom na zdobycie informacji o sposobach wykorzystania serwisw. Warto zauway, i
klienty wcale nie musz korzysta z plikw .disco jeli znaj adres opisu serwisu, mog
odwoa si bezporednie do niego.
Ciekawym etapem wykorzystania serwisw sieci WWW jest generacja klasy poredniczcej. Oto
analogia, ktra przedstawia przeznaczenie takiej klasy. Zamy, e chciaby pojecha do
restauracji, ale nie masz wanego prawa jazdy. Udaje Ci si jednak przekona swoj matk, aby
zawioza Ci do restauracji wasnym samochodem. Mona powiedzie, e matka dziaa na Twoj
rzecz, zawoc Ci tam, gdzie samemu nie byby w stanie si dosta. Innymi sowy, Twoja matka
staje si porednikiem pomidzy Tob a restauracj.
W podobny sposb dziaaj klienty uywajce serwisw sieci WWW. Wiedz one, e gdzie jest
dostpny serwis, jednak nie mog samodzielnie skorzysta z jego moliwoci. Takie klienty
potrzebuj pomocy porednika, ktry bdzie w stanie udostpni im mechanizmy przesyania
danych do i z serwisu sieci WWW.
Wykorzystujc serwis sieci WWW z poziomu stron ASP.NET, chcemy aby uycie jego
moliwoci byo moliwie jak najprostsze. Nie chcemy zawraca sobie gowy przesyaniem
komunikatw XML, konwersj wykonywanych polece do odpowiedniego formatu ani
pobieraniem zwracanych informacji. W optymalnym przypadku chcielibymy korzysta z serwisu
sieci WWW jak gdyby byo on obiektem biznesowym przechowywanym na lokalnym
komputerze. A zatem chcielibymy, aby wykorzystanie serwisu sprowadzio si do utworzenia
obiektu jakiej klasy i posugiwania si jego metodami.
Wanie do tego celu suy klasa poredniczca. Klasa ta znajduje si na komputerze uytkownika
i zawiera wszystkie zoone mechanizmy konieczne do wymiany informacji z serwisem sieci
WWW. Dziki niej interakcja z serwisem moe by realizowana w taki sam sposb jak
wykorzystanie dowolnego innego obiektu. W rzeczywistoci, klasa poredniczce bdzie zawiera
metody i waciwoci odpowiadajce metodom i waciwociom udostpnianym przez serwis sieci
WWW; nawet ich nazwy bd identyczne. A zatem, wiedzc jakie metody udostpnia serwis sieci
WWW, bdzie mona wywoa odpowiednie metody klasy poredniczcej. Proces wykorzystania
klasy poredniczcej zosta przedstawiony na rysunku 17.1.

Rysunek 17.1. Klasa poredniczca dziaa jako warstwa porednia pomidzy klientem a
serwisem sieci WWW
Opis rysunku
Client Klient
ASP.NET page Strona ASP.NET
Proxy class Klasa poredniczca
Send XML Wysya dane XML
Receive data Odbiera dane
Web Service Serwis sieci WWW

Klasa poredniczca jest generowana na podstawie informacji zawartych w opisie serwisu sieci
WWW. Analizujc go, klasa jest w stanie zdoby wszelkie konieczne informacje na temat sposobu
przesyania polece oraz zwracanych wynikw. Wicej informacji na ten temat znajdziesz w
dalszej czci rozdziau, pt.: Wykorzystanie serwisw sieci WWW w stronach ASP.NET.
Klient korzystajcy z serwisu sieci WWW moe uy klasy poredniczcej take do wywoywania
metod serwisu. Czynnoci te niczym si nie rni od sposobw wywoywania metod dowolnych
obiektw. Cay ten proces jest cakowicie niewidoczny dla uytkownika, a jego implementacja nie
powinna przysporzy programistom adnych trudnoci. Czynnoci zwizane z wykorzystaniem
serwisu sieci WWW zostay przedstawione na rysunku 17.2.

Rysunek 17.2. Wykorzystania serwisu sieci WWW jest procesem skadajcym si z trzech etapw
Opis rysunku
Client Klient
Web Service Serwis sieci WWW
1. 1. Analiza opisu serwisu
2. 2. Generacja klasy poredniczcej
3. 3. Wykorzystanie metod serwisu za porednictwem klasy poredniczcej
Proxy Klasa poredniczca

Notatka
Serwisy sieci WWW s najczciej uywane przez strony WWW oraz inne serwisy sieci WWW.
Wykorzystywanie serwisw sieci WWW przez zwyczajne aplikacje take nie naley do
rzadkoci.
Wykorzystanie serwisw sieci WWW w
stronach ASP.NET
Ju raz bylimy uytkownikami serwisu sieci WWW. Ogldajc opis serwisu oraz stron opisu
(patrz poprzedni rozdzia) wykonalimy te same czynnoci, ktre wykonuje klient serwisu. Jedyna
rnica polega na tym, i my wywoywalimy je bezporednio, a nie przy uyciu klasy
poredniczcej.
W kolejnych trzech podrozdziaach zostan opisane sposoby realizacji trzech etapw
wykorzystania serwisu sieci WWW (odkrycia, generacji klasy poredniczcej oraz implementacji)
na stronach ASP.NET; przy czym do komunikacji z serwisem uyty zostanie protok SOAP.
Realizacja pierwszych dwch etapw, wymaga wykorzystania narzdzi uruchamianych z poziomu
wiersza polece systemu. Natomiast dziki uyciu klasy poredniczcej, trzeci etap wykorzystania
serwisu implementacja niczym si nie rni od korzystania z obiektw biznesowych.

Proces odkrywania serwisu


Proces odkrywania serwisw dostpnych na wskazanej witrynie WWW mona wykona przy
uyciu programu disco.exe. Program ten przeszukuje witryny WWW i zwraca kopie plikw .disco
dostpnych na danym serwerze. Te lokalne kopie plikw .disco mona nastpnie wykorzysta przy
generacji klasy poredniczcej.
Zobaczmy jak to wyglda w praktyce. Otwrz okno wiersza polece i przejd do folderu
c:\inetpub\wwwroot\aspnetdlakazdego\rozdzial17. Zakadam, e zgodnie z informacjami
podanymi w poprzednim rozdziale stworzye plik Calculator.disco i umiecie go w gwnym
folderze aplikacji aspnetdlakazdego. Jeli tak, to w oknie wiersza polece wpisz nastpujce
polecenie:
disco http://localhost/aspnetdlakazdego/rozdzial16/Calculator.disco

(Sposb uycia tego programu zostanie bardziej szczegowo opisany w dalszej czci tego
rozdziau.) Program disco.exe wywietla adresy URL plikw .disco dostpnych na wskazanym
serwerze (patrz rysunek 17.3).

Rysunek 17.3. Wyniki wykonania programu disco.exe

Domylnie program ten generuje take dwa pliki o nazwach results.discomap oraz services.disco.
Pierwszy z nich results.discomap zawiera informacje o wynikach wykonania programu.
Mona w nim znale dane o plikach .disco odnalezionych na serwerze, oraz o pooeniu ich
lokalnych kopii. Drugi plik services.disco zawiera te same informacje co odnaleziony plik
.disco. Oba te pliki s zapisane w jzyku XML, dziki czemu atwo mona je odczyta i
przeanalizowa. Typowa zawarto pliku services.disco zostaa przedstawiona na rysunku 17.4.

Rysunek 17.4. Plik XML services.disco wywietlony w przegldarce

Listing 17.1 przedstawia zawarto pliku results.discomap, w ktrym zostay zapisane


szczegowe informacje o wynikach realizacji procesu odkrywania.

Listing 17.1. Zawarto pliku results.discomap


1 <?xml version="1.0" encoding="utf-8"?>
2 <DiscoveryClientResultsFile
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
5 <Results>
6 <DiscoveryClientResult referenceType="System.Web.
7 Services.Discovery.DiscoveryDocumentReference"
8 url="http://localhost/aspnetdlakazdego/rozdzial16/
9 Calculator.disco" filename="Calculator.disco" />
10 </Results>
11 </DiscoveryClientResultsFile>

Analiza
Powyszy plik zawiera wyniki wykonania procesu odkrywania przeprowadzonego na podanym
serwerze. Interesujcy nas fragment tego pliku zosta zapisany wewntrz znacznikw Results.
Uyty w wierszu 4. atrybut referenceType okrela typ analizowanego pliku. W naszym
przypadku jest to dokument procesu odkrywania. Atrybut url okrela natomiast adres
odnalezionego pliku .disco. Kolejny atrybut filename podaje nazw lokalnej kopii pliku
.disco. Plik ten moe zosta wykorzystany pniej, podczas generacji klasy poredniczcej.
W wywoaniu programu disco.exe mona uy 6 parametrw; zostay one opisane w tabeli 17.1.

Tabela 17.1. Parametry wywoania programu disco.exe.


Parametr Opis
/nologo Zapobiega wywietlaniu informacji o firmie Microsoft, generowanych przez ten
program.
/nosave Informuje, e wyniki wykonania procesu odkrywania nie powinny by
zapisywane w pliku.
/out Okrela folder, w jakim maj zosta zapisane wyniki wykonania programu.
Wartoci domyln tego parametru jest biecy folder.
/username Okrela nazw uytkownika jak naley poda aby uzyska dostp do serwera.
/password Okrela haso ktre zapewnia dostp do serwera.
/domain Okrela nazw domeny jakiej naley uy by uzyska dostp do serwera.

Przedstawione poniej przykadowe polecenie zapobiega wywietlaniu informacji o firmie


Microsoft i okrela, e wyniki maj by zapisane w folderze c:\temp\disco:
disco /nologo /out:c:\temp\disco
http://localhost/aspnetdlakazdego/Services.disco

Tworzenie klasy poredniczcej


Zgodnie z tym co podaem wczeniej, klasa poredniczca peni funkcj warstwy poredniej
pomidzy serwisem sieci WWW a klientem ktry z tego serwisu chce skorzysta. Klasa ta zawiera
wszelki moliwoci funkcjonalne konieczne do przesyania danych przez Internet, dziki czemu
programici nie musz implementowa ich we wasnym zakresie. Za chwil przekonasz si, e
klasa ta wyglda bardzo podobnie do pliku .asmx przechowywanego na serwerze, na ktrym
dziaa serwis sieci WWW, rni si jednak od niego wywoaniami kilku metod.
Klasa poredniczca generowana jest przy uyciu kolejnego programu wsdl.exe. Program ten
analizuje plik .discomap lub XML-owy opis serwisu dostpny bezporednio na serwerze i na ich
podstawie tworzy klas ktrej metody idealnie odpowiadaj metodom udostpnianym przez serwis
sieci WWW. To podobiestwo metod serwisu i klasy poredniczcej ma sprawi, e uycie tej
klasy bdzie moliwie niewidoczne. Strona ASP.NET korzystajca z serwisu moe zosta
stworzona w taki sposb, jak gdyby komunikowaa si z nim bezporednio. Co wicej, program
wsdl.exe generuje metody i uywa atrybutw dziki ktrym klasa poredniczca bdzie w stanie
przesya dane przez Internet.
Oczywicie klas poredniczc mona take stworzy rcznie, ale dlaczego mielibymy utrudnia
sobie ycie, skoro program wsdl.exe moe j wygenerowa za nas? (Jeli jednak jeste
zdecydowany by wasnorcznie napisa klas poredniczc, to w dalszej czci rozdziau
znajdziesz informacje o wszelkich wymaganiach jakie musi ona spenia.)

Notatka
Zwr uwag, e program wsdl.exe moe bezporednio przeanalizowa opis serwisu sieci
WWW. Oznacza to, e jeli znany jest adres URL tego opisu, to nie trzeba wczeniej korzysta
z programu disco.exe.

Sprawdmy jak to wyglda w praktyce. W oknie wiersza polece wpisz i wykonaj nastpujce
polecenie:
wsdl /language:VB
http://localhost/aspnetdlakazdego/rozdzial16/Calculator.asmx?WSDL

Posta wywoania tego programu zostanie opisana w dalszej czci tego rozdziau. Jak na razie
wystarczy aby wiedzia, e pierwszy parametr /language okrela jzyk w jakim ma
zosta wygenerowana klasa poredniczca (w tym przypadku jest to jzyk VB.NET). Drugi
parametr wywoania programu okrela adres URL opisu serwisu. (Adres ten poznalimy w
poprzednim rozdziale, pt.: Tworzenie serwisw sieci WWW.)
Po wykonaniu programu w sposb przedstawiony na powyszym przykadzie, na ekranie pojawi
si komunikaty o nastpujcej postaci:
wsdl /language:VB http://localhost/aspnetdlakazdego/rozdzial16/
Calculator.asmx?WSDL
Microsoft (R) Web Services Description Language Utility
[Microsoft (R) .NET Framework, Version 1.0.2914.16]
Copyright (C) Microsoft Corp. 1998-2001. All rights reserved.
Writing file 'C:\Inetpub\wwwroot\aspnetdlakazdego\rozdzial17\Calculator.vb'.

Zwr uwag, e program wygenerowa klas jzyka VB.NET i zapisa j w pliku Calculator.vb.
Jest to nasza klasa poredniczca. Warto powieci nieco czasu na przeanalizowanie utworzonego
pliku. (Mona go bdzie znale w tym samym folderze w ktrym zosta wykonany program
wsdl.exe.) Kod naszej przykadowej klasy poredniczcej zosta przedstawiony na listingu 17.2.

Listing 17.2. Wygenerowany plik Calculatro.vb.


1 '-----------------------------------------------------------------------
2 ' <autogenerated>
3 ' This code was generated by a tool.
4 ' Runtime Version: 1.0.2914.16
5 '
6 ' Changes to this file may cause incorrect behavior and will be lost
if
7 ' the code is regenerated.
8 ' </autogenerated>
9 '-----------------------------------------------------------------------
10
11 Option Strict Off
12 Option Explicit On
13
14 Imports System
15 Imports System.Diagnostics
16 Imports System.Web.Services
17 Imports System.Web.Services.Protocols
18 Imports System.Xml.Serialization
19
20 '
21 'This source code was auto-generated by wsdl, Version=1.0.2914.16.
22 '
23
24 <System.Web.Services.WebServiceBindingAttribute(Name:="CalculatorSoap",
[Namespace]:="http://tempuri.org/")> _
25 Public Class Calculator
26 Inherits System.Web.Services.Protocols.SoapHttpClientProtocol
27
28 <System.Diagnostics.DebuggerStepThroughAttribute()> _
29 Public Sub New()
30 MyBase.New
31 Me.Url =
"http://localhost/aspnetdlakazdego/rozdzial16/Calculator.asmx"
32 End Sub
33
34 <System.Diagnostics.DebuggerStepThroughAttribute(), _
35 System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://t
empuri.org/Add",
Use:=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle:=System.Web.Services.Protocols.SoapParameterStyle.Wrapped
)> _
36 Public Function Add(ByVal intA As Integer, ByVal intB As Integer) As
Integer
37 Dim results() As Object = Me.Invoke("Add", New Object() {intA,
intB})
38 Return CType(results(0),Integer)
39 End Function
40
41 <System.Diagnostics.DebuggerStepThroughAttribute()> _
42 Public Function BeginAdd(ByVal intA As Integer, ByVal intB As
Integer, ByVal callback As System.AsyncCallback, ByVal asyncState As
Object) As System.IAsyncResult
43 Return Me.BeginInvoke("Add", New Object() {intA, intB},
callback, asyncState)
44 End Function
45
46 <System.Diagnostics.DebuggerStepThroughAttribute()> _
47 Public Function EndAdd(ByVal asyncResult As System.IAsyncResult) As
Integer
48 Dim results() As Object = Me.EndInvoke(asyncResult)
49 Return CType(results(0),Integer)
50 End Function
51 End Class
Analiza
Powysza klasa zostaa automatycznie wygenerowana przez program wsdl.exe w celu uatwienia
czynnoci jakie naley wykona aby skorzysta z serwisu sieci WWW. Naley zauway, i w
porwnaniu z serwisem, klasa ta zawiera dwie dodatkowe metody oraz przerne atrybuty i
waciwoci. Wszystko to sprawia, i jej kod jest stosunkowo trudny do przeanalizowania. Jednak
nie przejmuj si, gdyby nie by w stanie cakowicie go zrozumie. Nie trzeba zna wszystkich
jego tajnikw.
W wierszu 25. deklarowana jest klasa Calculator. Jak wida w jej deklaracji wykorzystany
zosta atrybut WebServiceBindingAttribute dostpny w przestrzeni nazw
System.Web.Services. Atrybut ten definiuje interfejs (czyli zbir metod i waciwoci),
ktrego klasa musi uywa. W rzeczywistoci o atrybucie tym nie trzeba wiedzie niczego wicej.
(Jeli jednak chciaby si czego o nim dowiedzie, to zajrzyj do dokumentacji rodowisk .NET.)
Warto wiedzie, e atrybut ten nie jest niezbdnie konieczny do poprawnego dziaania klas
poredniczcych, niemniej jednak i tak jest on generowany automatycznie.
Klasa poredniczca dziedziczy po klasie SoapHttpClientProtocol (patrz wiersz 26.), ktra
dostarcza metod pozwalajcych na wymian informacji z serwisem Calculator przy
wykorzystaniu protokou SOAP.
W wierszu 29. zapisany zosta konstruktor klasy poredniczcej. Konstruktor jest specjaln
metod uywan do inicjalizacji obiektw danej klasy. Konstruktor ten okrela adres URL serwisu
sieci WWW.
W wierszu 34. rozpoczyna si metoda, ktra nieco przypomina metod Add serwisu sieci WWW
stworzonego w poprzednim rozdziale. W definicji tej metody wykorzystywany jest atrybut
SoapMethodAttribute, ktry dostarcza parametrw wykorzystywanych podczas wymiany
danych pomidzy klas poredniczc a serwisem za porednictwem protokou SOAP. W wierszu
37. metoda ta wywouje metod Invoke, ktra wywouje odpowiedni metod serwisu. Metoda ta
wymaga podania dwch argumentw. Pierwszym z nich jest nazwa wywoywanej metody serwisu
a drugim parametry jakie naley do niej przekaza. Wyniki wykonania tej metody s
zapisywane w tablicy o nazwie results i zwracane (w wierszu 49.).
Kolejne dwie metody definiuj asynchroniczny sposb komunikacji z serwisem sieci WWW.
Wicej informacji na temat wykorzystania asynchronicznych metod znajdziesz w rozdziale 13.,
pt.: Odczytywanie i zapisywanie plikw na serwerze WWW. Oglnie rzecz, w przypadku
wykorzystania metod asynchronicznych mona jednoczenie wywoa metod i wykonywa inny
fragment kodu. Standardowe metody nazywane take metodami synchronicznymi nie
pozwalaj na rwnoczesne wykonywanie adnych innych czynnoci dalszy kod programu
moe by wykonywany dopiero po zakoczeniu realizacji metody.
Klasa poredniczca przedstawiona na powyszym przykadzie, zawiera wszelkie moliwoci
funkcjonalne konieczne do przesania przez Internet dania wykonania okrelonej metody
serwisu, i to przy uyciu rnych protokow (takich jak SOAP lub Http-Get). Dziki niej,
interakcja z serwisem sieci WWW moe do zudzenia przypomina wykorzystania zwyczajnego
obiektu biznesowego. Na szczcie klasy tej nie trzeba tworzy rcznie.
Program wsdl.exe ma kilka parametrw, dziki ktrym mona generowa rnego rodzaju klasy
poredniczce. Oprcz parametrw podanych w tabeli 17.2, program ten akceptuje wszystkie
parametry z tabeli 17.1 za wyjtkiem /nosave.

Tabela 17.2. Parametry programu wsdl.exe.


Parametr Opis
/langauage Jzyk w jakim ma by wygenerowana klasa poredniczca. Jzykiem domylnym
jest C#.
/namespace Przestrze nazw do ktrej ma nalee generowana klasa poredniczca.
Domylnie jest stosowana globalna przestrze nazw.
/protocol Protok jaki ma by uyty do komunikacji z serwisem sieci WWW. Moe to by
SOAP, Http-Get oraz Http-Post; domylnie stosowany jest protok SOAP.

Podpowied
Wiele parametrw wywoania programw wsdl.exe oraz disco.exe ma skrcone formy zapisu.
Na przykad, parametr /language mona take zapisa jako /l. Wicej informacji na temat
sposobu wykorzystania tych programw mona uzyska wydajc polecenia wsdl.exe /? oraz
disco.exe /?.

Ponisze polecenie tworzy klas poredniczc zapisan w jzyku VB.NET, nalec do podanej
przestrzeni nazw i wykorzystujc protok SOAP:
wsdl /l:VB /namespace:MyWebServiceConsumer /protocol:SOAP
http://localhost/aspnetdlakazdego/rozdzial16/Calculator.asmx?WSDL

Implementacja klasy poredniczcej


Ju niemal jestemy gotowi do wykorzystania serwisu sieci WWW na stronie ASP.NET.
Dysponujemy ju klas poredniczc, ktra bdzie prowadzi wymian danych z serwisem,
jednak jeszcze nie moemy jej uy. Przede wszystkim, naley t klas skompilowa do postaci
komponentu (biblioteki DLL), podobnie jak robilimy to w przypadku obiektw biznesowych.
Oczywicie do kompilacji klasy wykorzystamy kompilator jzyka VB.NET (ktrym ju
powiniene umie si posugiwa). W wierszu polece wpisz nastpujce polecenie:
vbc /t:library /out:..\bin\CalculatorServiceClient.dll /r:System.dll
/r:System.Xml.dll /r:System.Web.Services.dll Calculator.vb

Podpowied
Jeli wydawane polecenie jest dugie, skomplikowane i skada si z wielu elementw (tak jak w
przypadku trzech ostatnich polece wykorzystujcych programy disco.exe, wsdl.exe oraz
vbc.exe) to czasami warto zapisa je w pliku wsadowym (.bat). Dziki temu mona unikn
koniecznoci cigego wpisywania tego samego polecenia (lub polece).

Aby utworzy plik wsadowy, stwrz zwyczajny plik tekstowy i nadaj mu rozszerzenie .bat, a
nastpnie skopiuj do niego polecenia ktre chcesz wykona, umieszczajc kade z nich w
osobnym wierszu. Dziki temu, gdy uruchomisz ten plik, wszystkie zapisane w nim polecenia
zostan automatycznie wykonane.

Ostrzeenie
Zauwa, i podczas kompilacji klasy poredniczcej moe si pojawi kilka bdw zwizanych
ze sposobem zapisu atrybutw metod. W takim przypadku przenie te atrybuty i umie je na
samym pocztku definicji metody (przed sowem kluczowym Public oraz jej nazw). Moe si
zdarzy, i dodatkowo bdziesz musia usun z definicji metody Add nastpujce waciwoci:
Use:=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle:=System.Web.Services.Protocols.SoapParameterStyle.
Wrapped

Powysze polecenie spowoduje skompilowanie klasy poredniczcej i zapisanie jej w pliku DLL,
ktry zostanie umieszczony w folderze \bin, czyli pamici podrcznej komponentw .NET. Teraz
bdzie ju mona uy tego komponentu na stronie ASP.NET, aby za jego porednictwem
korzysta z serwisu sieci WWW. Przykad prostej strony ASP.NET korzystajcej z serwisu sieci
WWW zosta przedstawiony na listingu 17.3.
Listing 17.3. Uycie serwisu sieci WWW na stronie ASP.NET.
1 <%@ Page Language="VB" %>
2
3 <script runat="server">
4 sub Page_Load(obj as object, e as eventargs)
5 dim objCalc as new Calculator
6
7 lblMessage.Text = objCalc.Add(1,5)
8 end sub
9 </script>
10
11 <html><body>
12 Wynikiem dodawania 1 + 5 jest liczba:
13 <asp:Label id="lblMessage" runat="server"/>
14 </body></html>

Analiza
Strona ASP.NET przedstawiona na listingu 17.3 jest bardzo prosta. W procedurze Page_Load
rozpoczynajcej si w wierszu 4. tworzony jest obiekt klasy Calculator (stworzonej przed
chwil klasy poredniczcej). Obiekt ten reprezentuje nasz przykadowy serwis sieci WWW
stworzony w poprzednim rozdziale. Sposb wykorzystania tego obiektu niczym si nie rni od
sposobu bezporedniego wykorzystania serwisu sieci WWW. Innymi sowy, gdyby udostpni
skompilowan klas poredniczc innemu programicie, to korzystajc z tej klasy nie miaaby on
pojcia o tym, i w rzeczywistoci uywa serwisu sieci WWW. Klasa ta jest bowiem uywana w
taki sposb, jak gdyby sama udostpniaa metody serwisu.
W wierszu 7. wywoywana jest metoda Add, a w wierszu 13. wyniki jej wykonania zostaj
wywietlone na stronie przy uyciu elementu sterujcego Label. Tak naprawd, w wierszu 7.
wywoywana jest metoda Add klasy poredniczcej; metoda ta pobiera dwie liczby cakowite i
przesya je przez Internet do metody Add serwisu sieci WWW. Dopiero ta metoda Add wykonuje
faktyczne obliczenia. Nastpnie uzyskane wyniki s odbierane przez klas poredniczc jako
dane XML, konwertowane do odpowiedniego typu danych (w tym przypadku do liczby
cakowitej) i zwracane. Z punktu widzenia programisty, klasa poredniczca pobiera argumenty,
wykonuje obliczenia i zwraca wyniki.
Na rysunku 17.5 przedstawione zostay wyniki wykonania strony z listingu 17.3, wywietlone w
przegldarce.

Rysunek 17.5. Wyniki wywoania metody serwisu sieci WWW

Powyszy przykad doskonale prezentuje pikno i elegancj wykorzystania klas poredniczcych.


Dziki uyciu takiej klasy nie musielimy wykonywa adnych szczeglnych czynnoci, aby
skorzysta z metod serwisu sieci WWW. Konieczne czynnoci sprowadziy si do wywoania
metody serwisu udostpniajcej moliwoci funkcjonalne z ktrych chcielimy skorzysta.
Moesz sdzi, e to duo pracy jak na tak prost stron ASP.NET, lecz w rzeczywistoci
wszystko sprowadza si do wykonania trzech czynnoci wykonania programu wsdl.exe w celu
wygenerowania kodu klasy poredniczcej, skompilowania go i umieszczenia w pamici
podrcznej komponentw .NET oraz stworzenia waciwej strony ASP.NET ktra wykorzysta
moliwoci funkcjonalne udostpniane przez serwis. (A jeli kto wykona za nas pierwsze dwie
czynnoci, to nasza rola sprowadzi si jedynie do stworzenia implementacji.) Jak wida znajomo
i zrozumienie wynikw procesu odkrywania oraz kodu klasy poredniczcej nie ma wikszego
znaczenia (no chyba, e chcesz samemu stworzy t klas). A zatem, klasa poredniczca ukrywa
wszystkie zoone moliwoci funkcjonalne, dziki niej, wystarczy kilka prostych wierszy kodu
strony ASP.NET, aby wykona bardzo zoone zadanie.

Notatka
Zauwa, i wykorzystanie klasy poredniczcej nie wymaga importowania jakichkolwiek
przestrzeni nazw. By moe przypominasz sobie, e ASP.NET automatycznie aduje obiekty
umieszczone w pamici podrcznej komponentw .NET (czyli w folderze \bin; bya o tym mowa
w rozdziale 15., pt.: Zastosowanie obiektw biznesowych). A zatem, z klasy poredniczcej
mona korzysta tak, jak gdyby stanowia ona integraln cz Twojej strony ASP.NET.

Inny przykad wykorzystania serwisu sieci WWW


Jak dotd osignlimy ju cakiem sporo. Wywoywanie metod obiektu przez Internet to nie byle
co. Serwisy sieci WWW stwarzaj wiele moliwoci zwizanych z przetwarzaniem rozproszonym.
Jednak przykad przedstawiony w poprzedniej czci rozdziau by bardzo prosty. Obliczenia
realizowane przez nasz przykadowy serwis sieci WWW rwnie dobrze mogy by wykonywane
bezporednio przez stron ASP.NET i nie wymagay wykorzystania adnych zoonych typw
danych.
A zatem przeanalizujmy inny przykad. Zapewne pamitasz, e dziki wykorzystaniu XML-a,
serwisy sieci WWW mog take zwraca informacje pobierane z baz danych. W poprzednim
rozdziale stworzylimy serwis, ktry na podstawie przekazanego polecenia SQL moe pobra
odpowiednie informacje z bazy danych. Sprbujmy uy tego serwisu na stronie ASP.NET.
Tym razem pominiemy proces odkrywania serwisu i przejdziemy bezporednio do generacji klasy
poredniczcej. W oknie wiersza polece wykonaj nastpujce polecenie:
wsdl /language:VB /namespace:ASPNETDK
http://localhost/aspnetdlakazdego/rozdzial16/Database.asmx?WSDL

Programu wsdl.exe uywalimy ju wczeniej, a zatem powysze polecenie powinno wyglda


znajomo. Jego wykonanie spowoduje wygenerowanie kodu klasy poredniczcej dla naszego
serwisu i zapisanie go w biecym folderze. Ze wzgldu na due moliwoci funkcjonalne tego
serwisu, wygenerowana dla niego klasa poredniczca jest dua i zoona. Na szczcie w ogle
nie musimy si tym przejmowa. Wystarczy e j skompilujemy i wykorzystamy na stronie
ASP.NET. Warto zwrci uwag, i wygenerowana klasa poredniczca zostaa umieszczona w
przestrzeni nazw ASPNETDK. To sensowny i logiczny sposb grupowania wasnych obiektw.
Wygenerowany kod klasy poredniczcej powinien wyglda podobnie do przykadu
przedstawionego na rysunku 17.6.
Rysunek 17.6. Wygenerowany kod rdowy klasy poredniczcej

Kolejnym krokiem bdzie skompilowanie tej klasy na komputerze, na ktrym bdzie wykonywana
strona ASP.NET korzystajca z usug naszego serwisu. W tym celu naley posuy si
nastpujcym poleceniem:
vbc /t:library /out:..\bin\DatabaseService.dll /r:System.dll
/r:System.Xml.dll /r:System.Web.Services.dll /r:System.Data.dll
DatabaseService.vb

Nie mona zapomnie o odwoaniu si do przestrzeni nazw System.Data! Klasa poredniczca


korzysta bowiem z klas zdefiniowanych w tej przestrzeni nazw do wykonania konwersji
zwrconych przez serwis danych XML do postaci obiektu DataSet, ktry bdzie mona
wykorzysta na stronie ASP.NET. Ostatni czynnoci bdzie stworzenie strony ASP.NET, ktra
wykorzysta moliwoci funkcjonalne udostpniane przez serwis sieci WWW. Jej kod
przedstawiony zosta na listingu 17.4.

Listing 17.4. Wykorzystanie serwisu obsugujcego baz danych.


1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Data" %>
3
4 <script runat="server">
5 sub Submit(obj as object, e as eventargs)
6 dim objService as new ASPNETDK.DatabaseService
7 dim objDS as new DataSet
8
9 objDS = objService.SelectSQL(tbQuery.Text)
10 DataGrid1.DataSource = objDS
11 DataGrid1.DataMember = "tblUsers"
12
13 DataGrid1.Databind()
14 end sub
15 </script>
16
17 <html><body>
18 <form runat="server">
19 Podaj zapytanie SQL:
20 <asp:Textbox id="tbQuery" runat="server"/>
21 <asp:Button id="btSubmit" runat="server"
22 text="Wykonaj zapytanie"
23 OnClick="Submit" />
24 <p>
25 <asp:DataGrid id="DataGrid1"
26 runat="server" BorderColor="black"
27 GridLines="Vertical" cellpadding="4"
28 cellspacing="0" width="100%"
29 Font-Name="Arial" Font-Size="8pt"
30 HeaderStyle-BackColor="#cccc99"
31 ItemStyle-BackColor="#ffffff"
32 AlternatingItemStyle-Backcolor="#cccccc" />
33
34 </form>
35 </body></html>

Analiza
Powysza strona ASP.NET jest niezwykle prosta. Jedyna, zdefiniowana na niej procedura nosi
nazw Submit. Gdy uytkownik poda w polu tekstowym zapytanie SQL i kliknie przycisk
Wykonaj zapytanie, procedura ta tworzy nowy obiekt klasy poredniczcej (patrz wiersz 6.).
Pamitasz zapewne, e klasa poredniczca zostaa umieszczona w przestrzeni nazw ASPNETDK.
To wanie z tego powodu w definicji zmiennej objService zostaa uyta pena nazwa klasy. (W
poprzednim przykadzie korzystajcym z serwisu Calculator, klasa poredniczca nie zostaa
umieszczona w adnej przestrzeni nazw, a zatem nie musielimy uywa jej nazwy.)
W wierszu 9. wywoywana jest metoda SelectSQL. Powinna ona zwrci wyniki w formie
obiektu DataSet. Uzyskane informacje s nastpnie wizane z elementem sterujcym DataGrid
(kod definiujcy ten element rozpoczyna si w wierszu 25.). Wygld strony po zadaniu pytania i
wywietleniu wynikw zosta przedstawiony na rysunku 17.7.

Rysunek 17.7. Dane zwrcone przez serwis sieci WWW

Strona ASP.NET z listingu 17.4 moe by pooona na serwerze znajdujcym w dowolnym


miejscu kuli ziemskiej; jej pooenie wzgldem serwisu sieci WWW nie ma najmniejszego
znaczenia uzyskiwane wyniki zawsze bd takie same. Innymi sowy, strona ta moe si
znajdowa na serwerze w Nowym Jorku, a serwis na serwerze w Katowicach!
Nasz serwis sieci WWW moe odbiera polecenia przesyane z kadego miejsca Sieci, gdy s
one zapisywane w XML-u. XML to jzyk tekstowy, a wszelkie mechanizmy zabezpieczajce
stosowane na Internecie zazwyczaj pozwalaj na przesyanie tekstu.
Dziki serwisom sieci WWW programici mog wykorzystywa udostpnione im moliwoci
funkcjonalne w cakowicie dowolny sposb. (Ten czynnik odrnia serwisy od stron ASP.NET,
gdy w przypadku wykorzystania stron, to ich autor okrela dostpny interfejs uytkownika.)
Posugujc si naszym przykadowym serwisem sieci WWW, jeden programista moe stworzy
internetow ksik adresow, a inny moe uy zwracanych informacji do przeprowadzenia
bada demograficznych. Nasz serwis ogranicza si do zwracania danych, sposb ich uycia bd
prezentacji nie ma dla niego najmniejszego znaczenia.

Notatka
Przykady przedstawione w tym rozdziale uwidaczniaj wszelkie podobiestwa wystpujce
pomidzy serwisami sieci WWW i obiektami biznesowymi. Oba te narzdzia s
wykorzystywane jako skompilowane obiekty, ktrymi nastpnie posuguj si strony ASP.NET.
Jedyna rnica pomidzy nimi polega na tym, i w przypadku zastosowania serwisw sieci
WWW skompilowany obiekt moe si znajdowa na dowolnym komputerze podczonym do
Internetu. Za poczenie serwisu z aplikacj ktra korzysta z jego moliwoci, odpowiada klasa
poredniczca.

Zalecenia dotyczce wykorzystania


serwisw sieci WWW
Sposb wykorzystania serwisu sieci WWW zaley od konkretnej sytuacji. Pamitasz zapewne, e
z serwisami mona si komunikowa przy uyciu trzech rnych protokow Http-Get, Http-
Post oraz SOAP.
Najatwiejsze w uyciu s pierwsze dwa protokoy, gdy wymagaj one podania jedynie adresu
URL serwisu. W obu przykadach podanych w tym rozdziale uyty zosta protok SOAP, ktry
udostpnia znacznie bogatsze moliwoci wykorzystywania serwisw.
Zastosowanie protokou SOAP ma jednak jedn wad. By moe zauwaye, e zapisywanie
polece i danych w komunikatach protokou SOAP jest raczej zoonym zadaniem (cho
tworzenie klas poredniczcych, ktre udostpniaj metody odpowiedzialne za komunikacj z
serwisami, jest na szczcie bardzo proste). Komunikaty przekazywane pomidzy serwisami i ich
klientami s dosy due, gdy musz one zawiera informacje dotyczce uywanych schematw
XML. W zalenoci od szybkoci poczenia z Internetem jakim dysponuje klient, wielko tych
komunikatw moe mie wpyw na ogln efektywno dziaania serwisu.
Innym sposobem wykorzystania serwisw sieci WWW jest zastosowanie protokou Http-Get. Jeli
tylko znasz adres URL serwisu, nazwy jego metod oraz parametry ich wywoania, to bez problemu
bdziesz mg bezporednio wywoywa udostpniane przez niego metody. Na przykad, poniszy
adres URL umoliwia wykorzystanie metody Add serwisu Calculator:
http://localhost/aspnetdlakazdego/rozdzial16/Calculator.asmx/Add?intA=3&intB=5
Po adresie URL serwisu naley zapisa ukonik oraz nazw wywoywanej metody, a dalej
acuch zapytania zawierajcy przekazywane argumenty. W powyszym przykadzie, adres URL
serwisu to:
http://localhost/aspnetdlakazdego/rozdzial16/Calculator.asmx
Po nim, zostaje podana kocwka zawierajca nazw metody oraz przekazywane do nie
argumenty:
/Add?intA=3&intB=5
W momencie przesania dania skierowanego do zasobu o powyszym adresie, zostan zwrcone
informacje XML zawierajce wyniki wykonania metody. W naszym przypadku wyniki bd miay
posta:
<?xml version="1.0" encoding="utf-8" ?>
<int xmln="http://temuri.org/">8<int>

Z serwisw mona take korzysta przy uyciu protokou Http-Post. W tym przypadku, w
atrybucie ACTION znacznika FORM naley poda adres URL serwisu oraz nazw wywoywanej
metody. Na przykad:
http://localhost/aspnetdlakazdego/rozdzial16/Calculator.asmx/Add
Jak wida, jest to adres URL serwisu z dopisanym znakiem ukonika oraz nazw metody. W
momencie przesania formularza, wartoci jego pl zostan wysane do serwisu, ktry w
odpowiedzi wygeneruje odpowiednie dane XML. Trzeba jednak pamita, aby nazwy pl
formularza odpowiaday nazwom argumentw wywoywanej metody serwisu sieci WWW.
A zatem, ktrej z powyszych metod naley uy? Okazuje si, e wybr jest bardzo prosty. Jeli
serwis musi zwraca skomplikowane typy danych, na przykad obiekty DataSet, naley
wykorzysta protok SOAP. Informacji tego typu nie mona bowiem przesya przy uyciu
pozostaych dwch protokow.
Jeli serwis nie musi zwraca skomplikowanych typw danych lub jeli obcienie cza ma due
znaczenie dla klienta, to naley wykorzysta protokoy Http-Get lub Http-Post. Komunikuj si
one z serwisem przy wykorzystaniu mniejszej iloci danych, zapewniajc tym samym lepsz
efektywno dziaania.

Tak Nie
Uywaj protokou SOAP jeli przewidujesz, e Nie uywaj protokou SOAP gdy czynnikiem o
bdziesz potrzebowa zoonych typw danych pierwszorzdnym znaczeniu jest obcienie
lub bogatych moliwoci programistycznego poczenia z Internetem. W takich sytuacjach
dostpu do serwisu. naley skorzysta z protokow Http-Get oraz
Http-Post.

Zabezpieczanie serwisw sieci WWW


Czsto bdziemy chcieli zabezpieczy nasze serwisy sieci WWW. W kocu, nawet w dobie
Internetu, gdy wszystko jest wsplne, s rzeczy ktre trzeba chroni. Zamy, e stworzylimy
witryn, ktrej uytkownicy podaj symbole interesujcych ich akcji i maj dostp do ich
biecego kursu. Zazwyczaj bezpatne witryny internetowe prezentuj notowania opnione co
najmniej o 15 minut, a zatem na pewno znalazyby si osoby, ktre zgodziyby si zapaci za
korzystanie z naszego serwisu. W takim przypadku wszelkie nieupowanione wykorzystanie
serwisu byby ze wszech miar niewskazane.
Jak na razie przedstawilimy sposoby tworzenia oglnie dostpnych serwisw sieci WWW. Kady
kto zna adres takiego serwisu moe z niego skorzysta (bd to za porednictwem pliku .disco,
bd te adresu URL). Na szczcie istniej sposoby zabezpieczenie serwisu, tak aby dostp do
niego miay jedynie upowanione osoby.
Czynnoci zabezpieczajce serwisy polegaj na wykorzystaniu protokou SOAP (w zatem take
jzyka XML) w celu przesyania do serwisu stosownych polece, zawierajcych informacje
konieczne do uwierzytelnienia klientw. Poniewa informacje s przesyane bezporednio do
serwisu, moe on zaimplementowa mechanizmy uwierzytelniania w cakowicie dowolny sposb.
Na przykad, weryfikacja danych uytkownika moe by realizowana w oparciu o bazy danych.
Zanim zajmiemy si technicznymi szczegami implementacji kontroli dostpu do naszego
serwisu, chciaby przedstawi pewn analogi. Wyobra sobie, e chciaby pj do bardzo
ekskluzywnej restauracji. Jej obsuga sprawdza tosamo klientw zanim zostan wpuszczenie do
rodka. Aby wej do restauracji i skorzysta ze wiadczonych w niej usug, trzeba wzi ze sob
jaki dokument, choby prawo jazdy.
W celu przekazania informacji koniecznych do uwierzytelnienia klienta prbujcego uzyska
dostp do serwisu sieci WWW, zostan wykorzystane nagwki SOAP. S to dodatkowe
komunikaty XML zawierajce dowolne informacje i doczane do standardowych komunikatw
przesyanych podczas wymiany danych pomidzy serwisem i klientem. Mechanizm ten moe
nieco przypomina posugiwanie si prawem jazdy. Cho dane s przesyane protokoem SOAP,
to stanowi cakowicie niezalene elementy. Nagwki ten zostan uyte do przekazania nazwy
uytkownika oraz hasa dostpu, dziki ktrym bdziemy mogli okreli ktry z klientw ma
prawo dostpu do serwisu.
Aby przesa nagwek SOAP wystarczy stworzy klas potomn klasy
System.Web.Services.Protocols.SoapHeader. Serwis sieci WWW moe nastpnie
wykorzysta t klas, aby zdoby informacje konieczne do uwierzytelnienia klienta. Klasa
nagwka SOAP umoliwiajca przesanie nazwy uytkownika i hasa zostaa przedstawiona na
listingu 17.5.

Listing 17.5. Prosta klasa nagwka SOAP.


1 Imports System.Web.Services
2 Imports System.Web.Services.Protocols
3
4 Namespace ASPNETDK
5
6 Public Class Authenticator : Inherits SoapHeader
7 Public Username As string
8 Public Password As string
9 End Class
10
11 End Namespace

Analiza
Klasa Authentication przedstawiona na listingu 17.5 moe zosta umieszczona w tym samym
pliku, w ktrym znajduje si klasa serwisu sieci WWW. Zawiera ona jedynie dwie publiczne
waciwoci Username oraz Password; zostan one wykorzystane od przekazania informacji
uwierzytelniajcych.
Kada klasa, ktr chcemy zabezpieczy powinna definiowa obiekt klasy Authenticator.
Bdzie on uywany do ograniczania dostpu do metod serwisu sieci WWW. Definicja kadej
udostpnianej metody tego serwisu, oprcz atrybutu <WebMethod>, musi take zawiera atrybut
<SoapHeader>:
Public Class DataBaseService
dim sHeader as Authenticator
...
<WebMethod(), SoapHeader("sHeader")> Public Function MojaMetoda()
as String
...
End Function

End Class

W drugim wierszy powyszego fragmentu kodu tworzony jest obiekt klasy Authenticator,
ktry zostaje zapisany w zmiennej sHeader. Nastpnie, w definicji metody, zosta dodany atrybut
SoapHeader zawierajcy nazw obiektu klasy Authenticator. W ten sposb
poinformowalimy ASP.NET, e metoda ta oprcz standardowej wymiany informacji powinna
take oczekiwa przekazania nagwka SOAP zawierajcego informacje uwierzytelniajce. Jeli
nagwek ten nie zostanie otrzymany, to wszelkie komunikaty nadsyane przez klienta zostan
odrzucone.
Stwrzmy praktyczny przykad wykorzystujcy serwis obsugi bazy danych zaimplementowany w
poprzednim rozdziale. W pierwszej kolejnoci zmodyfikujemy klas serwisu sieci WWW, tak aby
wykorzystywaa nasz nagwek SOAP. Zmodyfikowany kod klasy zosta przedstawiony na
listingu 17.6.

Listing 17.6. Zabezpieczony serwis obsugi bazy danych (Database.vb).


1 Imports System
2 Imports System.Data
3 Imports System.Data.OleDb
4 Imports System.Web.Services
5 Imports System.Web.Services.Protocols
6
7 Namespace ASPNETDK
8
9 Public Class Authenticator : Inherits SoapHeader
10 Public Username as string
11 Public Password as string
12 End Class
13
14 Public Class SecureDatabaseService : Inherits WebService
15 private objConn as OleDbConnection
16 private objCmd as OleDbCommand
17 public sHeader as Authenticator
18
19 <WebMethod(), SoapHeader("sHeader")> Public Function _
20 SelectSQL(strSelect as string) as DataSet
21
22 if sHeader is Nothing then
23 throw new Exception("Blad: Niepoprawne logowanie!")
24 end if
25
26 if Authenticate(sHeader.UserName, sHeader.Password) _
27 then
28 try
29 objConn = new OleDbConnection("Provider=" & _
30 "Microsoft.Jet.OLEDB.4.0;" & _
31 "Data Source=C:\ASPNET\data\banking.mdb")
32 dim objDataCmd as OleDbDataAdapter = new _
33 OleDbDataAdapter(strSelect, objConn)
34
35 Dim objDS as new DataSet
36 objDataCmd.Fill(objDS, "tblUsers")
37 return objDS
38 catch ex as OleDbException
39 return nothing
40 end try
41 end if
42 end function
43
44 private function Authenticate(strUser as string, _
45 strPass as string) as boolean
46 try
47 dim intID as integer = 0
48 objConn = new OleDbConnection("Provider=" & _
49 "Microsoft.Jet.OLEDB.4.0;" & _
50 "Data Source=C:\ASPNET\data\banking.mdb")
51
52 dim strSelect as string = "SELECT UserID FROM " & _
53 "tblUsers WHERE Firstname = '" & strUser & _
54 "' AND Lastname = '" & strPass & "'"
55 objCmd = new OleDbCommand(strSelect, objConn)
56 objCmd.Connection.Open()
57
58 Dim objReader as OleDbDataReader
59 objReader = objCmd.ExecuteReader
60 do while objReader.Read
61 intID = objReader.GetInt32(0)
62 loop
63 objReader.Close
64
65 if intID <> 0 then
66 return true
67 else
68 return false
69 end if
70 catch ex as OleDbException
71 return false
72 end try
73 end function
74 End Class
75
76
77 End Namespace

Analiza
W wierszu 9. powyszego listingu rozpoczyna si deklaracja klasy nagwka SOAP, ktry bdzie
wykorzystywany przy uwierzytelnianiu klientw. Jak wida klasa Authenticator dziedziczy po
klasie SoapHeader. Obiekt tej klasy bdzie przesyany wraz ze wszystkimi informacjami
wymienianymi pomidzy klientem i serwisem sieci WWW. Klasa ta definiuje jedynie dwie,
publiczne waciwoci Username oraz Password.
W wierszu 17. tworzony jest nowy obiekt klasy Authenticator reprezentujcy nagwek SOAP.
Obiekt ten zostaje zapisany we waciwoci sHeader. Bdzie on zawiera informacje
uwierzytelniajce przekazane z klienta, na podstawie ktrych okrelimy, czy dany klient moe
skorzysta z metod udostpnianych przez serwis sieci WWW.
Nowa wersja klasy serwisu nosi nazw SecureDatabaseService; jej nazwa zostaa zmieniona
tylko po to, aby atwiej mg rozrni obie wersje serwisu. W wierszu 19. rozpoczyna si kod
metody SelectSQL; jak wida, znacznie si on rni od pierwotnej wersji tej metody znanej z
poprzedniego rozdziau. Przede wszystkim, w deklaracji metody zosta umieszczony atrybut
SoapHeader, ktremu przypisywany jest obiekt nagwka SOAP przechowywany we
waciwoci sHeader. Pozostaa cz deklaracji metody nie zostaa zmieniona.
Pierwsz czynnoci wykonywan wewntrz metody jest okrelenie czy w wywoaniu przesanym
przez klienta zostay podane informacje uwierzytelniajce nazwa uytkownika oraz haso. Jeli
klient ich nie poda to waciwo sHeader bdzie miaa warto nothing, co z kolei spowoduje
zakoczenie wykonywania metody. W takim przypadku, w wierszu 23., zgaszany jest wyjtek
(Exception) informujcy klienta o pominiciu koniecznych informacji.

Notatka
Zgaszanie wyjtku nie jest konieczne, gdy nawet bez niego ASP.NET wygeneruje stosowny
komunikat jeli jaki nagwek nie zostanie przekazany. Komunikat generowany w takiej
sytuacji zosta przedstawiony na rysunku 17.8.
Rysunek 17.8. W przypadku pominicie nagwka SOAP zostanie zgoszony bd.

Nastpnie, w wierszu 26., wywoywana jest metoda Authenticate. Przeglda ona baz danych i
sprawdza czy podany uytkownik ma prawo dostpu do metody. W przypadku poprawnego
zweryfikowania danych uytkownika, metoda Authenticate zwrci warto true, dziki
czemu bdzie mona wykona gwn cz metody SelectSQL rozpoczynajc si w wierszu
28. Ten fragment kodu powinien wyglda znajomo, gdy nie zmieni si w porwnaniu z
poprzedni wersj serwisu. Wykonuje on podane polecenie SQL i zwraca obiekt DataSet.
Metoda Authenticate, ktrej kod rozpoczyna si w wierszu 44., suy do uwierzytelniania
uytkownikw. Przeglda ona baz danych sprawdzajc czy nazwa uytkownika raz haso podane
w nagwku SOAP opisuj istniejcego uytkownika. W naszym przypadku nazw uytkownika
bdzie jego imi, a hasem nazwisko. Jeli uytkownik zostanie odnaleziony metoda zwraca
warto true, w przeciwnym przypadku, zwracana jest warto false.
Teraz naley skompilowa now wersj serwisu przy uyciu nastpujcego polecenia:
vbc /t:library /out:..\bin\ASPNETDK.dll /r:System.dll /r:System.Data.dll
/r:System.Xml.dll /r:System.Web.dll /r:System.Web.Services.dll Database.vb

Kolejnym krokiem bdzie stworzenie na serwerze pliku .asmx zawierajcego wycznie dyrektyw
WebService okrelajc nazw klasy naszego nowego serwisu:
<%@ WebService Class="ASPNETDK.SecureDatabaseService" %>

Zapisz ten plik pod nazw SecureDatabaseSerivce.asmx. Kolejn czynnoci jak naley
wykona, jest stworzenie klasy poredniczcej na komputerze klienta (w naszym przypadku
zarwno klient jak i serwer bdzie dziaa na tym samym komputerze). Klas poredniczc
mona wygenerowa przy uyciu nastpujcego polecenia:
wsdl /language:VB /namespace:ASPNETDK.Clients
http://localhost/aspnetdlakazdego/rozdzial17/SecureDatabaseService.asmx?WSDL

Zwr uwag, i klasa poredniczca zostaa umieszczona w nowej przestrzeni nazw


ASPNETDK.Clients. Caa nasza praca jest wykonywana na tym samym komputerze, a zatem
uycie nowej przestrzeni nazw jest konieczne, aby unikn konfliktu nazw.
Analiza wygenerowanego kodu ujawni, e klasa poredniczca pobraa z serwisu dwie klasy
Authenticator oraz waciw klas serwisu. Aby uzyska moliwo dostpu i wykorzystania
metod serwisu, konieczne bdzie uycie obu tych klas.
Ostatni czynnoci jak naley wykona jest kompilacja klasy poredniczcej. W tym celu mona
si posuy poniszym poleceniem:
vbc /t:library /out:..\bin\ASPNETDK.Clients.dll /r:System.dll
/r:System.Data.dll /r:System.Xml.dll /r:System.Web.dll
/r:System.Web.Services.dll SecureDatabaseService.vb

Teraz pozostaje nam ju tylko napisanie strony ASP.NET, ktra bdzie korzysta z nowej wersji
serwisu. Strona ta powinna pozwala uytkownikom na podanie nazwy oraz hasa, jak rwnie
zapytania SQL, ktre ma zosta wykonane. Kod tej strony zosta przedstawiony na listingu 17.7.

Listing 17.7. Strona ASP.NET korzystajca z bezpiecznej wersji serwisu


(SecureDatabaseService.aspx).
1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Data" %>
3
4 <script runat="server">
5 sub Submit(obj as object, e as eventargs)
6 dim objService as new ASPNETDK.Clients.SecureDatabaseService
7 dim sHeader as new ASPNETDK.Clients.Authenticator
8 dim objDS as new DataSet
9
10 sHeader.Username = tbUser.Text
11 sHeader.Password = tbPass.Text
12 objService.AuthenticatorValue = sHeader
13
14 try
15 objDS = objService.SelectSQL(tbQuery.Text)
16
17 DataGrid1.DataSource = objDS
18 DataGrid1.DataMember = "tblUsers"
19 DataGrid1.Databind()
20 catch ex as exception
21 Response.Write("Nieprawidowa nazwa uytkownika lub haso")
22 end try
23 end sub
24 </script>
25
26 <html><body>
27 <form runat="server">
28 Nazwa uytkownika:
29 <asp:Textbox id="tbUser" runat="server"/><br>
30 Haso:
31 <asp:Textbox id="tbPass" runat="server"
32 TextMode="password" /><p>
33 Zapytanie SQL:
34 <asp:Textbox id="tbQuery" runat="server"/>
35 <asp:Button id="btSubmit" runat="server"
36 text="Wykonaj"
37 OnClick="Submit" />
38 <p>
39 <asp:DataGrid id="DataGrid1"
40 runat="server" BorderColor="black"
41 GridLines="Vertical" cellpadding="4"
42 cellspacing="0" width="100%"
43 Font-Name="Arial" Font-Size="8pt"
44 HeaderStyle-BackColor="#cccc99"
45 ItemStyle-BackColor="#ffffff"
46 AlternatingItemStyle-Backcolor="#cccccc" />
47
48 </form>
49 </body></html>

Analiza
Jedyn metod uywan w powyszej stronie ASP.NET jest metoda Submit, obsugujca
kliknicie przycisku Wykonaj. Tworzy ona dwa nowe obiekty obiekt klasy poredniczcej
naszego serwisu oraz obiekt klasy Authenticator. Waciwociom tego drugiego obiektu
przypisywana jest nazwa uytkownika oraz haso podane w dwch pierwszych polach tekstowych
(patrz wiersze 11. i 12.). Nastpnie, obiekt ten przypisywany jest waciwoci
AuthenticatorValue obiektu klasy poredniczcej. Dziki temu, klasa ta wie ju jakie
informacje naley przesya do serwisu wraz z poleceniami.
W kocu, w bloku try wywoywana jest metoda serwisu, a zwrcone przez ni wyniki zostaj
zwizane z elementem sterujcym DataGrid. Teraz wywietl t stron w przegldarce i w polach
tekstowych podaj nazw uytkownika, haso oraz zapytanie SQL. (Pamitaj, e w naszym
przypadku nazw uytkownika bdzie jego imi, a hasem nazwisko.) Jeli podane informacje
bd poprawne (czyli jeli bd reprezentoway uytkownika zapisanego w tabeli tblUsers), to na
stronie wynikowe zostan wywietlone informacje pobrane z bazy danych (patrz rysunek 17.9).

Rysunek 17.9. Wyniki udanego wykonania metody nowej wersji serwisu

Jeli jednak podane informacje o uytkowniku nie bd poprawne, to na samej grze strony
zostanie wywietlony stosowny komunikat Nieprawidowa nazwa uytkownika lub haso. To
wanie z tego powodu uylimy bloku try gdyby go nie byo, to wywoanie metody
zwrcioby pusty obiekt DataSet. Prba zwizania go elementem sterujcym DataGrid
spowodowaaby zgoszenie bdu. Wyniki nieudanej prby wykorzystania nowej wersji naszego
przykadowego serwisu sieci WWW zostay przedstawione na rysunku 17.10.
Rysunek 17.10. Wyniki nieudanego wykonania metody nowej wersji serwisu

Nagwki SOAP efektywnym i czsto stosowanym sposobem zabezpieczania dostpu do


serwisw sieci WWW. W naszym przykadzie, informacje wykorzystywane przy uwierzytelnianiu
da byy pobierane z baz danych, w rzeczywistoci proces uwierzytelniania moe by
realizowany w cakowicie dowolny sposb.
Wykorzystania nagwkw SOAP ma jednak pewn wad. Ot w przypadku wykorzystania
nagwkw SOAP do przesyania informacji o uytkowniku, bd one przekazywane przez
Internet w postaci zwyczajnego tekstu zapisanego w formacie XML. Oznacza to, e atwo mona
je przechwyci i odczyta. Jednym ze sposobw rozwizania tego problemu jest zaszyfrowanie
podanych przez uytkownika informacji, zanim zostan przesane oraz odpowiednie
odszyfrowanie ich w serwisie sieci WWW. Omwienie zagadnie zwizanych z szyfrowaniem
wykracza jednak poza ramy tematyczne niniejszej ksiki. Inne sposoby zabezpieczania aplikacji
ASP.NET zostay opisane w rozdziale 21., pt.: Zabezpieczanie aplikacji ASP.NET.

To nie jest ASP!


Umoliwianie klientom dostpu do aplikacji internetowych nie jest nowoci dla programistw
ASP. Take we wczeniejszych wersjach tej technologii z chwil uruchomienia aplikacji na
serwerze, stawaa si ona dostpna dla klientw. Jednak cakowicie nowym zagadnieniem jest
wykorzystanie komponentw aplikacji przez Internet umoliwienie odwoywania si do nich przez
inne aplikacje.
Nowoci jest take moliwo zdalnego komunikowania si ze sob rnych elementw tej samej
aplikacji. Wczeniej obiekty biznesowe oraz strony ASP musiay si znajdowa na tym samym
komputerze (a przynajmniej na tej samej sieci). Technologia ASP.NET umoliwia, aby elementy
te znajdoway si na dowolnych komputerach podczonych do Internetu. W ten sposb ASP.NET
pozwala na tworzenie prawdziwych, rozproszonych aplikacji.
Gwnym czynnikiem, ktry przyczyni si ogromnego sukcesu serwisw sieci WWW byo
wykorzystanie protokou SOAP do przesyania polece i danych, zapisanych przy uyciu
standardowego jzyka (takiego jak XML). Polecenia SOAP s w caoci zapisywane w postaci
tekstowej i dlatego mog by przesyane gdziekolwiek i to nawet przez zapory ogniowe.
Rozdzia 18.
Konfiguracja i wdraanie
aplikacji ASP.NET
W poprzednich siedemnastu rozdziaach dowiedziae si jak tworzy niemal wszystkie elementy
aplikacji ASP.NET. Jednak nie dowiedziae si jeszcze jak mona zarzdza ca aplikacj.
Aplikacje tworzone w poprzednich rozdziaach ksiki skaday si zazwyczaj z pojedynczych
stron ASP.NET, ktre czasami wykorzystyway inne pliki. W tym rozdziale opisz w jaki sposb
mona poczy te wszystkie strony w jedn, spjn aplikacj, w ktrej wszystkie ustawienia i
zdarzenia mona kontrolowa z jednego miejsca.
W ASP.NET szczeglne znaczenie maj dwa pliki global.asx oraz web.config. Pierwszy z nich
kontroluje zdarzenia zachodzce w aplikacji. Korzystajc z udostpnianych przez niego
moliwoci, mona, przykadowo, wykona okrelony kod w momencie obsugi pierwszego
dania skierowanego do ktrejkolwiek ze stron, lub za kadym razem gdy jest otrzymywane
danie dotyczce okrelonej strony. Drugi z plikw web.config zawiera ustawienia
aplikacji, na przykad: ustawienia bezpieczestwa lub informacje okrelajce sposb dziaania
sesji.
Pod koniec rozdziau przekonasz si, jak atwo mona wdroy aplikacj ASP.NET i uruchomi j
na innym serwerze. Bardzo czsto programici tworz aplikacje na testowych serwerach, a dopiero
po zakoczeniu pracy i usuniciu bdw przenosz je na serwery docelowe. ASP.NET sprawia,
e proces ten sta si banalnie prosty.
W tym rozdziale zostan omwione nastpujce zagadnienia:
Dokadna prezentacja aplikacji ASP.NET.
Czym s pliki global.asax oraz jak mona si nimi posugiwa.
W jaki sposb mona konfigurowa aplikacje ASP.NET przy wykorzystaniu pliku
web.config.
Jak korzysta z najczciej stosowanych ustawie konfiguracyjnych.
Jak tworzy wasne ustawienia konfiguracyjne w aplikacjach ASP.NET.
W jaki sposb naley wdraa aplikacje ASP.NET.

Prezentacja aplikacji ASP.NET


W poprzednich rozdziaach niniejszej ksiki poznae ju niemal wszystkie zagadnienia zwizane
z wykorzystaniem technologii ASP.NET, poczynajc od sposobw tworzenia prostych formularzy
internetowych, a koczc na pisaniu i wykorzystaniu skomplikowanych obiektw biznesowych.
Korzystajc z tych komponentw moesz tworzy strony ASP.NET o niezwykle potnych
moliwociach, zdolne do wykonywania niemal dowolnych operacji. Kolejnym krokiem jest
scalenie tych wszystkich elementw w jedn, spjn aplikacj, skonfigurowanie jej i wdroenie.
Oczywicie mona zebra kilka stron ASP.NET i nazwa je aplikacj, jednak formalna definicja
aplikacji jest nieco szersza. Wedug tej definicji aplikacja ASP.NET to: suma wszystkich plikw,
stron, procedur obsugi zdarze, moduw, kodu wykonywalnego (programw i bibliotek),
wykonywanego lub uruchamianego w obrbie danego katalogu wirtualnego (i jego podkatalogw)
na serwerze WWW. Cakiem rozbudowana definicja.
By moe przypominasz sobie, e katalog wirtualny jest katalogiem, ktry nie naley do drzewa
katalogu gwnego serwera WWW, cho klientom WWW wydaje si, e jest jego czci. Na
przykad, jeli stosujesz domylne ustawienia serwera IIS, to jednym z katalogw wirtualnych (a
zarazem katalogiem gwnym) jest c:\inetpub\wwwroot widoczny z poziomu Sieci jako
http://localhost/. Innym katalogiem wirtualnym moe by folder c:\moje\mojawitryna, widoczny
jako http://localhost/mojawitryna. Fizycznie ten drugi folder nie znajduje si w katalogu gwnym
serwera, jednak aden klient nie jest w stanie zauway jakiejkolwiek rnicy. Katalogi wirtualne
mona tworzy w oknie Menadera usug internetowych, a czynnoci jakie w tym celu naley
wykona nikomu nie przysporz trudnoci (wicej informacji na ten temat znajdziesz w rozdziale
1., pt.: Podstawy technologii ASP.NET).
Podkatalogi katalogw wirtualnych mog lecz wcale nie musz by katalogami wirtualnymi.
Typowa lista katalogw wirtualnych dostpnych na serwerze IIS dziaajcym w systemie
Windows 2000, zostaa przedstawiona na rysunku 18.1.

Rysunek 18.1. Typowy zestaw katalogw wirtualnych dostpnych na serwerze IIS 5.0
dziaajcym w systemie Windows 2000, wywietlony w Menaderze usug internetowych

Kada aplikacja ASP.NET jest obsugiwana w odrbnej domenie aplikacji (patrz podrozdzia
Przetwarzanie w rozdziale 2., pt.: Tworzenie stron ASP.NET), co oznacza, e kada z nich
moe posiada wasne ustawienia konfiguracyjne. A zatem, jeli na serwerze zostan
zdefiniowane dwa katalogi wirtualne http://localhost/MyASP oraz
http://localhost/MyASP/App2 to drugi z nich bdzie zupenie niezalena aplikacj, ktra w
aden sposb nie wchodzi w skad pierwszej aplikacji.
Aplikacje ASP.NET s tworzone w momencie gdy serwer odbierze pierwsze danie dotyczce
ktrejkolwiek ze stron tworzcych t aplikacj (wicej informacji na ten temat znajdziesz w
dalszej czci rozdziau). Po utworzeniu aplikacji, mona uywa przernych zdarze do
kontrolowania sposobu wykonywania programu. Moliwoci te s dostpne za porednictwem
pliku global.asax, ktry zostanie szczegowo omwiony w dalszej czci rozdziau.

Folder \bin
Nowe wyraenie
ASP.NET udostpnia nowy folder, ktry moe by wykorzystywany w aplikacjach ASP.NET. Jest
to folder \bin, nazywany take pamici podrczn komponentw .NET. Czytajc rozdziay
powicone tworzeniu i wykorzystaniu obiektw biznesowych dowiedziae si, e folder ten
suy do przechowywania skompilowanych plikw binarnych uywanych w aplikacji (takich jak
biblioteki DLL). Kada aplikacja posiada swoj wasn pami podrczn komponentw .NET,
jednak moe take dziedziczy pami podrczn komponentw po ktrej z aplikacji
nadrzdnych.
Folder \bin jest niezwykle wany w aplikacjach ASP.NET. Stanowi on miejsce w ktrym mona
przechowywa obiekty wykorzystywane w aplikacji. Umieszczane w nim komponenty s
automatycznie dostpne dla stron .aspx, dziki czemu nie trzeba si przejmowa
skomplikowanymi ich tworzenia i adowania. Wicej informacji na temat sposobw
wykorzystania tego folderu znajdziesz w rozdziale 15, pt.: Zastosowanie obiektw biznesowych.

global.asax
By moe nigdy nie mylae o stronach ASP.NET jako o aplikacji. To cakiem zrozumiae, gdy
strony te stanowi grup luno ze sob powizanych plikw tekstowych. Tradycyjnie, za aplikacj
uwaa si plik wykonywalny (.exe), ewentualnie wraz z towarzyszcymi mu plikami (takimi jak
biblioteki DLL oraz pliki .ini). Aplikacje ASP.NET s zupenie inne, gdy uytkownicy mog
uruchomi dowoln stron wchodzc w ich skad (nie maj one bowiem adnego ustalonego
punktu startowego), a poza tym wikszo tworzcych je plikw jest zrozumiaa dla ludzi.
W rzeczywistoci, kady katalog wirtualny na serwerze IIS jest aplikacj. Aplikacja taka jest
uruchamiana w momencie otrzymania dania dotyczcego ktrejkolwiek ze stron wchodzcych
w jej skad, niezalenie od tego ktra to bdzie strona. Gdy uytkownicy przechodz ze strony na
stron, przetwarzanie aplikacji dobywa si w tle, w sposb niewidoczny dla nich. Podobnie jak
wszystkie tradycyjne aplikacje, take i aplikacje ASP.NET mog przesta dziaa, mona je take
zatrzyma i uruchomi ponownie. Rnica polega jednak na tym, i tradycyjne aplikacje s
uruchamiane na komputerze uytkownika i prowadz z nim bezporedni interakcj; natomiast
aplikacje ASP.NET s uruchamiane na serwerze WWW a uytkownik moe z nich korzysta
wycznie za porednictwem przegldarki.
Pamitasz zapewne, e w rodowisku .NET wszystko jest obiektem. Dotyczy to take aplikacji
ASP.NET. Obiekt klasy HttpApplication dostarcza metod, waciwoci i zdarze, tak samo jak
strony ASP.NET i elementy sterujce serwera. Na tej podstawie mona inaczej wyrazi informacje
podane w poprzednim akapicie gdy po raz pierwszy zostanie otrzymane danie dotyczce
ktrejkolwiek ze stron nalecych do katalogu wirtualnego, tworzony jest nowy obiekt klasy
HttpApplication.

Notatka
Naley zauway, i aplikacja jest uruchamiana tylko w momencie otrzymania pierwszego
dania skierowanego do ktrejkolwiek ze stron znajdujcych si w folderze wirtualnym. Nie
oznacza to wcale, e jest ona uruchamiana w momencie otrzymania dania do nowej strony.
Przykadowo, jeli aplikacja ASP.NET skada si z dwch plikw default.aspx oraz exit.aspx
to zostanie ona uruchomiona w momencie otrzymania pierwszego dania dotyczcego
ktrejkolwiek z tych stron, a nie w momencie otrzymania pierwszego dania skierowanego do
kadej z nich. Oznacza to, e aplikacja ASP.NET uruchamiana jest tylko raz. Gdyby prawd
byo drugie stwierdzenie, oznaczaoby to, e aplikacje ASP.NET s uruchamiane za kadym
razem gdy zostanie zadana nowa strona.
Ale w jaki sposb mona kontrolowa obiekt HttpApplication (czyli, za jego porednictwem,
zarzdza aplikacj ASP.NET)? Przetwarzanie kadej ze stron ASP.NET powoduje wykonanie
pewnego zadania lub zada, nie ma jednak wpywu na sposb dziaania aplikacji jako caoci.
adna strona ASP.NET nie moe mie bezporedniego wpywu na sposb dziaania innej strony.
Oznacza to, e musi istnie pewien element centralny zarzdzajcy wykonywaniem caej aplikacji
jest nim plik global.asax.
Plik global.asax nazywany jest plikiem aplikacji ASP.NET. Plik ten pozwala na tworzenie kodu
wykorzystujcego obiekt HttpApplication. Przy wykorzystaniu tego obiektu mona
kontrolowa dziaanie aplikacji ASP.NET w taki sam sposb, w jaki uywa si innych obiektw
posugujc si ich metodami i zdarzeniami (w dalszej czci rozdziau, gdy zdobdziesz ju
wszelkie niezbdne informacje dodatkowe, dowiesz si jak mona to robi.)

Notatka
Naley wiedzie, e wykorzystanie pliku global.asax jest cakowicie opcjonalne. Jeli nie
stworzysz tego pliku w swojej aplikacji, to bdzie ona wykonywana w domylny sposb, ktry
cakowicie wystarcza, aby wszystko dziaao jak naley. Jeli jednak bdziesz chcia
wykorzysta jakiekolwiek dodatkowe moliwoci funkcjonalne, to bdziesz musia uy pliku
global.asax.

Plik global.asax jest umieszczany w gwnym folderze aplikacji ASP.NET. Przykadowo, jeli
wykonywae przykady przedstawiane w poprzednich rozdziaach, to zapewne utworzye katalog
wirtualny http://localhost/aspnetdlakazdego odpowiadajcy folderowi
c:\inetpub\wwwroot\aspnetdlakazdego. Wanie w tym folderze naley umieci plik global.asax
zarzdzajcy dziaaniem aplikacji.

ASP.NET konfiguruje ten plik w taki sposb, aby nie mona go byo wywietli w przegldarce.
Dziki temu, hakerzy nie mog si wama i zmodyfikowa ustawie aplikacji. Jeli kto wpisze w
przegldarce adres http://localhost/global.asax, zostanie wywietlony komunikat o bdzie
przedstawiony na rysunku 18.2.

Rysunek 18.2. Prba wywietlenia pliku global.asax w przegldarce spowoduje zgoszenie


bdu.

Jak ju wspominaem plik global.asax jest zarzdzany przez rodowisko .NET. Wirtualna
maszyna CLR wykrywa kad zmian tego pliku i powoduje ponowne uruchomienie aplikacji,
dziki czemu uwzgldniane s zmodyfikowane ustawienia. To ponowne uruchamianie aplikacji
moe by powanym utrudnieniem dla korzystajcych z niej uytkownikw i z tego wzgldu plik
global.asax naley modyfikowa jak najrzadziej.

Klasa HttpApplication
Ju wiesz, e aplikacje ASP.NET mona kontrolowa za porednictwem obiektu klasy
HttpApplication, ale jak rol odgrywa w tym plik global.asax? W czasie dziaania aplikacji
plik ten jest kompilowany do postaci dynamicznej klasy dziedziczcej po klasie
HttpApplication. A zatem, za porednictwem pliku global.asax mona uzyska dostp do
obiektw i zdarze jego klasy bazowej, czyli klasy HttpApplication.
Podczas inicjalizacji aplikacji tworzonych jest kilka kopii obiektu HttpApplication, z ktrych
kada w danej chwili obsuguje tylko jedno danie. Obiekt taki odpowiada za obsuenie caego
dania, a po jego zakoczeniu moe rozpocz obsug kolejnego. Dana obiekt odpowiada za
ca obsug konkretnego dania w czasie jego istnienia.
Wyobra sobie, e jeste wacicielem drogiej, ekskluzywnej restauracji, w ktrej kady z
kelnerw obsuguje w danej chwili tylko jeden stolik. Gdy do restauracji przychodzi nowy klient,
to tylko jeden kelner odpowiada za jego obsug, czyli za posadzenie go przy stoliku,
poinformowanie o serwowanych specjaach i dostarczeniu zamawianych da (cho w dania
zostan podane przez kogo innego, to jednak kelner odpowiada za to kiedy to nastpi). Dokadnie
w taki sam sposb kopia obiektu HttpApplication obsuguje odebranie dania HTTP,
przetworzenie wszelkich jego parametrw oraz wygenerowanie strony wynikowej (warto zwrci
uwag, i samo wygenerowanie strony wynikowej jest realizowane przez obiekt klasy
HttpHandler, lecz obiekt HttpApplication okrela kiedy to ma nastpi).

Poniewa klasa pliku global.asax jest klas potomn klasy HttpApplication, a zatem
dysponuje ona wieloma metodami i zdarzeniami swojej klasy bazowej. To wanie te metody i
zdarzenia zapewniaj moliwo programowego dostpu do aplikacji ASP.NET. W pliku
global.asax definiowane s procedury obsugujce zdarzenia generowane przez obiekt
HttpApplication, od ktrego w caoci zaley przetwarzanie aplikacji. Procedury te musz by
zgodne ze standardow konwencj okrelania nazw procedur obsugi zdarze
Application_NazwZdarzenia(arugmenty zdarzenia). Poniej zostaa podana
przykadowa nazwa jednej z procedur obsugi zdarze, jakie mona zdefiniowa w pliku
global.asax:
Application_Start(obj as object, e as eventargs)

Programowanie pliku global.asax


Pod wieloma wzgldami dziaanie pliku global.asax przypomina dziaanie zwyczajnych stron
ASP.NET. Mona w nim uywa dyrektyw (@ Imports, @ Application oraz @ Assembly),
korzysta z moliwoci doczania plikw po stronie serwera (SSI; patrz rozdzia 19., pt.:
Oddzielanie kodu od treci) oraz umieszcza bloki deklarowania kodu. Plik global.asax suy do
implementacji wszelkich zdarze udostpnianych przez klas HttpApplication i
przedstawionych w tabeli 18.1 (wiele z nich bdzie uywanych take w rozdziale 20., pt.:
Testowanie stron ASP.NET).

Tabela 18.1. Zdarzenia klasy HttpApplication.


Zdarzenie Opis
AcquireRequestState Zgaszane gdy aplikacja uzyska pami podrczn dla danego
dania.
AuthenticateRequest Zgaszane gdy aplikacja sprbuje uwierzytelni danie HTTP.
AuthorizeRequest Zgaszane gdy aplikacja sprbuje przeprowadzi autoryzacj
dania HTTP.
BeginRequest Zgaszane w momencie rozpoczynania obsugi dania.
EndRequest Zgaszane w momencie zakoczenia obsugi dania.
Error Zgaszane w momencie wystpienia jakiegokolwiek bdu.
PostRequestHandlerExecute Zgaszane bezporednio po zakoczeniu realizacji procedury
obsugi da HTTP.
PreRequestHandlerExecute Zgaszane bezporednio przed rozpoczciem realizacji
procedury obsugi da HTTP.
PreSendRequestContent Jeli danie zawiera jakiekolwiek dodatkowe informacje (na
przykad, acuch zapytania, dane przesane z formularza, i tak
dalej) to zdarzenie to jest zgaszane bezporednio przed
odebraniem tych informacji.
PreSendRequestHeaders Zgaszane bezporednio przed odebraniem nagwkw dania
HTTP.
ReleaseRequestState Zgaszane gdy aplikacja zwalnia stan sesji dla danego dania.
ResolveRequestCache Zgaszane gdy aplikacja zwalnia pami podrczn dla danego
dania.
UpdateRequestCache Zgaszane gdy aplikacja uaktualnia i zwalnia pami podrczn
dla danego dania.

Przyjrzyjmy si jak to dziaa w praktyce. Przykady plik global.asax zosta przedstawiony na


listingu 18.1.

Listing 18.1. Przykadowy plik global.asax.


1 <script language="VB" runat="server">
2
3 Sub Application_Start (Sender As Object, E As EventArgs)
4 Application("Time") = System.DateTime.Now
5 End Sub
6
7 Sub Application_AcquireRequestState(Sender As Object, E As EventArgs)
8 Response.Write("Okrelanie stanu sesji dla dania...<br>")
9 End Sub
10
11 Sub Application_AuthenticateRequest(Sender As Object, E As EventArgs)
12 Response.Write("Uwierzytelnianie dania...<br>")
13 End Sub
14
15 Sub Application_AuthorizeRequest (Sender As Object, E As EventArgs)
16 Response.Write("Autoryzacja dania...<br>")
17 End Sub
18
19 Sub Application_PostRequestHandlerExecute (Sender As Object, _
20 E As EventArgs)
21 Response.Write("Procedura obsugi dania zakoczona...<br>")
22 End Sub
23
24 Sub Application_PreRequestHandlerExecute (Sender As Object, _
25 E As EventArgs)
26 Response.Write("Wykonanie procedury obsugi dania...<br>")
27 End Sub
28
29 Sub Application_PreSendRequestContent (Sender As Object, _
30 E As EventArgs)
31 Response.Write("Odbieranie zawartoci dania...<br>")
32 End Sub
33
34 Sub Application_PreSendRequestHeaders (Sender As Object, _
35 E As EventArgs)
36 Response.Write("Odbieranie nagwkw dania...<br>")
37 End Sub
38
39 Sub Application_ReleaseRequestState (Sender As Object, _
40 E As EventArgs)
41 Response.Write("Zwalnianie stanu dania...<br>")
42 End Sub
43
44 Sub Application_ResolveRequestCache (Sender As Object, _
45 E As EventArgs)
46 Response.Write("Zwalnianie pamici podrcznej dania...<br>")
47 End Sub
48
49 Sub Application_UpdateRequestCache (Sender As Object, E As EventArgs)
50 Response.Write("Aktualizacja pamici podrcznej dania...<br>")
51 End Sub
52
53 Sub Application_Error (Sender As Object, E As EventArgs)
54 Response.Write(Sender.Request.isAuthenticated & _
55 " uwierzytelnia danie...<br>")
56 End Sub
57
58 Sub Session_Start (Sender As Object, E As EventArgs)
59 Response.Write("Pocztek sesji...<br>")
60 End Sub
61
62 Sub Application_BeginRequest (Sender As Object, E As EventArgs)
63 Response.Write("<b>Przetwarzanie</b><br>")
64 Response.Write("Pocztek obsugi dania...<br>")
65 End Sub
66
67 Sub Application_EndRequest (Sender As Object, E As EventArgs)
68 Response.Write("Koniec obsugi dania...<br>")
69 End Sub
70
71 </script>

Analiza
W powyszym pliku zostay zaimplementowane niemal wszystkie procedury obsugi zdarze z
tabeli 18.1. W wierszu 4. w obiekcie HttpApplication zostaje zapisany czas uruchomienia
aplikacji (wicej informacji na temat zapisywania stanu znajdziesz w rozdziale 4., pt.:
Stosowanie obiektw ASP.NET w jzykach C# i VB.NET). Wszystkie pozostae procedury
obsugi zdarze wywietlaj na wynikowej stronie komunikat informujcy o tym, co si aktualnie
dzieje. W ten sposb analizujc stron bdzie mona okreli kolejno obsugi poszczeglnych
zdarze.
W przypadku wykorzystania pliku global.asax przedstawionego na listingu 18.1, obsuga kadego
zdarzenia spowoduje wywietlenie krtkiego komunikatu na wynikowej stronie WWW. Warto
zauway, e niektre z tych zdarze s zgaszane przy kadym wywietleniu strony. Aby to
zilustrowa wykorzystamy stron ASP.NET przedstawion na listingu 18.2.

Listing 18.2. Testowania procedur obsugi zdarze zdefiniowanych w pliku global.asax.


1 <%@ Page Language="VB" %>
2
3 <script language="VB" runat="server">
4 Sub Page_Load(Sender As Object, E As EventArgs)
5 lblOutput.text = "adowanie strony...<p>" & _
6 "Aplikacja zostaa uruchomiona o godzinie : " & _
7 Application("Time") & "...<br>" & _
8 "Teraz jest: " & DateTime.Now & "...<br>"
9 End Sub
10
11 Sub Click(obj As Object, E As EventArgs)
12 Session.Abandon()
13 End Sub
14 </script>
15
16 <html><body>
17 <form runat="server">
18 <table align="center">
19 <tr>
20 <td valign="top" width="300"><b>Wyniki</b></td>
21 </tr>
22 <tr>
23 <td valign="top">
24 <asp:label id="lblOutput" runat="server"/><p>
25 <asp:Button id="btSubmit" runat="server"
26 OnClick="Click" Text="Zakocz sesj"/>
27 </td>
28 </tr>
29 </table>
30 </form>
31 </body></html>

Analiza
Zapisz powyszy kod w pliku listing1802.aspx. Wykonanie tej strony spowoduje wywietlenie w
przegldarce kilku komunikatw, w tym take czasu uruchomienia aplikacji oraz aktualnej czasu
(wywietlanych w wierszach od 5. do 8.). W wierszu 25. zosta zdefiniowany przycisk, ktrego
kliknicie spowoduje zakoczenie biecej sesji. Przycisk ten przyda nam si w celu
przetestowania sposobu obsugi sesji przez obiekty klasy HttpApplication. Wyniki wykonania
powyszej strony zostay przedstawione na rysunku 18.3.

Rysunek 18.3. Wyniki wykonania strony ASP.NET z listingu 18.2

W momencie otrzymania pierwszego dania dotyczcego tej strony, zgaszanych jest kilka
rnych zdarze klasy HttpApplication. Zdarzenia te s obsugiwane s przez procedury
zdefiniowane w pliku global.asax, a kada z nich wywietla krtki komunikat. Analizujc stron
wynikow mona okreli przebieg procesu wykonywania obiektu HttpApplication oraz
rezultaty wykonania strony z listingu 18.2. Zwr uwag, i rezultaty wykonania tej strony
rozpoczynaj si mniej wicej w poowie strony wynikowej w pierwszej kolejnoci plik
aplikacji przetwarza danie zwalnia pami podrczn i stan sesji, a dopiero potem procedura
obsugi da HTTP (ktr omwi w dalszej czci rozdziau) wykonuje stron, ktrej dotyczyo
danie. Nastpnie plik aplikacji wykonuje dodatkowe czynnoci i koczy przetwarzanie dania.
Innymi sowy metody wykonywane s w nastpujcej kolejnoci:
1. Application_Start,

2. Application_BeginRequest,

3. Application_AuthenticateRequest,

4. Application_AuthorizeRequest,

5. Application_ResolveRequestCache,

6. Session_Start,

7. Application_AcquireRequestState,

8. Application_PreRequestHandlerExecute,

9. Procedura Page_Load zdefiniowana w pliku .aspx, a nastpnie pozostay kod strony,


10. Application_PostRequestHandlerExecute,
11. Application_ReleaseRequestState,
12. Application_UpdateRequestState,
13. Application_EndRequest,
14. Application_PreSendRequestHeaders.

Notatka
Naley wiedzie, e konkretne zdarzenia jakie zostan wykonane mog zalee od okolicznoci
zwizanych z obsugiwanym daniem. Na przykad, jeli danie po raz kolejny dotyczy tej
samej strony, to procedura Session_Start moe zosta pominita, a w konsekwencji na
wynikowej stronie nie pojawi si komunikat Pocztek sesji...

Warto take zwrci uwag na rnice pomidzy czasem rozpoczcia aplikacji (okrelonym w
procedurze Application_Start), a czasem wywietlenia strony (trzeba pamita, e rnica ta
bdzie zaleaa od konfiguracji komputera. Kolejne prby wywietlenia strony z listingu 18.2 nie
bd ju trway tak dugo, gdy aplikacja ju zostaa uruchomiona a strona ASP.NET
skompilowana. Jednak jakakolwiek modyfikacja wprowadzona w pliku global.asax spowoduje
powtrne uruchomienie aplikacji.
Kliknicie przycisku Zakocz sesj widocznego na rysunku 18.3 spowoduje wykonanie metody
Abandon obiektu Session, ktra zakoczy biec i rozpocznie now sesj. Dziki temu na
wynikowej stronie WWW znowu pojawi si komunikat Pocztek sesji....
Jak wida, plik global.asax pozwala kontrolowa niemal wszystkie aspekty przetwarzania stron
ASP.NET. Dziki zdarzeniom klasy HttpApplication mona wykonywa czynnoci cakowicie
niewidocznych dla uytkownika, takich jak uwierzytelnianie lub personalizacja wybr zaley
wycznie od Ciebie.

Konfiguracja ASP.NET
Konfiguracja ustawie aplikacji jest konieczna w tym samym stopniu co kontrola przebiegu jej
wykonywania. Konfiguracja aplikacji obejmuje okrelanie sposobu prezentowania stron, kontrol
dostpu do poszczeglnych czci aplikacji, i tak dalej. Jak si wkrtce przekonasz ASP.NET
zawiera wiele czci ktre mona konfigurowa i udostpnia elegancki system zapewniajcy atwe
zarzdzanie tymi elementami.
ASP.NET posiada hierarchiczny system konfiguracji, ktry zapewnia due moliwoci rozbudowy
lecz przede wszystkim jest tekstowy. Oznacza to, e mog zdalnie uzyska do niego dostp i
modyfikowa ustawienia konfiguracyjne.
Nowe wyraenie
W hierarchicznym systemie konfiguracji informacje konfiguracyjne aplikacji s stosowane
zgodnie ze struktur katalogw wirtualnych witryny. Podkatalogi mog dziedziczy oraz zmienia
ustawienia konfiguracyjne odziedziczone po katalogach nadrzdnych. W rzeczywistoci,
wszystkie katalogi dziedzicz ustawienia podane w domylnym, systemowym pliku
konfiguracyjny o nazwie machine.config. Plik ten jest zazwyczaj przechowywany w folderze
\WinNT\Microsoft.NET\Framework\<wersja>\CONFIG. Taki system konfiguracyjny daje du
elastyczno przy projektowaniu aplikacji.
System konfiguracyjny ASP.NET jest implementowany przy wykorzystaniu pliku web.config. Jest
to tekstowy plik zawierajcy dane XML. W nastpnej czci rozdziau zostanie on szczegowo
omwiony.

web.config
O pliku web.config wspominaem w niniejszej ksice przynajmniej kilka razy. Wiemy ju, e
zawiera on informacje wykorzystywane przez aplikacj do okrelania sposobu dziaania. W pliku
tym nie ma niczego niezwykego zawiera on klucze i wartoci, ktre ASP.NET jest w stanie
rozpozna. Dziki swej postaci, plik ten zapewnia moliwo atwej modyfikacji wartoci, jak
rwnie pozwala na dodawanie wasnych kluczy i wartoci ktrych ASP.NET nie obsuguje za nas
(wicej o tym napisz w dalszej czci rozdziau).
Zgodnie z tym co podaem nieco wczeniej system konfiguracyjny ASP.NET jest hierarchiczny.
W kontekcie pliku web.config oznacza to, e ustawienia podane w kadym z tych plikw
obowizuj wycznie w katalogu, w ktrym dany plik jest umieszczony oraz w jego
podkatalogach. A zatem aby okreli ustawienia konfiguracyjne dla caej aplikacji, wystarczy
umieci plik web.config w jej katalogu gwnym. Jeli ktry z jego podkatalogw bdzie mia
specjalne potrzeby, takie jak ochrona jest zasobw przed nieupowanionymi uytkownikami,
wystarczy stworzy nowy plik web.config zawierajcy odpowiednie ustawienia i umieci go w
tym podkatalogu. W ten sposb podkatalog odziedziczy wszystkie ustawienia z katalogu
nadrzdnego, a te ktre si powtrz, zostan zmodyfikowane.
Jednak ten hierarchiczny system konfiguracyjny bazuje na katalogach wirtualnych, a nie na
fizycznych folderach. Aby zrozumie co to oznacza, wyobramy sobie witryn WWW, ktrej
struktura folderw zostaa przedstawiona na rysunku 18.4.

Rysunek 18.4. Przykadowa struktura folderw witryny WWW


Opis rysunku
Parent Rodzic (katalog wirtualny)
child Podrzedny
grand Podpodrzedny

Zamy, e jedynym katalogiem wirtualnym jest folder Rodzic. Wszystkie trzy foldery dziedzicz
ustawienia systemowe. Katalog Rodzic moe zmieni te ustawienia lub rozbudowa je dodajc
wasny plik web.config. Jeli uytkownik sprbuje wywietli zasoby znajdujce si w folderze
Podrzedny posugujc si przy tym adresem URL http://localhost/Rodzic/Podrzedny, to folder ten
(podobnie zreszt jak folder Podpodrzedny) odziedziczy ustawienia po folderze Rodzic.
Ustawienia konfiguracyjne dziedziczone przez kady z tych folderw take mona zmieni,
wystarczy w tym celu stworzy nowy plik web.config.
A teraz zamy, e take folder Podrzedny jest katalogiem wirtualnym, a do jego zasobw mona
si odwoywa przy uyciu adresu URL o postaci http://localhost/Podrzedny. W takim przypadku
folder ten nie bdzie dziedziczy ustawie po folderze Rodzic, gdy pliki web.config s
przetwarzane na podstawie hierarchii katalogw wirtualnych a nie folderw fizycznie zapisanych
na dysku. Natomiast ustawienia konfiguracyjne folderu Podpodrzedny bd zalee od sposobu
odwoania si do jego zasobw. I tak podanie adresu
http://localhost/Rodzic/Podrzedny/Podpodrzedny spowoduje wykorzystanie innych ustawie ni
te, ktre zostan uyte w przypadku podania adresu http://localhost/Podrzedny. Jak zatem wida,
naley zachowa du ostrono przy tworzeniu hierarchii katalogw wirtualnych.
ASP.NET nie daje moliwoci wywietlenia zawartoci plikw web.config w przegldarkach
WWW; podobnie jak nie byo to moliwe w przypadku plikw global.asax. Prba wywietlanie
pliku web.config w przegldarce spowoduje wywietlenie w niej komunikatu o bdzie
przedstawionego na rysunku 18.2. Ta metoda w bardzo skuteczny sposb uniemoliwia
podgldanie ustawie konfiguracyjnych aplikacji.
Wszelkie zmiany dokonywane w plikach web.config s automatycznie wykrywane, a aplikacja
zostaje ponownie uruchomiona, aby zostay one uwzgldnione.
Ale dosy tej teorii, przyjrzyjmy si jak wyglda przykadowy plik web.config. Podstawowy
format zawartoci plikw web.config jest cakiem prosty:
<configuration>
<configSections>
<!-- Deklaracje procedur -->
</configSections>
<system.web>
<!-- Ustawienia konfiguracyjne ASP.NET -->
</system.web>
<system.net>
<!-- Ustawienia konfiguracyjne rodowiska wykonawczego .NET -->
</system.net>
</configuration>

Jak wida w plikach web.config nie ma adnych skryptw ani kodu HTML, a jedynie informacje
zapisane w jzyku XML. Wewntrz znacznikw <configuration> s zazwyczaj umieszczane
dwa rne elementy sekcja konfiguracyjna procedur obsugi oraz sekcja konfiguracyjna
ustawie. Pierwsza z nich deklaruje typy danych stosowane w pliku web.config, a druga waciwe
ustawienia zapisane w formie par klucz-warto.
Procedur podane w sekcji konfiguracyjnej procedur, oznaczanej elementem <configSections>,
przetwarzaj informacje zapisane w pliku web.config i zwracaj odpowiednie obiekty; procedury
te koniecznie naley poda, aby mechanizmy ASP.NET wiedziay jakie typy informacji
konfiguracyjnych s wykorzystywane. Na przykad, jeli opcja o nazwie XmlFiles bdzie
zawiera list nazw plikw XML, to naleaoby zadeklarowa odpowiedni procedur obsugi
sekcji konfiguracyjnej o nazwie XmlFiles, ktrej wywoanie zwrci, na przykad, obiekt klasy
XmlTextReader. Na szczcie ASP.NET dostarcza ju kilku rnych procedur obsugi sekcji
konfiguracyjnych, zadeklarowanych w domylnym pliku konfiguracyjnym machine.config. Dziki
temu nie trzeba deklarowa tych procedur samodzielnie.
Na przykad, listing 18.3 przedstawia fragment domylnej sekcji konfiguracyjnej zawierajcej
sekcj system.web:

Listing 18.3. Przykadowa sekcja procedur obsugi (listing1803-web.config).


1 <configuration>
2 <configSections>
3 <sectionGroup name="system.web">
4 <section name="browserCaps"
type="System.Web.Configuration.HttpCapabilitiesSectionHandler,System.Web
" />
5 <section name="clientTarget"
type="System.Web.Configuration.ClientTargetSectionHandler,System.Web" />
6 <section name="compilation"
type="System.Web.UI.CompilationConfigurationHandler,System.Web" />
7 <section name="pages"
type="System.Web.UI.PagesConfigurationHandler,System.Web" />
8 </sectionGroup>
9 </configSections>
10 </configuration>

Analiza
Jak wida powyszy plik jest ju cakiem zoony, dlatego te nie bd go szczegowo omawia.
Wystarczy aby widzia, e kada sekcja tego pliku zdefiniowana przy uyciu elementu section
z atrybutem name zawiera ustawienia wykorzystywane przez ASP.NET (ustawienia te zostan
szczegowo opisane w nastpnej czci rozdziau). Wicej informacji na ten temat znajdziesz w
dokumentacji rodowiska .NET.

Notatka
Zwr uwag na format zapisu poszczeglnych elementw pliku web.config. Jeli nazwa
elementu jest poczeniem kilku sw (na przykad sectionGroup), to pierwsze sowo zaczyna
si z maej litery, natomiast wszystkie pozostaa z duej. Ten sposb zapisu nazw
elementw jest standardowo stosowany w plikach web.config. W plikach tych uwzgldniana jest
wielko liter, a zatem naley zwraca szczegln uwag na sposb zapisu ich zawartoci,
gdy uycie liter o nieodpowiedniej wielkoci moe doprowadzi do powstania bdw.

To wanie ustawienia konfiguracyjne pary klucz-warto okrelaj parametry dziaania


aplikacji ASP.NET. Stosowane s dwa rodzaje sekcji zawierajcych te ustawienia
system.net oraz system.web. Pierwsza z nich suy do konfiguracji rodowiska
wykonawczego .NET, dlatego nie bdziemy jej szerzej omawia. Natomiast druga sekcja
system.web jest wykorzystywana do kontroli ASP.NET. Wszystkie ustawienia dotyczce
aplikacji ASP.NET (z dwoma wyjtkami ktre przedstawi w dalszej czci rozdziau), bd
umieszczane pomidzy znacznikami <system.web>. Przykad tej sekcji przedstawiony zosta na
listingu 18.4.

Listing 18.4. Przykadowy plik konfiguracyjny.


1 <configuration>
2 <system.web>
3 <trace
4 enabled="false"
5 requestLimit="10"
6 pageOutput="false"
7 traceMode="SortByTime"
8 localOnly="true"
9 />
10 <globalization
11 requestEncoding="iso-8859-1"
12 responseEncoding="iso-8859-1"
13 />
14 <customErrors mode="RemoteOnly" />
15 <!-- Dostepne wartosci atrybut mode to:
16 On, Off oraz RemoteOnly -->
17 </system.web>
18 </configuration>

Analiza
Plik przedstawiony na powyszym przykadzie zawiera trzy rne ustawienia konfiguracyjne
ASP.NET. Pierwsze z nich trace rozpoczynajce si w wierszu 3. zawiera ustawienia
wykorzystywane przez usug ledzenia ASP.NET (wicej informacji na jej temat znajdziesz w
rozdziale 20., pt.: Testowanie stron ASP.NET). Drugie ustawienie konfiguracyjne
globalization rozpoczynajce si w wierszu 10., okrela sposb przesyania danych
wynikowych do przegldarki (to zagadnienie zostanie omwione w nastpnym rozdziale). I w
kocu ostatnie ustawienie customErrors okrela sposb w jaki aplikacja bdzie
wywietlaa informacje o bdach.

Notatka
Take w tym przykadzie zwr szczegln uwag na wielko liter stosowan przy
zapisywaniu nazw elementw.
W tabeli 18.2 przedstawione zostay wszystkie ustawienia konfiguracyjne, ktre mog by
stosowane w plikach web.config. W niniejszej ksice opisz tylko cz z nich, gdy niektre s
stosowane bardzo rzadko. Jednak w tabeli 18.2 znajdziesz pobiene informacje o kadym z
dostpnych ustawie.

Tabela 18.2. Ustawienia konfiguracyjne stosowane w plikach web.config.


Nazwa sekcji Opis
<appSettings> Umoliwia okrelanie wasnych ustawie konfiguracyjnych.
<authentication> Okrela w jaki sposb ASP.NET uwierzytelnia uytkownikw (wicej
informacji na ten temat znajdziesz w rozdziale 21., pt.: Zabezpieczanie
aplikacji ASP.NET).
<authorization> Okrela autoryzacj zasobw dostpnych w ASP.NET (wicej informacji
na ten temat znajdziesz w rozdziale 21., pt.: Zabezpieczanie aplikacji
ASP.NET).
<browserCaps> Odpowiada za kontrol ustawie komponentu okrelajcego moliwoci
przegldarek.
<compilation> Okrela ustawienia kompilacji wykorzystywane przez ASP.NET. Wicej
informacji na ten temat znajdziesz w rozdziale 20.
<customErrors> Okrela jak ASP.NET ma wywietla bdy w przegldarkach WWW.
<globalization> Odpowiada za konfiguracj ustawie globalizacyjnych aplikacji (wicej
informacji na ten temat znajdziesz w rozdziale 20.).
<httpHandlers> Odpowiedzialna za odwzorowywanie przesyanych adresw URL na klasy
IHttpHandler. Podfoldery nie dziedzicz tych ustawie. Odpowiada
take za odwzorowywanie nadsyanych adresw URL na klasy
IHttpHandlerFactory. Informacje podane w sekcjach
<IHttpHandlerFactory> s hierarchicznie dziedziczone przez
podfoldery.
<httpModules> Odpowiada za konfiguracj moduw Http w danej aplikacji. Moduy Http
bior udzia w przetwarzaniu wszystkich da obsugiwanych przez
aplikacj i s najczciej wykorzystywane przy jej zabezpieczaniu oraz
rejestracji jej dziaalnoci.
<identity> Kontroluje w jaki sposb ASP.NET korzysta ze swych zasobw (jaki
uytkownik jest w tym celu wykorzystywany). Wicej informacji na ten
temat znajdziesz w rozdziale 21.
<location> Specjalny znacznik okrelajcy w jaki sposb ustawienia odnosz si do
katalogu w aplikacji ASP.NET.
<pages> Zawieraj ustawienia dotyczce konkretnych stron ASP.NET.
<processModel> Okrelaj ustawienia modelu procesu ASP.NET wykorzystywane przez
IIS.
<sessionState> Zawieraj ustawienia odpowiedzialne za konfiguracj stanu sesji.
<trace> Zawieraj ustawienia konfigurujce usug ledzenia ASP.NET.
<webServices> Zawieraj ustawienia wykorzystywane przez serwisy sieci WWW
(zagadnienia zwizane z serwisami sieci WWW zostay przedstawione w
rozdziaach 16., pt.: Tworzenie serwisw sieci Web oraz 17., pt.:
Wykorzystanie i zabezpieczanie serwisw sieci WWW.
Sekcje konfiguracyjne
Cho mona zdefiniowa dowolne sekcje konfiguracyjne, to jednak w ASP.NET dostpnych jest
kilka sekcji domylnych, ktre mog zaspokoi wszystkie nasze potrzeby. W kilku kolejnych
czciach rozdziau zostaa opisana skadnia i przedstawione przykady wykorzystania kilku
najczciej stosowanych sekcji konfiguracyjnych.
W kadej sekcji mona umieszcza podelementy oraz atrybuty. Podelementy s niezalenymi
znacznikami umieszczanymi poniej (czyli wewntrz) aktualnego znacznika i mog zawiera
swoje wasne podelementy i atrybuty. Z kolei atrybuty okrelaj waciwoci znacznika, jak na
przykad atrybut id elementw sterujcych serwera.
Naley pamita, e kade z tych ustawie musi by umieszczone wewntrz sekcji
konfiguracyjnej <system.web>. Istniej co prawda dwa wyjtki od tej reguy, ktre opisz w
dalszej czci rozdziau.

<appSettings>
Ta sekcja pozwala na definiowanie wasnych informacji konfiguracyjnych, ktre mog zosta
wykorzystane w aplikacji ASP.NET. Przykadowo w tej sekcji mona umieci wykorzystywany
w aplikacji acuch poczenia z baz danych (wicej informacji na ten temat znajdziesz w
rozdziale 8., pt.: Podstawowe wiadomoci na temat tworzenia baz danych). Wewntrz tej sekcji
mona zapisywa jedne podelement add zawierajcy dwa atrybuty key oraz value.
Sekcja <appSettings> suy wycznie do okrelania wasnych ustawie dotyczcych aplikacji
ASP.NET w aden sposb nie korzysta z umieszczonych w niej informacji (chyba, e samemu
zadasz aby informacje te byy uywane). Skadnia zapisu tej sekcji jest cakiem prosta:
<appSettings>
<add key="ApplicationName" value="MojaAplikacja" />
<add key="DSN" value="Provider=Microsoft.Jet.OLEDB.4.0; Data
Source=C:\ASPNET\data\banking.mdb" />
</appSettings>

Sposb wykorzystania wartoci podawanych w tej sekcji rni si nieco metod pobierania innych
danych konfiguracyjnych ASP.NET sprawia, i jest on znacznie atwiejszy. Przede wszystkim
znacznik <appSettings> nie musi by umieszczany wewntrz elementu <system.web>
mona go umieci bezporednio wewntrz elementu <configuration>. Dziki temu, zarwno
aplikacje ASP.NET jak i standardowe aplikacje rodowiska .NET mog korzysta z tych ustawie
konfiguracyjnych.
Poza tym, informacji tych nie trzeba pobiera przy uyciu metody GetConfig (ktra zostanie
opisana w dalszej czci rozdziau). ASP.NET udostpnia bowiem specjaln waciwoci, dziki
ktrej wykorzystanie informacji konfiguracyjnych podanych w tej sekcji jest wyjtkowo atwe.
Waciwoci t jest ConfigurationSettings.Appsettings. Na przykad, zakadajc e
korzystamy z sekcji <appSettings> przedstawionej na poprzednim przykadzie, ponisza
procedura Page_Load wywietli w przegldarce napis MojaAplikacja:
sub Page_Load(obj as Object, e as EventArgs)
Response.write(ConfigurationSettings.AppSettings _
("AppliactionName")
end sub

Jak wida, aby pobra wybran warto, wystarczy poda w nawiasach nazw odpowiedniego
klucza.

<browserCaps>
Ta sekcja moe zawiera wiele rnych elementw i ustawie. Reprezentuje ona wszystkie
moliwoci przegldarki, na przykad: czy jest ona w stanie obsugiwa skrypty napisane w jzyku
JavaScript, numer wersji przegldarki, i tak dalej. W niniejszej ksice nie bdziemy omawiali
wszystkich dostpnych ustawie. Skadnia zapisu tej sekcji ma nastpujc posta:
<configuration>
<system.web>
<browserCaps>
browser="Unknown"
version=0.0
majorver=0
minorver=0
frames=false
tables=false
...
</borwserCaps>
</system.web>
</configuration>

Szczegowe informacje na temat kadej z waciwoci tej sekcji mona znale w


dokumentacji .NET SDK.

<customErrors>
Ta sekcja pozwala na definiowanie wasnych bdw, ktre bd wykorzystywane w aplikacji,
bd modyfikowa sposb obsugi predefiniowanych bdw ASP.NET. Przykadowo, jeli
uytkownik sprbuje wywietli stron ASP.NET, ktrej nie ma na serwerze, to w przegldarce
pojawi si strona przedstawiona na rysunku 18.5.

Rysunek 18.5. Typowa posta strony wywietlanej w przypadku uytkownik sprbuje


wywietli stron helloworld.aspx, ktrej nie ma na serwerze

Znacznik <customErrors> posiada dwa atrybuty: defaultRedirect oraz mode. Pierwszy z


tych atrybutw okrela adres URL pod jaki naley przekierowa przegldark jeli pojawi si
jakikolwiek bd, a drugi mode informuje czy obsuga bdw okrelana przez autora
aplikacji jest wczona (on), wyczona (off) czy te, czy bdy te maj by wywietlane
wycznie na zdalnych klientach (remote). Innymi sowy Ty, jako autor aplikacji, moesz nie
zauwaa adnych komunikatw bdw, lecz bd one wywietlane w przegldarkach
uytkownikw kocowych.
W tej sekcji mona take umieszcza jeden podelement. Nosi on nazw error i pozwala na
okrelanie sposobu obsugi konkretnych bdw. Na przykad przyjrzyj si poniszemu
fragmentowi kodu:
<customErrors defaultRedirect="error.htm" mode="on">
<error statuscode="404" redirect="error404.htm" />
</customErrors>

Powyszy fragment pliku konfiguracyjnego informuje, e w przypadku wystpienia bdu 404


(Resource Cannot Be Found, nie mona odnale zasobu, patrz rysunek 18.5), w przegldarce
uytkownika naley wywietli stron o nazwie error404.htm. Strona ta moe zawiera stosowny
komunikat o bdzie pasujcy do szaty graficznej caej aplikacji. W przypadku pojawienia si
jakichkolwiek innych bdw, w przegldarce uytkownika zostanie wywietlona strona
error.htm, ktra z kolei moe zawiera bardziej oglny komunikat o bdzie.
Jeli obsuga bdw definiowana przez twrc aplikacji jest wczona i jeli pojawi jaki bd, to
ASP.NET wykona wskazan stron obsugi bdw przekazujc do niej (w acuchu zapytania)
atrybut aspxerrorpath zawierajcy wirtualn ciek dostpu do strony w ktrej pojawi si
bd. Na przykad, w przypadku wykorzystania podanych wczeniej ustawie konfiguracyjnych,
jeli uytkownik zada wywietlenia strony helloworld.aspx to jego przegldarka zostanie
przekierowana pod nastpujcy adres URL:
http://localhost/aspnetdlakazdego/error404.htm?
aspxerrorpath=/aspnetdlakazdego/helloworld.aspx

Przekazan informacj mona wykorzystywa na wiele rnych sposobw. Na przykad, mona


wywietli niepoprawny adres URL i poprosi uytkownika o sprawdzenie jego poprawnoci lub
aktualizacj zakadek, a nawet zapisa informacje o bdzie w bazie danych, co pniej moe si
przyda do przeanalizowania bdw wystpujcych na witrynie.

<location>
<location> jest drug sekcj konfiguracyjn ktra nie musi by umieszczana w sekcji
<system.web>. Zostaa ona stworzona po to, aby umoliwi tworzenie ustawie, ktre bd
dotyczy wybranych miejsc serwera WWW. Najczciej w sekcjach <location> s umieszczane
informacje wykorzystywane przy zabezpieczaniu aplikacji. Z tego wzgldu sekcja sta zostanie
szczegowo omwiona w rozdziale 21.
Przeanalizujmy prosty przykad. Nasza witryna skada si z dwch stron: default.aspx oraz
members.aspx. Mona si domyli, e pierwsza z nich jest domyln stron naszej witryny i
kady powinien mie moliwo ogldnicia jej. Z kolei druga strona ma by dostpna tylko dla
uytkownikw, ktrzy si zarejestrowali na witrynie i zalogowali. Z tego powodu,
wykorzystywane ustawienia zabezpiecze powinny odnosi si wycznie do tego drugiego pliku.
Stosowny kod konfiguracyjny zosta podany na poniszym przykadzie:
<configuration>
<location path="members.aspx">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
</configuration>

W drugim wierszu powyszego przykadu zosta umieszczony znacznik <location> zawierajcy


atrybut okrelajcy ciek do plikw, ktrych dotyczy bd ustawienia konfiguracyjne podane
wewntrz znacznika. W naszym przypadku podane ustawienia bd dotyczy wycznie strony
members.aspx. (Przy uyciu atrybutu path mona take podawa nazwy folderw.) W tym
momencie nie bd opisywa znacznikw <authorization> ani <deny>, gdy zostan one
szczegowo omwione w rozdziale 21. Naley jednak zwrci uwag, i wewntrz znacznikw
<location> musi si znale element <system.web>. Element <location> nie wie si
bezporednio ani z ASP.NET ani ze rodowiskiem .NET, czego zazwyczaj nie mona powiedzie
o znacznikach umieszczanych wewntrz niego.
Nie wolno zapomina, e zawarto pliku web.config jest hierarchiczna, dotyczy to take
znacznikw <location>. Na przykad, przeanalizujmy poniszy fragment kodu:
<configuration>
<location path="podfolder1">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
</configuration>

Ustawienia konfiguracyjne definiowane w powyszym pliku bd dotyczy nie tylko podfolderu1,


lecz take wszystkich folderw znajdujcych si wewntrz niego, i tak dalej.

<pages>
Ta sekcja umoliwia okrelenie opcji dotyczcych stron ASP.NET, ktre s zazwyczaj podawane
przy wykorzystaniu dyrektywy @ Page. Rnica polega jednak na tym, i ustawienia
konfiguracyjne podawane w tej sekcji dotycz wszystkich stron wchodzcych w skad witryny, a
nie jednej, konkretnej strony (jak jest w przypadku dyrektywy @ Page, ktra dotyczy strony na
jakiej zostaa umieszczona). Poniej zostaa przedstawiona przykadowa posta sekcji <pages>:
<configuration>
<system.web>
<pages
buffer="on"
enableSessionState="true"
maintainState="true"
autoEventWireup="true"
clientScriptsLocation="/scripts"
inherits="System.Web.UI.Page" />
</system.web>
</configuration>

Powyszy fragment kodu zawiera wszystkie dostpne waciwoci elementw <pages>.


Powysze ustawienia sprawi, e na wszystkich stronach ASP.NET zostanie wczone
buforowanie, wykorzystanie sesji, zapamitywanie stanu (tzw. widok stanu; wicej informacji na
temat tych trzech zagadnie mona zale w rozdziale 4, pt.: Stosowanie obiektw ASP.NET w
jzykach C# i VB.NET) oraz wcza wykorzystanie zdarze generowanych na stornie.
Dodatkowo powysza sekcja <pages> okrela take pooenie skryptw wykorzystywanych po
stronie klienta i informuje ASP.NET, e kada strona powinna by obiektem klasy bdcej klas
potomn kasy System.Web.UI.Page (stosowanej domylnie).
Ta sekcja jest bardzo przydatna w sytuacjach, gdy wszystkie strony witryny maj dziaa
podobnie. Naley jednak zachowa du ostrono, gdy zazwyczaj domylne ustawienia s
cakowicie wystarczajce, a ich modyfikowanie dla pojedynczych stron moe doprowadzi do
spadku efektywnoci dziaania aplikacji a nawet do wystpienia bdw. Ustawienia
konfiguracyjne dostpne w tej sekcji bd zazwyczaj podawane niezalenie dla konkretnych stron.

<sessionState>
ASP.NET udostpnia wiele sposobw modyfikowania stanu sesji. Na przykad, wartoci
zmiennych sesyjnych mog by przechowywane na innym komputerze, co zabezpiecza je przed
awariami serwera oraz sytuacjami wymagajcymi jego wymiany. Dziki temu, niezalenie od tego
co moe si sta, dane sesyjne nigdy nie zostan utracone. Stan sesji mona take przechowywa
w innym procesie dziaajcym na tym samym komputerze, co stanowi inny sposb zabezpieczania
si przed ich utrat. W sekcji <sessionState> mona umieszcza nastpujce atrybuty:
mode Atrybut ten okrela czy w ogle naley zapamitywa informacje o sesji. Moe
on przybiera nastpujce wartoci: off (stan sesji nie bdzie zapisywany), inproc
(informacje o sesji bd zapisywane lokalnie; jest to warto domylna), stateserver
(informacje o sesji bd przechowywane na innym komputerze) bd sqlserver
(informacje o sesji bd przechowywane w bazie danych na SQL Serverze).
cookieless Ten atrybut okrela, e naley stosowa sesje ktre nie wykorzystuj
cookies (wicej informacji na temat takich sesji oraz obsugi cookies mona znale w
rozdziale 4.).
timeout Ten atrybut okrela po ilu minutach bezczynnoci ASP.NET usunie sesj
(domyla warto to 20 minut).
connectionString Ten atrybut okrela nazw oraz numer portu serwera na ktry
maj by przechowywane informacje o sesji (jeli atrybut mode ma warto
stateserver).

sqlConnectionString Ten atrybut okrela acuch poczenia uywany do


nawizania poczenia z baz danych SQL Servera, w ktrej maj by przechowywane
informacje o sesji (jeli atrybut mode ma warto sqlserver).
Oto przykadowy sposb zapisu tej sekcji:
<configuration>
<system.web>
<sessionState
mode="InProc"
cookieless="false"
timeout="10" />
<system.web>
</configuration>

Mona sdzi, e z punktu widzenia bezpieczestwa danych, przechowywanie informacji o sesji


na innym komputerze zawsze jest dobrym rozwizaniem. Jednak w takim przypadku spada
efektywno dziaania aplikacji; ASP.NET musi bowiem nawizywa poczenia sieciowe z
innym komputerem, a to zawsze zabiera duo czasu. Zapisywanie informacji o sesji w tym samym
procesie bd w innym procesie dziaajcym na tym samym komputerze nie jest moe tak
bezpieczne, lecz na pewno nieporwnywalnie szybsze.

Wasne ustawienia konfiguracyjne


Plik web.config nie musi wcale zawiera tylko tych sekcji, ktre zostay wymienione w tabeli 18.2
mona w nim umieszcza cakowicie dowolne informacje.
No dobrze, a co z sekcj <appSettings>? Czy to nie w niej naley podawa wszystkie wasne
ustawienia konfiguracyjne dotyczce danej aplikacji? Z technicznego punktu widzenia nic nie stoi
na przeszkodzie, aby faktycznie wszystkie wasne ustawienia konfiguracyjne byy zapisywane w
tej sekcji. Naley jednak pamita, i mona w niej umieszcza wycznie pary klucz-warto. W
przypadku wykorzystania waciwoci ConfigurationSettings.AppSettings (patrz
podrozdzia <appSettings> we wczeniejszej czci tego rozdziau), ASP.NET tworzy obiekt
NameValueCollection i zapisuje w nim wszystkie wartoci podane w sekcji <appSettings>.
Kolekcja ta zapewnia atwy dostp do informacji podanych w <appSettings>.
Niemniej jednak moe si zdarzy, e kolekcja NameValueCollection nie bdzie w stanie
zaspokoi naszych potrzeb. Wyobramy sobie, e dziaanie naszej aplikacji zaley od pliku XML
zawierajcego informacje o ksikach. Bez adnych problemw mona doda nazw tego pliku do
sekcji <appSettings>:
<appSettings>
<add key="Library" value="c:\inetpub\wwwroot\aspnetdlakazdego\rozdzial18\
books.xml"
</appSettings>

Jednak po pobraniu tej sekcji z pliku web.config okae si, e podane w niej informacje zostan
zwrcone w formie zwykego acucha znakw. ASP.NET pozwala na tworzenie wasnych sekcji
konfiguracyjnych, jak rwnie procedur sucych do ich obsugi, zwracajcych dane dowolnego
typu. Przyjrzyjmy si tym moliwociom nieco dokadniej. W pierwszej kolejnoci stworzymy
procedur obsugi sekcji, ktra poprawnie przetworzy zapisane w niej informacje. Pniej
stworzymy odpowiedni plik web.config zawierajcy przykadow sekcj konfiguracyjn oraz
stron ASP.NET ktra wykorzysta podane w niej ustawienia.

Tworzenie wasnych procedur obsugi sekcji


Zgodnie z tym co podaem w poprzedniej czci rozdziau, moe si zdarzy, e wbudowane
procedury obsugi sekcji konfiguracyjnych pliku web.config oka si niewystarczajce, gdy nie
bd udostpnia moliwoci funkcjonalnych koniecznych w danej aplikacji. W takich sytuacjach
mona stworzy wasne procedury obsugi sekcji, ktre bd wykonyway wszelkie niezbdne
operacje. Przeanalizujmy przykad przedstawiony na listingu 18.5.

Listing 18.5. Klasa wasnej procedury obsugi sekcji konfiguracyjnej.


1 Imports System
2 Imports System.Configuration
3 Imports System.Xml
4
5 Namespace ASPNETDK.Handlers
6 Public Class LibrarySectionHandler : Implements
IConfigurationSectionHandler
7 Public Function Create(parent as Object, configContext as Object,
section as XmlNode) as Object Implements
IConfigurationSectionHandler.Create
8 dim strFileName as String
9 strFileName = section.Attributes.Item(0).Value
10
11 dim objReader as new XmlTextReader(strFileName)
12 return objReader
13 End Function
14 End Class
15
16 End Namespace

Analiza
Zapisz powyszy kod w pliku LibrarySectionHandler.vb. Zanim dokadnie przeanalizujemy kod
tego pliku przyjrzyjmy si umieszczonej w nim klasie. W pliku web.config mona zadeklarowa,
e klasa ta ma suy od obsugi wybranej sekcji konfiguracyjnej (w sposb przedstawiony na
listingu 18.3). Za kadym razem gdy ASP.NET pobierze t sekcj konfiguracyjn, co zazwyczaj
nastpuje w wyniku wykonania jakiego fragmentu kodu, tworzony jest obiekt odpowiedniej klas
ktry nastpnie zostaje wykorzystany do obsugi informacji zapisanych w danej sekcji. W naszym
przypadku klasa odczytuje ciek dostpu do pliku z pliku web.config, a nastpnie tworzy obiekt
XmlTextReader i zwraca go. Kod, ktry zada naszego ustawienia konfiguracyjnego moe
teraz bezporednio uy obiektu XmlTextReader.
Jak wida na ostatnim przykadzie, za obsug wasnej sekcji konfiguracyjnej odpowiada klasa
jzyka VB.NET, przypominajca nieco obiekty biznesowe. Rnica pomidzy obiema klasami
polega jednak na tym, i klasa obsugujca sekcj konfiguracyjn musi implementowa interfejs
IConfigurationSectionHandler (patrz wiersz 6.). Interfejs jest klas, ktra opisuje jakie
metody i waciwoci powinna mie inna klasa. Interfejs IConfigurationSectionHandler
informuje e nasza klasa LibraryConfigurationHander musi definiowa metod Create. Nie
powiniene przejmowa si interfejsami wyobra je sobie jako wzorce na podstawie ktrych s
tworzone inne klasy (wicej informacji na ten temat mona znale w dokumentacji .NET SDK).
Naley take zwrci uwag, i nasza klasa naley do przestrzeni nazw ASPNETDK.Handlers.
W wierszu 6. deklarowana jest klasa LibrarySectionHandler ktra bdzie obsugiwa nasz
przykadow sekcj konfiguracyjn. Bdzie ona odpowiedzialna za pobranie nazwy pliku XML
zawierajcego informacje o ksikach z pliku web.config i przesanie odpowiednich wynikw na
stron ASP.NET. Naley zwrci uwag, i w deklaracji tej klasy zostao uyte sowo kluczowe
Implements.

Nastpnie, w wierszu 7., deklarowana jest metoda Create. Trzeba pamita, i interfejs
IConfigurationSectionHandler okreli ju jak metoda ta ma wyglda, a zatem deklaracja
metody w tworzonej klasie musi by identyczna. Wedug interfejsu metoda Create ma mie trzy
parametry. Pierwszy z nich jest obiektem klasy Object zawierajcym informacje o nadrzdnej
sekcji konfiguracyjnej. Innymi sowy, jeli tak sekcja odziedziczya jakie informacje z innego
pliku web.config, to ten parametr udostpni poczenie z odpowiedni sekcj tego pliku. W
naszym przypadku nie bdziemy korzysta z tego parametru. Drugi parametr configContext
jest kolejnym obiektem klasy Object; zawiera on informacje kontekstowe. Parametr ten
niemal nigdy nie jest uywany, a zatem nie bdziemy si nim zajmowa. Najwaniejszy jest trzeci
parametr metody Create, o nazwie section. Zawiera on dane XML pobrane z pliku web.config.
To wanie ten parametr wykorzystamy do przetworzenia informacji podanych w pliku
konfiguracyjnym i zwrcenia odpowiednich wynikw.
Naley take zwrci uwag na sowo kluczowe Implements umieszczone na kocu deklaracji
metody Create. Informuje ono, e poprawnie implementujemy interfejs
IConfigurationHandlerInterface oraz jaka metoda tego interfejsu jest aktualnie
implementowana. Nigdy nie mona zapomnie o uyciu tego sowa kluczowego w przypadku
implementacji interfejsw, jeli bowiem zostanie pominite, to podczas kompilacji programu
pojawi si bdy.
Analiza zawarto metody Create nie powinna przysparza wikszych problemw, gdy w
rozdziale 11. poznalimy ju metody obsugi i wykorzystania plikw XML. W wierszach 8. i 9.
pobierana jest warto atrybutu z naszej przykadowej sekcji konfiguracyjnej umieszczonej w
pliku web.config (kod tego pliku zostanie przedstawiony w dalszej czci rozdziau). Atrybut ten
bdzie zawiera ciek dostpu do pliku XML. W wierszach 11. i 12. tworzony jest obiekt
XmlTextReader operujcy na tym pliku. Obiekt ten zostaje nastpnie zwrcony jako wynik
dziaania metody Create.
Moe si wydawa, e implementacja wasnej procedury obsugi sekcji konfiguracyjnej wymaga
znacznego nakadu pracy. Lecz w rzeczywistoci cay proces jest bardzo atwy. Kod
przedstawiony na listingu 18.5 mona wielokrotnie wykorzystywa niemal w niezmienionej
postaci. Wystarczy go skopiowa, wklei do nowego pliku, zmieni nazw klasy i dostosowa
implementacj metody Create do biecych potrzeb. Dysponujc tym kodem mona stworzy
ca armi wasnych procedur obsugi sekcji konfiguracyjnych!
Pozostaa nam do wykonania jeszcze jedna czynno, zanim bdziemy mogli uzna, e
zakoczylimy tworzenie wasnej procedury obsugi sekcji konfiguracyjnej musimy
skompilowa klas z listingu 18.5. Na szczcie kompilacja programw napisanych w jzyku
VB.NET nie jest dla nas niczym nowym. W oknie wiersza plece wpisz ponisze polecenie:
vbc /t:library /out:..\bin\ASPNETDK.Handlers.dll /r:System.dll
/r:System.Xml.dll /r:System.Web.dll LibrarySectionHandler.vb

Powysze polecenie zakada, e pami podrczna komponentw .NET znajduje si na tym


samym poziomie, co folder zawierajcy plik LibrarySectionHandler.vb. Przekonajmy si teraz jak
mona wykorzysta stworzon przed chwil procedur obsugi sekcji konfiguracyjnej.

Tworzenie i pobieranie informacji z wasnych sekcji konfiguracyjnych


Pierwszym etapem wykorzystania wasnej sekcji konfiguracyjnej bdzie umieszczenie
odpowiedniego kodu w pliku web.config. Zadanie to jest wyjtkowo proste; przykadowy kod
pliku web.config zosta przedstawiony na listingu 18.6.

Listing 18.6. Plik web.config zawierajcy zdefiniowan przez nas sekcj konfiguracyjn.
1 <configuration>
2 <configSections>
3 <sectionGroup name="system.web">
4 <section name="Library"
type="ASPNETDK.Handlers.LibrarySectionHandler,ASPNETDK.Handlers" />
5 </sectionGroup>
6 </configSections>
7
8 <system.web>
9 <Library
file="c:\inetpub\wwwroot\aspnetdlakazdego\rozdzial11\books.xml" />
10 </system.web>
11 </configuration>

Analiza
Zapisz powyszy kod w pliku web.config i umie go w tym samym folderze w ktrym znajduje
si plik LibrarySectionHandler.vb. Przypomnij sobie, e plik web.config skada si z dwch czci
sekcji konfiguracyjnej procedur obsugi oraz sekcji konfiguracyjnej ustawie. Pierwsz z tych
sekcji reprezentuje element <configSections> umieszczony w 2. wierszu powyszego
przykadu. Wiersz 3. informuje, e procedura obsugi dotyczy sekcji <system.web>; rwnie
dobrze mona by poda, e dotyczy ona sekcji <system.net>, a nawet w ogle jej nie podawa.
Informacje te su bowiem wycznie do grupowania ustawie.
W wierszu 4. deklarowana jest nowa sekcja o nazwie Library. Atrybut type znacznika
<section> okrela procedur, ktra zostanie uyta do obsugi danej sekcji. W tym przypadku
wykorzystana zostanie procedura LibrarySectionHandler stworzona w poprzedniej czci
rozdziau. Okrelajc procedur obsugi naley poda pen nazw przestrzeni nazw oraz
komponent .NET w jakim zostaa ona zapisana (w naszym przypadku jest to
ASPNETDK.Handlers.dll).
Teraz mona poda waciwe ustawienia konfiguracyjne aplikacji. W wierszu 9. zostaa
umieszczona sekcja Library (zadeklarowana w wierszu 4.); jej atrybut file okrela ciek
dostpu do pliku XML (zwr uwag, e korzystamy z pliku books.xml stworzonego w rozdziale
11). Plik web.config jest gotowy, moemy si zatem zaj stron ASP.NET, ktra skorzysta z
podanych w nim ustawie konfiguracyjnych. Jej kod zosta przedstawiony na listingu 18.7.

Listing 18.7. Pobieranie wasnych ustawie konfiguracyjnych.


1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Xml" %>
3
4 <script runat="server">
5 sub Page_Load(obj as Object, e as EventArgs)
6 'pobieramy informacje
7 dim i as integer
8
9 dim objLibrary as XmlTextReader = _
10 ConfigurationSettings.GetConfig("system.web/Library")
11
12 'wywietlamy informacje
13 While objLibrary.Read()
14 Select Case objLibrary.NodeType
15 Case XmlNodeType.Element
16 if objLibrary.HasAttributes then
17 for i = 0 to objLibrary.AttributeCount - 1
18 lblLibrary.Text += objLibrary. _
19 GetAttribute(i) & " "
20 next
21 lblLibrary.Text += ", "
22 end if
23 Case XmlNodeType.Text
24 lblLibrary.Text += objLibrary.Value & "<br>"
25 End Select
26 End While
27
28 objLibrary.Close
29 end sub
30 </script>
31
32 <html><body>
33 <asp:Label id="lblLibrary" runat="server"/>
34 </body></html>

Analiza
Jedynym nowym elementem w powyszym przykadzie jest kod zapisany w wierszach 9. i 10.
Przeanalizujemy go w pierwszej kolejnoci. W tym fragmencie kodu, przy uyciu metody
GetConfig pobierana jest warto sekcji konfiguracyjnej Library zapisanej w pliku web.config.
Metoda GetConfig zwraca dowolny obiekt okrelony przez procedur obsugi danej sekcji
konfiguracyjnej. W tym przypadku, zdefiniowana przez nas wczeniej procedura obsugi zwraca
obiekt XmlTextReader. Warto zwrci uwag, i w wywoaniu metody GetConfig naley
poda ciek dostpu do pobieranej sekcji konfiguracyjnej. W naszym przypadku, sekcja
Location zostaa zapisana wewntrz elementu <system.web>, a zatem poprawne wywoanie
metody GetConfig powinno mie nastpujc posta:
GetConfig("system.web/Library")
Naley take pamita, e w plikach web.config uwzgldniana jest wielko liter, a zatem trzeba
si upewni, e nazwy poszczeglnych elementw zostay zapisane literami o odpowiedniej
wielkoci.

Pozostaa cz kodu, zapisana w wierszach do 12. do 28. przetwarza zwrcony obiekt


XmlTextReader i wywietla informacje zapisane w pliku wykorzystujc w tym celu element
sterujcy etykiety zdefiniowany w wierszu 33. Wicej informacji na temat przetwarzania plikw
XML znajdziesz w rozdziale 11. Na rysunku 18.6 zostay przedstawione wyniki wykonania strony
z listingu 18.7.

Rysunek 18.6. W wyniku przetworzenia informacji podanych w pliku web.config zosta


zwrcony obiekt XmlTextReader

Podsumujmy wszystkie informacje. ciek dostpu do pliku XML mona byo poda w sekcji
<appSettings> pliku web.config, a nastpnie pobra na stronie ASP.NET przy wykorzystaniu
waciwoci ConfigurationSettings.AppSettings. W tym przypadku strona ASP.NET
musiaaby samodzielnie utworzy obiekt XmlTextReader, aby pobra i wywietli informacje
zapisane w pliku XML.
Jednak dziki stworzeniu wasnej procedury obsugi sekcji konfiguracyjnej, autor strony ASP.NET
nie musi przejmowa si analiz danych pobieranych z pliku konfiguracyjnego, ani tworzeniem
obiektu XmlTextReader. Procedura obsugi, wykonywana w efekcie wywoania metody
GetConfig, moe wykona za nas wszystkie niezbdne czynnoci. Dziki temu, na stronie
ASP.NET wystarczy wywietli informacje pobrane z pliku XML. W zalenoci od tego ile stron
ASP.NET korzysta z tego pliku, tworzc wasn procedur obsugi sekcji konfiguracyjnej mona
zaoszczdzi sobie cakiem sporo pracy.

Wdraanie aplikacji ASP.NET


Wdraanie aplikacji internetowych byo niegdy najbardziej mczcym i najtrudniejszym etapem
tworzenia aplikacji ASP. Konieczne byo bowiem osobiste podanie odpowiednich ustawie
konfiguracyjnych aplikacji na serwerze na ktrym docelowo miaa zosta uruchomiona.
Dodatkowo konieczne byo take rczne zarejestrowanie uywanych komponentw, przy
wykorzystaniu programu REGSRV32.exe bd te przy uyciu Microsoft Transaction Servera.
Taki sposb wdraania aplikacji mg doprowadzi do problemw zwizanych z wykorzystaniem
niewaciwych wersji plikw; na przykad, bardzo czsto wystpoway problemy z bibliotekami
DLL, polegajce na tym, i konflikty pomidzy rnymi wersjami bibliotek powodoway bdy w
dziaaniu aplikacji lub sprawiay, i w ogle nie chciaa ona dziaa.
W przypadku wykorzystania technologii ASP.NET cay proces wdraania aplikacji sprowadza si
do skopiowania koniecznych plikw (stron ASP.NET, plikw konfiguracyjnych oraz bibliotek
DLL) na docelowy serwer. Jakiekolwiek rejestrowanie komponentw bd modyfikowanie
ustawie serwera WWW nie jest ju konieczne! Przyjrzyjmy si nieco dokadniej temu
wspaniaemu mechanizmowi.

Pamici podrczne komponentw .NET


By moe pamitasz, e podstawowymi elementami wspdzielenia i wielokrotnego
wykorzystywania kodu w wirtualnej maszynie CLR s komponenty .NET (ang.: assemblies)
elementy posiadajce unikaln nazw i pozwalajce na wykorzystywanie skompilowanego kodu
klas. Zazwyczaj komponentem .NET jest jedna biblioteka DLL, zdarza si jednak, e jest to kilka
plikw (czasami nawet rnych rodzajw).
Aby wykorzysta komponenty .NET w aplikacjach ASP.NET wystarczy je umieci w globalnej
bd lokalnej pamici podrcznej komponentw. Globalna pami podrczna zawiera kod
wykorzystywany przez wszystkie aplikacje dziaajce na danym serwerze WWW. Domylnie
funkcj tej pamici podrcznej peni folder \WinNT\Assembly.

Podpowied
Istnieje moliwo przegldania zawartoci globalnej pamici podrcznej komponentw .NET
oraz dodawania i usuwania z niej wybranych komponentw. Suy do tego specjalny program
narzdziowy gacutil.exe uruchamiany z poziomu wiersza polece. Poniej zostay podane
informacje dotyczce sposobu jego wykorzystania:
Sposb wywoania: gacutil <opcje> [<parametry>]
Opcje:
/i Instaluje komponent .NET w globalnej pamici podrcznej. Jako parametr
naley poda nazw pliku zawierajcego manifest.
Przykad uycia: /i myDll.dll
/u Usuwa komponent .NET z globalnej pamici podrcznej. Jako parametr
naley poda nazw usuwanego komponentu:
Przykady:
/u myDll
/u myDll,Ver=1.1.0.0,Loc=en,PK=874e23ab87e23ab
/l Wywietla list komponentw zainstalowanych w globalnej pamici
podrcznej.
/? Wywietla informacje dotyczce sposobu wywoania programu

Naley zachowa du ostrono podczas usuwania komponentw .NET z globalnej pamici


podrcznej gdy wydanie polecenia gacutil /u myDll spowoduje usunicie wszystkich
wersji biblioteki myDll. Dlatego te zawsze naley podawa wszystkie konieczne informacje.

Z lokalnych pamici podrcznych komponentw .NET mog korzysta wycznie aplikacje, do


ktrych dana pami podrczna naley. Rol domylnej lokalnej pamici podrcznej peni folder \
bin znajdujcy si w folderze gwnym aplikacji ASP.NET. Folder ten jest konfigurowany w taki
sposb, e bezporednie dania kierowane przez klienty nie mog korzysta z jego zasobw. To
bardzo przydatne rozwizanie, dziki ktremu nikt nie bdzie w stanie ukra zgromadzonego w
nim kodu. Przyjrzymy si prostej, przykadowej strukturze folderw witryny WWW
przedstawionej w tabeli 18.3.

Tabela 18.3. Przykadowa struktura folderw serwera WWW.


Adres URL aplikacji Fizyczna cieka dostpu do foldera
http://www.witryna.com c:\inetpub\wwwroot
http://www.witryna.com:85 c:\inetpub\wwwroot\port85
http://www.witryna.com/gry d:\www\games
http://www.witryna.com/gry/uzytkownicy d:\www\uzytkownicy

Kady z fizycznych folderw podanych w powyszej tabeli jest jednoczenie katalogiem


wirtualnym zdefiniowanym w serwerze IIS, a zatem, stanowi niezalen aplikacj ASP.NET.
Kada z tych aplikacji moe dysponowa swoj wasn, lokaln pamici podrczn
zlokalizowan w folderze \bin, na przykad, dla aplikacji www.witryna.com bdzie to folder
c:\inetpub\wwwroot\bin. Kada z tych lokalnych pamici podrcznych moe by wykorzystywana
wycznie przez aplikacj do ktrej naley. Dziki temu, na jednej witrynie mona korzysta z
kilku rnych wersji tego samego komponentu .NET!

Lustrzane kopie komponentw .NET


Zazwyczaj gdy wirtualna maszyna CLR aduje do pamici bibliotek DLL komponentu blokuje do
dostp do pliku, dziki czemu adna inna aplikacja nie ma do niego dostpu i nie moe go
uszkodzi. Plik jest odblokowywany gdy zostanie zniszczona korzystajca z niego domena
aplikacji. Rozwizanie to zapewnia doskona stabilno lecz jednoczenie sprawia, e koszty
wymiany plikw s niezwykle wysokie. Na przykad, w przypadku wczeniejszych wersji
technologii ASP, biblioteki DLL byyby zablokowane a do czasu ponownego uruchomienia
serwera to duy problem zarwno dla administratorw jak i uytkownikw aplikacji.
W ASP.NET problem zosta rozwizany w inny sposb. Ot komponenty .NET nie s adowane
do pamici zamiast tego, bezporednio przed uyciem komponentw tworzone s ich lustrzane
kopie i to wanie one s blokowane i adowane do pamici. Poniewa faktyczne pliki
komponentw nie s blokowane, programici mog je wymienia bez koniecznoci ponownego
uruchamiania serwera.
ASP.NET monitoruje i wykrywa wszelkie zmiany w plikach komponentw .NET. W przypadku
wykrycia zmiany jest tworzona nowa lustrzana kopia komponentu, ktra nastpnie zostanie
zaadowana do pamici i stopniowo przejmuje obsug da realizowan do tej pory przez
poprzedni kopi. Kiedy wszystkie dania bd ju obsugiwane przez now wersj kopii
komponentu, poprzednia kopia zostaje zniszczona. Cay ten proces jest zazwyczaj niewidoczny
dla uytkownika kocowego. A ile problemw moe on zaoszczdzi programistom i
administratorom!

To nie jest ASP!


Informacje podane w tym rozdziale uwidaczniaj kilka znaczcych zmian jakie wprowadzono w
ASP.NET w porwnaniu z tradycyjn wersj technologii ASP. Proces konfiguracji aplikacji oraz
ich wdraania zosta znacznie zmieniony i uproszczony. Przyzwyczajenie si do niego moe
jednak zabra nieco czasu.
Jednym z elementw, ktry nie uleg zmianie (przynajmniej pod wzgldem implementacji) jest
uycie pliku w celu kontroli zdarze zachodzcych w aplikacji. We wczeniejszych wersjach
technologii ASP by to plik global.asa, w ASP.NET nosi on nazw global.asax. Oba pliki s ze
sob w peni zgodne. Przenoszc aplikacje ASP do ASP.NET mona po prostu zapisa zawarto
pliku global.asa w pliku global.asax i mie pewno e aplikacja cay czas bdzie dziaa
poprawnie. Oczywicie s pewne niezauwaalne rnice. Jedn z nich tej fakt, i plik global.asax
jest kompilowany do postaci klasy .NET. W tradycyjnej technologii ASP plik global.asa by
interpretowany, podobnie zreszt jak wszystkie strony ASP.
Bardzo due zmiany zostay wprowadzone w systemie konfiguracji aplikacji ASP.NET. W
tradycyjnej wersji technologii ASP wszelkie ustawienia konfiguracyjne trzeba byo wprowadza
za porednictwem narzdzi administracyjnych serwera IIS lub innych aplikacji systemowych.
Zazwyczaj wizao si to z koniecznoci przeprowadzania konfiguracji bezporednio komputerze
penicym funkcj serwera WWW. Co wicej, okrelanie rnych ustawie dla rnych aplikacji
lub wybranych elementw wchodzcych w skad aplikacji byo dosy trudne.
W ASP.NET wszystkie ustawienia konfiguracyjne dostpne w tradycyjnej wersji technologii ASP
s teraz podawane w plikach XML. Oznacza to, e modyfikacja ustawie konfiguracyjnych staa
si bardzo prosta wystarczy uy dowolnego edytora tekstowego i przesa je na serwer.
Poza tym, hierarchiczny system konfiguracyjny wykorzystywany w ASP.NET zapewnia znacznie
dokadniejsz i wybircz kontrol nad aplikacj, ni byo to moliwe w tradycyjnej technologii
ASP. Podawane ustawienia konfiguracyjne mog dotyczy wycznie okrelonego pliku lub
folderu, precyzyjnie okrela sposb dziaania procesu ASP.NET, a nawet wskazywa miejsce
gdzie maj by przechowywane informacje o sesjach. Pliki web.config s w peni rozszerzalne i
pozwalaj na stosowanie wasnych ustawie konfiguracyjnych.
I w kocu ostatnia sprawa nowy sposb wdraania aplikacji moe by prawdziwym rajem dla
programistw ASP. Nie trzeba przeprowadza adnej instalacji, adnego rejestrowania
komponentw, a ustawienia konfiguracyjne mona z atwoci przekazywa z serwera na serwer.
W zasadzie uruchomienie aplikacji na innym serwerze sprowadza si do skopiowania
odpowiednich plikw. Wdraanie aplikacji internetowych nigdy nie byo prostsze.
Rozdzia 19.
Oddzielanie kodu od treci
W osiemnastu poprzednich rozdziaach ksiki przedstawionych zostao kilka sposobw na
oddzielanie interfejsu uytkownika stron ASP.NET od kodu ktry go obsuguje (napisanego w
jzyku VB.NET). Przykadowo, zostay przedstawione sposoby przenoszenia kodu, ktry nie jest
bezporednio zwizany z interfejsem uytkownika do obiektw biznesowych, dziki czemu strony
ASP.NET mog zawiera wycznie kod zwizany z obsug prezentacji danych. Co wicej,
wszelkie polecenia SQL mona zapisa w bazie danych w formie procedur zachowanych i usun
je ze stron ASP.NET (zagadnienia te zostay omwione w rozdziale 12., pt.: Zastosowanie
zaawansowanych technik obsugi danych). Wszelkie ustawienia i zmienne mona natomiast
zapisa w plikach konfiguracyjnych, takich jak web.config.
W tym rozdziale zostanie przedstawionych kilka bardziej zaawansowanych metod separacji kodu
rdowego od zawartoci strony, czyli kodu kontrolujcego dziaanie aplikacji od kodu
odpowiedzialnego za prezentacj danych (na przykad: elementw sterujcych HTML oraz
internetowych elementw sterujcych). Programici ASP.NET bardzo oczekiwali moliwoci
takiej separacji, gdy dziki nim mona uproci strony i logicznie zgrupowa wykorzystywany w
nich kod. Przecie strony ASP.NET su wycznie do prezentacji interfejsu uytkownika, a
zatem po co miaby by w nich umieszczany kod o innym przeznaczeniu?
W tym rozdziale poznamy take sposoby dostosowywania stron ASP.NET do pochodzenia
uytkownika. Metody te pozwalaj na modyfikacj zawartoci stron ASP.NET zupenie
niezalenie od wydzielonego kodu stron.
W tym rozdziale przedstawionych zostanie bardzo wiele przykadw, a zatem zaczynajmy!
W tym rozdziale zostan omwione nastpujce zagadnienia:
Czym jest kod obsugi formularzy?
Jak uywa kodu obsugi przy tworzeniu stron ASP.NET.
W jaki sposb elementy sterujce uytkownika mog korzysta z kodu obsugi.
Jak okreli pochodzenie uytkownika (na podstawie uywanego jzyka).
Jak okreli informacje o kulturze i regionie uytkownika.
W jaki sposb mona wydzieli ze stron ASP.NET najczciej uywane acuchy
znakw i zapisa je w niezalenych plikach zasobw.

Potrzeba rozdzielania rnych rodzajw


kodu
By moe przypominasz sobie z dyskusji przedstawionej w rozdziale 2., e ASP.NET stara si
uproci ycie programistom umoliwiajc niezalene grupowanie kodu ASP.NET oraz kodu
HTML. Na przykad, wikszo (o ile nie cay) kod ASP.NET powinien by umieszczany w
blokach SCRIPT na samym pocztku stron ASP.NET i oddzielony od kodu HTML. Oddzielenie
obu rodzajw kodu zostao przedstawione na rysunku 19.1.

Kod ASP.NET
<%@Page Language="VB" %>
<%@Import Namespace="System.Xml" %>
<%@Import Namespace="System.Xml.XPath" %>

<script runat="server">
sub SelectData(obj as object,e as eventargs)
Dim objDocument as New XPathDocument _
(Server.MapPath("../r11/books.xml"))

Dim objNav as XPathNavigator = objDocument.CreateNavigator

lblMessage.Text = ""
try
dim objIterator as XPathNodeIterator = _
objNav.Select(tbQuery.Text)

While objIterator.MoveNext()
lblMessage.Text += "&lt;" & _
objIterator.Current.Name & "&gt; " & _
objIterator.Current.Value & "<br>"
end while
catch ex As Exception
lblMessage.Text = ex.Message
end try
end sub
</script>

Kod HTML
<html><body>
<form runat="server">
<h2>Zapytania XPath</h2>
<p>
Na przyad:<br>
<b><code>//book[last()]/@ISBN/text()</b></code> lub
<b><code>descendant::book/author/last-name</b></code><p>

Podaj zapytanie XPath:


<asp:Textbox id="tbQuery" runat=server/>
<asp:Button id="btnSubmit" text="Wykonaj zapytanie"
runat=server OnClick="SelectData"/><p>
<asp:Label id="lblMessage" runat=server/>
</form>
</body></html>

Rysunek 19.1. Idealny sposb zapisu stron ASP.NET


Opis rysunku
ASP.NET Code Kod ASP.NET
(kod ASP.NET zosta oznaczony jako grna ramka)
HTML Code Kod HTML
(kod HTML zosta oznaczony jako dolna ramka)

Tworzenie kodu w sposb przedstawiony na rysunku 19.1 jest bardzo korzystne i to z wielu
powodw atwiej mona modyfikowa zarwno kod ASP.NET jak i kod HTML, kod rdowy
strony staje si w ten sposb bardziej logiczny i nie trzeba szuka w nim blokw kodu
wykonywalnego. Niemniej jednak moliwoci rozdzielania rnych rodzajw kodu jakie daje
ASP.NET s jeszcze wiksze. Dziki wykorzystaniu kodu obsugi oraz plikw zasobw mona
cakowicie oddzieli kod od zawartoci strony. Pierwsze z powyszych rozwiza umoliwia
zapisywanie kodu w niezalenych plikach, natomiast drugie zgrupowanie czsto
wykorzystywanych wartoci (takich jak na przykad komunikaty o bdach) i zapisanie ich w
jednym miejscu, niezalenym od strony ASP.NET.
Kod obsugi formularzy
Patrzc na rysunek 19.1 nie trudno zauway korzyci pynce z oddzielenia kodu od treci strony.
Ale co by si stao, gdyby mona byo usun ca pocztkow zawarto pliku .aspx? Dziki
temu istniaaby moliwo faktycznego oddzielenia kod ASP.NET do zawartoci strony.
Technologia ASP.NET pozwala na osignicie takiej separacji dziki wykorzystaniu kodu obsugi
formularzy. Kod obsugi formularzy jest sposobem na cakowite oddzielenie kadego i caego
kodu ASP.NET od kodu interfejsu uytkownika. Teraz zamiast jednego pliku z rysunku 19.1
otrzymujemy dwa pliki przedstawione na rysunku 19.2.

Wycznie kod HTML


<%@ Page Inherits="CodeBehind2" src="CodeBehind2.vb" %>

<html><body>
<form runat="server">
<asp:Calendar id="Calendar1" runat="server"
OnSelectionChanged="DateChanged"
Cellpadding="5" Cellspacing="5"
DayHeaderStyle-Font-Bold="True"
DayNameFormat="Short"
Font-Name="Arial" Font-Size="12px"
height="250px"
NextPrevFormat="ShortMonth"
NextPrevStyle-ForeColor="white"
SelectedDayStyle-BackColor="#ffcc66"
SelectedDayStyle-Font-Bold="True"
SelectionMode="DayWeekMonth"
SelectorStyle-BackColor="#99ccff"
SelectorStyle-ForeColor="navy"
SelectorStyle-Font-Size="9px"
ShowTitle="true"
TitleStyle-BackColor="#ddaa66"
TitleStyle-ForeColor="white"
TitleStyle-Font-Bold="True"
TodayDayStyle-Font-Bold="True" />
</form>
Wybrae:
<asp:Label id="lblMessage" runat="server"/>
</body></html>

Wycznie kod ASP.NET (kod obsugi formularza)


Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

Public Class CodeBehind2 : Inherits Page


public lblMessage as Label
public Calendar1 as Calendar

Public sub Page_Load(obj as object, e as eventargs)


if not Page.IsPostBack then
Calendar1.SelectedDate = DateTime.Now
lblMessage.Text = Calendar1.SelectedDate. _
ToString("dddd, MMMM dd yyyy")
end if
End Sub

Public sub DateChanged(obj as object, e as eventargs)


if Calendar1.SelectedDates.Count > 1 then
lblMessage.Text = Calendar1.SelectedDates(0). _
ToString("dddd, MMMM dd yyyy") & " do " & _
Calendar1.SelectedDates(Calendar1.SelectedDates. _
Count - 1).ToString("dddd, MMMM dd yyyy")
else
lblMessage.Text = Calendar1.SelectedDate. _
ToString("dddd, MMMM dd yyyy")
end if
End Sub
End Class
Rysunek 19.2. Dziki kodowi obsugi formularzy ASP.NET pozwala na cakowite oddzielenie
interfejsu uytkownika od logiki programu
Opis rysunku
HTML Wycznie kod HTML
ASP.NET Wycznie kod ASP.NET (kod obsugi formularza)

Przeanalizujmy jeszcze raz sposb dziaania ASP.NET, abymy lepiej zrozumieli model
programowania wykorzystujcy kod obsugi.
Gdy klient po raz pierwszy przesya danie dotyczce jakiej strony ASP.NET (pliku z
rozszerzeniem .aspx), ASP.NET przetwarza t stron i analizuje wszystkie wykorzystywane na
niej komponenty (na przykad, elementy sterujce serwera). Nastpnie ASP.NET tworzy klas
dynamiczn dla danego pliku .aspx. To wanie tak klasa jest nastpnie kompilowana,
wykonywana i to ona generuje kod HTML przesyany nastpnie do klienta. Musi to by kasa
potomna klasy System.Web.UI.Page, ktra zawiera definicje wykorzystywane przez wszystkie
stron ASP.NET. Cay ten proces jest wykonywany w sposb cakowicie niezauwaalny, w
momencie zgoszenia dania dotyczcego strony ASP.NET.
Jednak plik .aspx nie musi by bezporedni klas potomn klasy Page o ile tylko w
jakikolwiek sposb bdzie dziedziczy po tej klasie, to wszystko bdzie w porzdku. Oznacza to,
e mona stworzy pewn klas poredni, dziedziczc po klasie Page i zada, aby plik .aspx
dziedziczy po tej klasie poredniej. Ta nowa klasa porednia moe udostpnia dowolne
moliwoci funkcjonalne, ktre bd dostpne dla plikw .aspx. Wzajemne relacje pomidzy tymi
wszystkimi klasami zostay przedstawione na rysunku 19.3.

Rysunek 19.3. Strona ASP.NET musi by bezporedni, lub poredni klas potomn klasy
System.Web.UI.Page

Opis rysunku
System.Web.UI.Page System.Web.UI.Page
Intermediate class Klasa porednia
derive directly dziedziczy bezporednio
or indirectly lub porednio
Dynamic Klasa dynamiczna utworzona na podstawie pliku .aspx
Send Przesya wyniki do przegldarki

Ta nowa klasa porednia jest naszym kodem obsugi formularzy. Definiuje ona moliwoci
funkcjonalne z ktrych moe korzysta strona ASP.NET. Jednak przy tak duej iloci
wykorzystywanych klas atwo bdzie si mona pogubi. W zasadzie wszystko sprowadza si do
tego, i strona ASP.NET musi by klas potomn klasy Page, lecz od programisty zaley
okrelenie hierarchii tego pokrewiestwa.
Wprowadzenie klasy kodu obsugi nie daje adnych oczywistych korzyci. Strona kodu obsugi
nie zawiera adnych wasnych moliwoci funkcjonalnych, a zatem dziedziczc po niej strona
ASP.NET niczego nie zyskuje. Strona kodu obsugi take w aden sposb nie wspomaga
wykonywania stron ASP.NET. Niemniej jednak wykorzystanie tej strony pozwala na przeniesienie
kodu do klasy poredniej, dziki czemu w stronie ASP.NET moe pozosta znacznie uproszczony
kod obsugi interfejsu uytkownika.
Wykorzystanie kodu obsugi w stronach ASP.NET
Stworzenie kodu obsugi formularza jest niezwykle proste; cay proces przypomina tworzenie
obiektw biznesowych, z t rnic i niczego nie trzeba kompilowa. Niemniej jednak trzeba
przedsiwzi pewne rodki bezpieczestwa, aby zapewni e wszystko bdzie dziaa poprawnie.
Listing 19.1 przedstawia typow posta strony ASP.NET prezentujcej informacje pobierane z
bazy danych. Za chwil, na podstawie tej strony wygenerujemy kod obsugi formularza.

Listing 19.1. Typowa strona ASP.NET zawiera zarwno kod programu jak i kod HTML.
1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Data" %>
3 <%@ Import Namespace="System.Data.OleDb" %>
4
5 <script runat="server">
6 'deklarujemy poczenie
7 dim strConnString as string = "Provider=" & _
8 "Microsoft.Jet.OLEDB.4.0;" & _
9 "Data Source=C:\ASPNET\data\banking.mdb"
10 dim objConn as new OleDbConnection(strConnString)
11
12 sub Page_Load(obj as Object, e as EventArgs)
13 if Not Page.IsPostBack then
14 FillDataGrid()
15 end if
16 end sub
17
18 private sub FillDataGrid(Optional EditIndex as integer=-1)
19 'otwieramy poczenie
20 dim objCmd as OleDbCommand = new OleDbCommand _
21 ("select * from tblUsers", objConn)
22 dim objReader as OleDbDataReader
23
24 try
25 objCmd.Connection.Open()
26 objReader = objCmd.ExecuteReader
27 catch ex as OleDbException
28 lblMessage.Text = "Bd pobierania informacji z bazy danych."
29 end try
30
31 DataGrid1.DataSource = objReader
32 DataGrid1.DataBind()
33
34 objReader.Close
35 objCmd.Connection.Close()
36 end sub
37 </script>
38
39 <html><body>
40 <form runat="server">
41 <asp:Label id="lblMessage" runat="server" />
42
43 <asp:DataGrid id="DataGrid1" runat="server"
44 BorderColor="black"
45 GridLines="Vertical"
46 cellpadding="4"
47 cellspacing="0"
48 width="100%"
49 Font-Name="Arial"
50 Font-Size="8pt"
51 HeaderStyle-BackColor="#cccc99"
52 ItemStyle-BackColor="#ffffff"
53 AlternatingItemStyle-Backcolor="#cccccc"
54 AutoGenerateColumns="True" />
55 </asp:DataGrid><p>
56 </form>
57 </body></html>

Analiza
Kod przedstawiony na powyszym listingu nawizuje poczenie z baz danych stworzon w
rozdziale 8, pt.: Podstawowe wiadomoci na temat tworzenia baz danych. W wierszach od 7. do
9. jest tworzony acuch zapytania, a w wierszu 10. obiekt OleDbConnection. W procedurze
Page_Load wywoywana jest procedura FillDataGrid, ktra pobiera informacje z bazy danych
i wie je z elementem sterujcy DataGrid zdefiniowanym w wierszach od 43. do 55. Wykonanie
powyszej strony powoduje wygenerowanie wynikw przedstawionych na rysunku 19.4.

Rysunek 19.4. Prosta strona ASP.NET pobierajca informacje z bazy danych.

A teraz, bazujc na kodzie przedstawionym na listingu 19.1, stworzymy kod obsugi formularza.
W pierwszej kolejnoci naley stworzy klas potomn klasy System.Web.UI.Page. Oto
przykad szkieletu takiej klasy:
Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Data
Imports System.Data.OleDb

Public Class CodeBehind1 : Inherits Page


tu zostanie wstawiony kod klasy
End Class

Powyszy szkielet klasy bdzie podstaw do usunicia kodu skryptu ze strony przedstawionej na
listingu 19.1. Naley pamita, e tworzc klas jzyka VB.NET naley wasnorcznie
zaimportowa wszystkie przestrzenie nazw, ktre w ASP.NET byy importowane automatycznie.
Dodatkowo trzeba take zaimportowa przestrzenie nazw System.Data oraz
System.Data.OleDb, gdy tworzona strona ASP.NET bdzie z nich korzysta przy
wywietlaniu danych.
Kolejnym krokiem jest stworzenie wszystkich zmiennych publicznych, ktrych bdziemy
potrzebowa. Ze wzgldu na natur kodu obsugi formularzy, proces ten bdzie si nieco rni do
tego, do czego jestemy przyzwyczajeni. Przyjrzyjmy si nieco dokadniej temu zagadnieniu.
Klasa kodu obsugi bdzie uywana do kontroli interfejsu uytkownika (czyli, formularza
internetowego) zawiera ona ca logik konieczn do obsugi zdarze generowanych przez
interfejs uytkownika. Jednak klasa ta nie zawiera adnych elementw interfejsu uytkownika
bez wyjtkw s one umieszczane w kodzie strony .aspx. A zatem mamy problem. Klasa kodu
obsugi musi kontrolowa interfejs uytkownika, ktry w caoci jest definiowany w odrbnym
pliku. W jaki sposb mona to zrobi?
Zaraz poznasz powd dla ktrego strona ASP.NET ma by klas potomn klasy kodu obsugi.
Ot jeli wszystkie konieczne elementy interfejsu uytkownika zastan zadeklarowane w klasie
kodu obsugi, to plik .aspx odziedziczy je. Oznacza to, e kod obsugi stworzy i obsuy wszystkie
elementy interfejsu uytkownika, lecz nie bdzie ich wywietla. Za wywietlenie elementw
interfejsu uytkownika wci bdzie odpowiedzialna strona ASP.NET. Powysza idea zostaa
zilustrowana na rysunku 19.5.

Rysunek 19.5. Kod obsugi deklaruje elementy interfejsu uytkownika oraz logik ich obsugi,
natomiast strona ASP.NET wycznie je wywietla
Opis rysunku
Code-behind form Kod obsugi formularza
ASP.NET Page Strona ASP.NET
reszta bez zmian

Przeniemy zatem kod z listingu 19.1 do kodu obsugi formularza przedstawionego na listingu
19.2.

Listing 19.2. Kod obsugi zawiera wszelkie moliwoci funkcjonalne zwizane z obsug
interfejsu uytkownika (CodeBehind1.vb)
1 Imports System
2 Imports System.Web
3 Imports System.Web.UI
4 Imports System.Web.UI.WebControls
5 Imports System.Data
6 Imports System.Data.OleDb
7
8 Public Class CodeBehind1 : Inherits Page
9 'deklarujemy zmienne publiczne, ktre oddziedziczy
10 'plik .aspx.
11 public lblMessage as Label
12 public DataGrid1 as DataGrid
13
14 'deklarujemy acuch poczenia
15 private strConnString as string = "Provider=" & _
16 "Microsoft.Jet.OLEDB.4.0;" & _
17 "Data Source=C:\ASPNET\data\banking.mdb"
18 private objConn as new OleDbConnection(strConnString)
19
20 sub Page_Load(obj as Object, e as EventArgs)
21 if Not Page.IsPostBack then
22 FillDataGrid()
23 end if
24 end sub
25
26 private sub FillDataGrid(Optional EditIndex as integer=-1)
27 'otwieramy poczenie
28 dim objCmd as OleDbCommand = new OleDbCommand _
29 ("select * from tblUsers", objConn)
30 dim objReader as OleDbDataReader
31
32 try
33 objCmd.Connection.Open()
34 objReader = objCmd.ExecuteReader
35 catch ex as OleDbException
36 lblMessage.Text = "Bd przy pobieraniu danych z bazy."
37 end try
38
39 DataGrid1.DataSource = objReader
40 DataGrid1.DataBind()
41
42 objReader.Close
43 objCmd.Connection.Close()
44 end sub
45
46 End Class
Analiza
Zapisz powyszy kod w pliku o nazwie CodeBehind1.vb. W wierszach od 1. do 6. s importowane
niezbdne przestrzenie nazw, a w wierszu 8. rozpoczyna si deklaracja klasy kodu obsugi. Zwr
uwag, i nosi ona nazw CodeBehind1 i jest klas potomn klasy Page.
Na stronie ASP.NET z listingu 19.1 zostay uyte dwa elementy sterujce serwera etykieta o
nazwie lblMessage oraz element DataGrid nazwie DataGrid1. W naszej klasie kodu obsugi
elementy te zostay zadeklarowane jako zmienne (odpowiednio w wierszach 10. i 11.). Teraz
strona ASP.NET odziedziczy te elementy oraz wszelkie moliwoci funkcjonalne zdefiniowane w
klasie. Pozostaa cz kodu nie rni si niczym do zawartoci strony z listingu 19.1; oczywicie
nie dotyczy to kodu HTML ktry w pliku CodeBehind1.vb nie zosta umieszczony. Teraz
przyjrzyjmy si kodowi strony .aspx, ktra bdzie dziedziczy po klasie kodu obsugi.

Listing 19.3. Dziedziczenie po klasie kodu obsugi.


1 <%@ Page Inherits="CodeBehind1" src="CodeBehind1.vb" %>
2
3 <html><body>
4 <form runat="server">
5 <asp:Label id="lblMessage" runat="server" />
6
7 <asp:DataGrid id="DataGrid1" runat="server"
8 BorderColor="black" GridLines="Vertical"
9 cellpadding="4" cellspacing="0"
10 width="100%" Font-Name="Arial"
11 Font-Size="8pt"
12 HeaderStyle-BackColor="#cccc99"
13 ItemStyle-BackColor="#ffffff"
14 AlternatingItemStyle-Backcolor="#cccccc"
15 AutoGenerateColumns="True" />
16 </asp:DataGrid><p>
17 </form>
18 </body></html>

Analiza
Zapisz powyszy fragment kodu w pliku o nazwie listing1903.aspx i umie go w tym samym
folderze, w ktrym zosta zapisany plik zawierajcy klas kodu obsugi. Za wyjtkiem pierwszego
wiersza powyszy kod niczym nie rni si od fragmentu kodu HTML z listingu 19.1. Jednak w
pierwszym wierszu pojawi si nowy element dyrektywa @ Page z atrybutami Inherits oraz
src. Pierwszy z tych atrybutw Inherits okrela klas nadrzdn, po ktrej bdzie
dziedziczy strona ASP.NET. W naszym przypadku chcemy, aby klas nadrzdn strony bya
klasa kodu obsugi CodeBehind1. Atrybut src zawiera ciek dostpu do pliku kodu obsugi
(oznacza to, i plik zawierajcy kod obsugi oraz plik .aspx nie musz by umieszczone w tym
samym folderze). I to wszystko! Wystarczy wywietli t stron w przegldarce, a uzyskane
wyniki nie powinny si niczym rni od wynikw przedstawionych na rysunku 19.4.

Elementy sterujce serwera DataGrid oraz Label z listingu 19.3 s kopiami zmiennych
klasowych (klasy CodeBehind1), zadeklarowanych na listingu 19.2. A zatem, dowolny kod
umieszczony wewntrz klasy kodu obsugi i odwoujcy si do tych zmiennych, bdzie mia peen
dostp do wszystkich waciwoci odpowiednich elementw sterujcych formularza internetowego
(takich jak tekst wywietlany przez etykiet).
Przyjrzyjmy si teraz kodowi obsugujcemu zdarzenia generowane przez formularz. Tym razem
oba pliki zostan utworzone od samego pocztku. Listing 19.4 przedstawia kod strony ASP.NET
definiujcej interfejs uytkownika.

Notatka
Nic nie stoi na przeszkodzi, aby elementy interfejsu uytkownika oraz logika dziaania strony
ASP.NET byy umieszczone w tym samym pliku. Kod programu nie musi by w caoci
umieszczany w klasie kodu obsugi, a w pliku kodu obsugi mona umieszcza elementy
interfejsu uytkownika. Co wicej, elementy interfejsu uytkownika deklarowane w kodzie
obsugi, mog by obsugiwane przez kod zdefiniowany w pliku .aspx. Niemniej jednak nie ma
adnego powodu, aby umieszcza kod w stronie ASP.NET jeli mona go zaimplementowa
jako kod obsugi.

Listing 19.4. Plik .aspx bez kodu ASP.NET.


1 <%@ Page Inherits="CodeBehind2" src="CodeBehind2.vb" %>
2
3 <html><body>
4 <form runat="server">
5 <asp:Calendar id="Calendar1" runat="server"
6 OnSelectionChanged="DateChanged"
7 Cellpadding="5" Cellspacing="5"
8 DayHeaderStyle-Font-Bold="True"
9 DayNameFormat="Short"
10 Font-Name="Arial" Font-Size="12px"
11 height="250px"
12 NextPrevFormat="ShortMonth"
13 NextPrevStyle-ForeColor="white"
14 SelectedDayStyle-BackColor="#ffcc66"
15 SelectedDayStyle-Font-Bold="True"
16 SelectionMode="DayWeekMonth"
17 SelectorStyle-BackColor="#99ccff"
18 SelectorStyle-ForeColor="navy"
19 SelectorStyle-Font-Size="9px"
20 ShowTitle="true"
21 TitleStyle-BackColor="#ddaa66"
22 TitleStyle-ForeColor="white"
23 TitleStyle-Font-Bold="True"
24 TodayDayStyle-Font-Bold="True" />
25 </form>
26 Wybrae:
27 <asp:Label id="lblMessage" runat="server"/>
28 </body></html>

Powyszy listing zawiera element sterujcy serwera Calendar oraz etykiet. Cho plik kodu
obsugi nie zosta jeszcze utworzony, to jednak nazwa klasy oraz cieka dostpu do pliku zostay
ju podane w dyrektywnie @ Page umieszczonej w pierwszym wierszu. W ten sposb ju
zawczasu wiadomo jaki plik naley utworzy. W wierszu 6. okrelana jest procedura obsugi
zdarzenia SelectionChanged kalendarza (elementu sterujcego serwera Calendar). Naley
take zwrci uwag na nazwy obu elementw sterujcych Calendar1 oraz lblMessage.
Prba wywietlenia tej strony bez wczeniejszego utworzenia kodu obsugi, spowoduje
wystpienie bdw. Bdy te zostan zgoszone z dwch powodw. Po pierwsze ASP.NET bdzie
szuka klasy kodu obsugi podanej w atrybucie Inherit dyrektywy @ Page lecz nie bdzie w
stanie jej znale. Po drugie, do obsugi zdarzenia SelectionChanged ma by wykorzystana
procedura DateChanged, ktra nigdzie nie zostaa zdefiniowana. Aby rozwiza te problemy,
wystarczy stworzy kod obsugi przedstawiony na listingu 19.5.

Listing 19.5. Kontrola zdarze generowanych przez element sterujcy kalendarza


(CodeBehind2.vb).
1 Imports System
2 Imports System.Web
3 Imports System.Web.UI
4 Imports System.Web.UI.WebControls
5
6 Public Class CodeBehind2 : Inherits Page
7 public lblMessage as Label
8 public Calendar1 as Calendar
9
10 Public sub Page_Load(obj as object, e as eventargs)
11 if not Page.IsPostBack then
12 Calendar1.SelectedDate = DateTime.Now
13 lblMessage.Text = Calendar1.SelectedDate. _
14 ToString("dddd, MMMM dd yyyy")
15 end if
16 End Sub
17
18 Public sub DateChanged(obj as object, e as eventargs)
19 if Calendar1.SelectedDates.Count > 1 then
20 lblMessage.Text = Calendar1.SelectedDates(0). _
21 ToString("dddd, MMMM dd yyyy") & " do " & _
22 Calendar1.SelectedDates(Calendar1.SelectedDates. _
23 Count - 1).ToString("dddd, MMMM dd yyyy")
24 else
25 lblMessage.Text = Calendar1.SelectedDate. _
26 ToString("dddd, MMMM dd yyyy")
27 end if
28 End Sub
29 End Class

Analiza
Zapisz powyszy fragment kodu w pliku o nazwie CodeBehind2.vb. W wierszu 6. deklarowana
jest klasa kodu obsugi o nazwie CodeBehind2; co odpowiada nazwie podanej w atrybucie
Inherit dyrektywy @ Page z listingu 19.4. W wierszach 7. i 8. tworzone s dwie zmienne
publiczne lblMessage oraz Calendar1. Naley zwrci uwag, i s to te same nazwy ktre
nadalimy elementom sterujcym w pliku .aspx. Procedura Page_Load zapisana w wierszach od
10. do 16. wybiera w kalendarzu dzisiejsz dat i wywietla stosowny komunikat wykorzystujc w
tym celu element sterujcy etykiety.
I w kocu, metoda DataChanged ktrej kod rozpoczyna si w wierszu 18. suy do obsugi
zdarze SelectionChanged kalendarza (patrz wiersz 6. listingu 19.4). Metoda ta wywietla na
stronie dat w rozbudowanym formacie. Jeli jednoczenie zostanie wybranych kilka dni (co
mona sprawdzi za pomoc waciwoci SelectedDates.Count), to chcemy poinformowa
uytkownika o tym fakcie wywietlajc na stronie odpowiedni przedzia dat (patrz wiersze od 19.
do 23.). W przeciwnym przypadku wywietlana jest jedna wybrana data (patrz wiersze 25. i
26.). Teraz wywietlenie w przegldarce strony z listingu 19.4 da rezultaty przedstawione na
rysunku 19.6.

Rysunek 19.6. Kod obsugi formularza obsuguje zdarzenia generowane na stronie ASP.NET

Teraz moesz ju cakowicie oddzieli kod obsugujcy formularze internetowe od warstwy


prezentacji danych.
Wykorzystanie kodu obsugi w elementach
sterujcych uytkownika
Wykorzystanie kodu obsugi w elementach sterujcych uytkownika rni si nieco od
wykorzystania go do obsugi interfejsu uytkownika stron ASP.NET. Konkretnie rzecz biorc, w
tym przypadku, kod obsugi musi by klas potomn klasy System.Web.UI.UserControl (a
nie klasy Page). Wicej informacji na temat tworzenia i wykorzystania elementw sterujcych
uytkownika mona znale w rozdziale 6., pt.: Cig dalszy wiadomoci na temat tworzenia
formularzy internetowych. Na listingach od 19.6 do 19.8 przedstawiony zosta zmodyfikowany
kod aplikacji kalkulatora stworzonej w rozdziale 2., w ktrym zosta wykorzystany element
sterujcy uytkownika oraz kod obsugi formularza.

Listing 19.6. Element sterujcy uytkownika (Calculator.ascx).


1 <%@ Control Inherits="CalculatorControl" src="Calculator.vb" %>
2
3 Liczba 1: <asp:textbox id="tbNumber1" runat="server"/><br>
4 Liczba 2: <asp:textbox id="tbNumber2" runat="server"/><p>
5 <asp:button id="btAdd" runat="server" Text="+"
6 OnClick="btOperator_Click" />
7 <asp:button id="btSubtract" runat="server" Text="-"
8 OnClick="btOperator_Click"/>
9 <asp:button id="btMultiply" runat="server" Text="*"
10 OnClick="btOperator_Click"/>
11 <asp:button id="btDivide" runat="server" Text="/"
12 OnClick="btOperator_Click"/><p>
13 Wynik:
14 <asp:label id="lblMessage" runat="server"/>

Analiza
Zapisz powyszy fragment kodu w pliku o nazwie Calculator.ascx. Element sterujcy
uytkownika przedstawiony na powyszym listingu jest bardzo prosty. Zawiera on kod HTML
wywietlajcy dwa pola tekstowe w ktrych uytkownicy mog wpisywa liczby, cztery przyciski
umoliwiajce wykonywanie podstawowych operacji arytmetycznych oraz etykiet suc do
wywietlania wynikw. W pierwszym wierszu powyszego kodu, zamiast dyrektywy @ Page
zostaa umieszczona dyrektywa @ Control, jednak skadnia jej zapisu jest identyczna take w
tym przypadku klasa kodu obsugi jest okrelana przy uyciu atrybutu Inherits a nazwa pliku w
jaki zosta on zapisany przy uyciu atrybutu src. Koniecznie naley zapamita nazwy
wszystkich elementw sterujcych, gdy bd one konieczne przy tworzeniu kodu obsugi
formularza. Plik kodu obsugi dla powyszego elementu sterujcego uytkownika zosta
przedstawiony na listingu 19.7.

Listing 19.7. Klasa kod obsugi (Calculator.vb).


1 Imports System
2 Imports System.Web
3 Imports System.Web.UI
4 Imports System.Web.UI.WebControls
5
6 Public Class CalculatorControl : Inherits UserControl
7 public lblMessage as Label
8 public btAdd as Button
9 public btSubtract as Button
10 public btMultiply as Button
11 public btDivide as Button
12 public tbNumber1 as TextBox
13 public tbNumber2 as TextBox
14
15 Sub btOperator_Click(obj as object, e as eventargs)
16 lblMessage.Text = Operate(CType(obj, Button).Text, _
17 tbNumber1.Text, tbNumber2.Text).ToString
18 End Sub
19
20 private function Operate(operator as string, number1 as string,
optional number2 as string = "1") as double
21 select case operator
22 case "+"
23 Operate = CDbl(number1) + CDbl(number2)
24 case "-"
25 Operate = CDbl(number1) - CDbl(number2)
26 case "*"
27 Operate = CDbl(number1) * CDbl(number2)
28 case "/"
29 Operate = CDbl(number1) / CDbl(number2)
30 end select
31 end function
32 End Class

Analiza
Zapisz powyszy kod w pliku o nazwie Calculator.vb. Moliwoci funkcjonalne
zaimplementowane w tym przykadzie s znacznie bardziej skomplikowane do tych z listingu
19.5, niemniej jednak sposb ich zapisu jest identyczny. W pierwszej kolejnoci, w wierszach do
1. do 4., s importowane niezbdne przestrzenie nazw. W wierszu 6. rozpoczyna si deklaracja
klasy CalculatorControl, bdcej klas potomn klasy UserControl (a nie klasy Page).
Nastpnie, w wierszach od 7. do 13. zostay zadeklarowane publiczne zmienne klasowe
odpowiadajce elementom sterujcym wykorzystywanym w tworzonym elemencie sterujcym
uytkownika.
Gdy uytkownik kliknie jeden z przyciskw elementu sterujcego, zostanie wykonana procedura
obsugi zdarzenia o nazwie btOperator_Clicked. Procedura ta wywoa metod Operate
pobierajc trzy argumenty operacj jak naley wykona oraz dwa operandy. W momencie
przesyania dania, przycisk jaki spowodowa zgoszenie zdarzenia bdzie reprezentowany przez
zmienn obj (patrz wiersz 15.) Przyjrzyjmy si pierwszemu argumentowi wywoania metody
Operate zapisanemu w wierszu 16.:
Ctype(obj, Button).Text

Powysze wyraenie pobiera warto waciwoci Text przycisku, ktry spowodowa zgoszenie
zdarzenia (na przykad, dla przycisku btAdd bdzie to +). Jeli t sam czynnoci mielibymy
wykona w kodzie strony ASP.NET, to wystarczyoby uy wyraenia obj.Text, niezalenie od
tego, e klasa Object nie dysponuje waciwoci o nazwie Text. Jednak klasy jzyka VB.NET
dziaaj inaczej ni strony ASP.NET. Konkretnie rzecz biorc nie dysponuj one moliwoci
pnego czenia.

Nowe wyraenie
Pne czenie (ang.: late binding) oznacza, e zmienne typu Object (takie jak obj) nie s
przetwarzane a do czasu wykonania programu. A do tego momentu mona ich uywa do
reprezentacji obiektw dowolnych typw. To wanie z tego wzgldu mona uy wyraenia
obj.Text pomimo faktu, i klasa Object nie dysponuje waciwoci o tej nazwie. ASP.NET
zezwoli na wykorzystania wyraenia obj.Text gdy wie, e w czasie obsugi dania zmienna
obj moe si sta obiektem klasy Button (gdyby si jednak nie staa, to moglibymy mie
powane problemy).
Gdyby mechanizm pnego czenia nie by wykorzystywany, to klasa Object byaby od razu
przetwarzana a kompilator zgosiby bd zaraz po okreleniu e zostaa podjta prba uzyskania
dostpu do waciwoci ktrej nie ma (klasa Object nie posiada bowiem adnej waciwoci o
nazwie Text). Wanie z tego powodu naley sprawi, aby kompilator VB.NET sdzi e zmienna
obj jest przyciskiem jeszcze zanim zostanie przesane danie, gdy dziki temu bdzie mona
wykorzysta w kodzie waciwo Text. Metoda CType rzutuje jeden typ danych na inny, a
wyraenie uyte w wierszu 16. rzutuje zmienn typu Object na zmienn typu Button. Moe si
wydawa, e jest to dosy zoone rozwizanie, jednak gdy stworzysz wicej stron ASP.NET i
zdobdziesz wicej informacji na temat czenia, wszystko stanie si znacznie prostsze.
Metoda Operate zdefiniowana w wierszach od 20. do 31. analizuje operator przekazany przez
metod btOperator_Clicked przy wykorzystaniu instrukcji wyboru select case. W
zalenoci od przekazanego operatora wykonywane jest odpowiednie dziaanie. Jego wynik jest
nastpnie zwracany do metody btOperator_Clikced i wywietlany na stronie WWW.
Na listingu 19.8 przedstawiony zosta kod wyjtkowo krtkiej strony ASP.NET ktra
wykorzystuje stworzony przed chwil element sterujcy uytkownika.

Listing 19.8. Strona ASP.NET wykorzystujca element sterujcy uytkownika oraz kod
obsugi formularza.
1 <%@ Page language="VB" %>
2 <%@ Register TagPrefix="ASPNETDK" TagName="Calculator"
src="Calculator.ascx" %>
3
4 <html><body>
5 <form runat="server">
6 <ASPNETDK:Calculator id="Calc1" runat="server"/>
7 </form>
8 </body></html>

Analiza
Powysza strona jest wyjtkowo prosta. Zapewne pamitasz, e element sterujcy uytkownika
musi zosta zarejestrowany na stronie ASP.NET. Suy do tego dyrektywa @ Register, opisana
w szczegowo w rozdziale 6., pt.: Cig dalszy wiadomoci na temat tworzenia formularzy
internetowych. Po zarejestrowaniu, elementu sterujcego uytkownika bdzie mona uywa tak
samo, jak wszelkich innych elementw sterujcych (patrz wiersz 5.). Wywietl t stron w
przegldarce, a nastpnie sprbuj wpisa jakie liczby w polach formularza i wykona jakie
dziaania. Wyniki powinny przypomina te, przedstawione na rysunku 19.7.

Rysunek 19.7. Kod obsugi formularza obsuguje zdarzenia generowane przez element sterujcy
uytkownika umieszczony na stronie ASP.NET

Pliki zasobw i lokalizacja


Udajc si na wakacje zabieramy walizk z ubraniami, przyborami toaletowymi oraz innymi
rzeczami osobistymi. Mona by take zabra te wszystkie rzeczy bezporednio ze sob (albo i na
sobie) ale byo by to bardzo dziwne i niewygodne (nie wspominajc w ogle o ograniczonej iloci
kieszeni!). Ta walizka jest na wakacjach przedmiotem o pierwszorzdny znaczeniu bez niej
nasza wycieczka staa by si koszmarem.
ASP.NET pozwala nam na pakowanie walizki dla tworzonej aplikacji. Wszelkie informacje
(takie jak zmienne, komunikaty, notatki, rysunki, itp.) mona zapisa w pliku zasobu. Strony
ASP.NET bez trudu mog nastpnie pobiera zasoby zgromadzone w takim pliku, gdy tylko bd
potrzebne.

Nowe wyraenie
Pliki zasobw s zazwyczaj wykorzystywane do lokalizowania aplikacji. Lokalizowanie jest
procesem polegajcym na modyfikacji wynikw generowanych przez aplikacj tak aby byy one
zgodne z rnymi kulturami i jzykami. Mona tworzy pliki zasobw dla wszystkich kultur jakie
bd korzysta z danej aplikacji. Na przykad, w pliku zasobw mona zapisa wiadomo
powitaln. Jeli aplikacj odwiedzi osoba anglojzyczna komunikat powitalny bdzie mia posta
Hello, dla uytkownikw z Francji lub innych krajw francuskojzycznych komunikat ten
bdzie mia posta Bonjour. Zapisujc wiadomo powitaln dla kadego z jzykw w
odrbnym pliku zasobw nie trzeba bdzie tworzy rnych stron ASP.NET dla rnych
jzykw. Znacznie atwiej jest stworzy nowy plik zasobw.
W ASP.NET lokalizacja aplikacji oraz grupowanie zasobw jest bardzo atwym procesem.
Pozwala on na modyfikacj wynikw dziaania aplikacji bez koniecznoci wprowadzania
jakichkolwiek zmian w kodzie, czyli stanowi jeszcze jedn form oddzielania kodu od treci. W
kilku kolejnych czciach niniejszego rozdziau przedstawione zostan sposoby okrelania jacy
uytkownicy korzystaj z aplikacji, metody modyfikacji aplikacji pod ich ktem oraz zapisywania
zasobw w plikach.

Lokalizowanie aplikacji
W idealnym przypadku lokalizowania aplikacji bdziemy dy do automatycznego okrelenia
pochodzenia korzystajcych z niej uytkownikw, tak aby mona byo wykorzysta odpowiednie
jzyki oraz inne informacje kulturowe. Niestety ze wzgldu na charakter WWW nie ma adnego
standardowego sposobu na okrelenie geograficznego pooenia osoby odwiedzajcej witryn.
Na szczcie jednak istniej kilka sposobw rozwizania tego problemu. Mona okreli gwny
jzyk ustawiony w przegldarce uytkownika. Zazwyczaj, cho oczywicie nie zawsze, ustawienie
to okrela jzyk oraz informacje kulturowe, ktre najbardziej odpowiadaj uytkownikowi
przegldarki; na tej podstawie bdzie mona okreli dziaanie aplikacji. Odstp do tych
informacji zapewnia obiekt Request.UserLanguages, ktry gromadzi informacje o jzykach
przekazane przez przegldark i przechowuje je w formie listy posortowanej zgodnie z
priorytetami okrelonymi przez uytkownika. Przykad kodu umoliwiajcego okrelenie
gwnego jzyka przedstawiony zostaa na listingu 19.9.

Listing 19.9. Wykorzystanie obiektu Request do okrelenia jzykowych preferencji


uytkownika.
1 <%@Page Language="VB" %>
2 <%@Import Namespace="System.Globalization" %>
3
4 <script runat="server">
5 sub Page_Load(obj as object,e as eventargs)
6 lblMessage.Text =Request.UserLanguages(0).ToString
7 end sub
8 </script>
9
10 <html><body>
11 Twoim gwnym jzykiem jest:
12 <asp:Label id="lblMessage" runat="server"/>
13 </body></html>

Analiza
W wierszu 2. importowana jest zupenie nowa przestrze nazw System.Globalization.
Zawiera ona wiele klas, ktre bd konieczne przy modyfikacji wynikw dziaania aplikacji w
zalenoci od ustawie jzykowych i kulturowych. Warto zwrci uwag, i w powyszym
przykadzie nie jest uywany aden obiekt ktrejkolwiek z klas dostpnych w tej przestrzeni nazw.
Ju nie dugo bdziemy jednak z nich korzysta! W wierszu 6. jest pobierany i wywietlany
gwny jzyk uytkownika. Waciwo UserLanguages zwraca tablic jzykw wybranych
przez uytkownika (okrelonych w przegldarce), posortowan wedug priorytetw tych jzykw
(najczciej uywane jzyki oraz ich kody zostay przedstawione w tabeli 19.1). Jzyk gwny
(lub jzyk o najwyszym priorytecie) mona okreli przy uyciu wyraenia
UserLanguages(0). Wyniki wykonania strony z listingu 19.9 zostay przedstawione na rysunku
19.8.

Tabela 19.1. Najczciej wykorzystywane jzyki i ich kody.


Jzyk Kod
Angielski (Anglia) en-uk
Angielski (Australia) en-au
Angielski (Kanada) en-ca
Angielski (Stany Zjednoczone) en-us
Arabski (Egipt) ar-eg
Chiski (Hong-Kong) zh-hk
Flamandzki (Belgia) nl-be
Francuski (Francja) fr
Hiszpaki (tradycyjny) es
Hiszpaski (Meksyk) es-mx
Japoski ja
Koreaski ko
Niemiecki (Niemcy) de
Polski pl
Portugalski (Portugalia) pt
Rosyjski (Rosja) ru
Woski (Wochy) it
Rysunek 19.8. Obiekt Request moe posuy od okrelenia gwnego jzyka wybranego w
przegldarce

Teraz, po okreleniu gwnego jzyka mona na jego podstawie okreli informacje kulturowe,
ktre bd wykorzystywane w aplikacji ASP.NET. W tym celu posuymy si obiektem klasy
System.Globalization.CultureInfo. Obiekty tej klasy zawieraj kompletne informacje
reprezentujce kultur okrelan przez uywany jzyk. Do informacji tych, oprcz jzyka, naley
take uywany kalendarz, nazwy krajw, format zapisu liczb i dat, oraz wiele innych elementw.
Przykad wykorzystania obiektu tej klasy zosta przedstawiony na listingu 19.10.

Listing 19.10. Wykorzystanie obiektu klasy CultureInfo.


1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Globalization" %>
3
4 <script runat="server">
5 sub Page_Load(obj as object, e as eventargs)
6 dim strLanguage as string = Request.UserLanguages(0).ToString
7
8 lblMessage.Text = "Jzyk gwny: " & _
9 strLanguage & "<br>"
10
11 dim objCulture as new CultureInfo(strLanguage)
12 lblMessage.Text += "Pena nazwa: " & _
13 objCulture.EnglishName & "<br>"
14 lblMessage.Text += "Nazwa rodzima: " & _
15 objCulture.NativeName & "<br>"
16 lblMessage.Text += "Skrt: " & _
17 objCulture.ThreeLetterISOLanguageName & "<br>"
18 lblMessage.Text += "Godzina: " & _
19 DateTime.Now.ToString("D", objCulture) & "<br>"
20
21 end sub
22 </script>
23
24 <html><body>
25 <b>Informacje kulturowe o uytkowniku:</b> <p>
26 <asp:Label id="lblMessage" runat="server"/>
27 </body></html>

Analiza
Powyszy kod jest modyfikacj przykadu z listingu 19.9. W wierszu 2. importowana jest
przestrze nazw System.Globalization. W wierszach 6. i 7. pobierany jest gwny jzyk
przegldarki uytkownika (w identyczny sposb jak na listingu 19.9). Jzyk ten jest nastpnie
wywietlany w etykiecie zdefiniowanej w wierszu 26. W wierszu 12., tworzony jest nowy obiekt
klasy CultureInfo bazujcy na pobranym wczeniej jzyku gwnym1. W wierszach od 13. do
20. wywietlane s rne informacje kulturowe. W celu poprawnego sformatowania daty zostaa
wykorzystana metoda ToString akceptujca dwa argumenty acuch znakw okrelajcy
sposb wywietlenia daty oraz obiekt CultureInfo zawierajcy dodatkowe informacje
okrelajce posta daty. Na rysunku 19.9 zostay przedstawione wyniki wykonania powyszej
strony ASP.NET w przypadku gdy gwnym jzykiem wybranym w przegldarce jest francuski.

Rysunek 19.9. Wyniki wygenerowane przez stron zostay dostosowane do ustawie


kulturowych uytkownika i to bez wprowadzania jakichkolwiek modyfikacji w kodzie

Klasa CultureInfo udostpnia wicej waciwoci, ktre pozwalaj na uzyskanie bardziej


szczegowych informacji na temat ustawie kulturowych. Najczciej stosowane waciwoci tej
klasy zostay przedstawione w tabeli 19.2.

Tabela 19.2. Waciwoci klasy CultureInfo.


Waciwo Opis
Calendar Kalendarz uywany w danej kulturze (na przykad:
gregoriaski, koreaski, itp.).
CurrentCulture Waciwo okrela informacje kulturowe ustawione na
serwerze (a nie w przegldarce uytkownika).
Waciwo ta zwraca obiekt klasy CultureInfo.
Waciwo jest przeznaczona wycznie do odczytu.

1
Jest cakiem prawdopodobne, e przy domylnych ustawieniach przegldarki, na przykad polskiej wersji
Internet Explorera, powyszy przykad nie bdzie dziaa poprawnie. W przegldarce moe zosta
wywietlone komunikat o bdzie rozpoczynajcy si od sw: Culture "pl" is a neutral culture.... Naley
go rozumie w ten sposb, i informacje kulturowe okrelone przez przegldark nie s wystarczajce by na
ich podstawie mona byo okreli sposb formatowania informacji. Rozwizanie tego problemu sprowadza
si do okrelenia (w przegldarce) bardziej szczegowych informacji na temat wybranego jzyka gwnego,
na przykad zamiast jzyka Polski [pl], naley poda jzyk pl-pl. Po wybraniu jzyka gwnego o takiej
postaci powyszy przykad bdzie dziaa poprawnie.
CurrentUICulture Waciwo pobiera informacje kulturowe uywane na
serwerze. Jest ona uywana do okrelania ustawie
kulturowych plikw zasobw. (Patrz podrozdzia
Zapisywanie zasobw w plikach, w dalszej czci tego
rozdziau.) Waciwo taj jest przeznaczona wycznie
do odczytu.
DateTimeFormat Zwraca obiekt klasy DateTimeFormatInfo okrelajcy
sposb formatowania daty i czasu zgodnie z biecymi
ustawieniami kulturowymi. Wicej informacji na ten
temat mona znale w dokumentacji .NET SDK.
DisplayName Pena nazwa kultury reprezentowanej przez dany obiekt
CultureInfo, w jzyku okrelonym przez interfejs
uytkownika.
EnglishName Pena nazwa obiektu klasy CultureInfo w jzyku
angielskim.
Name To samo co waciwo DisplayName, z tym i ta jest
przeznaczona wycznie do odczytu.
NativeName Pena nazwa obiektu klasy CultureInfo w danym
jzyku.
NumberFormat Waciwo okrela format wywietlania liczb (czyli
gdzie umieszcza przecinki, punkty dziesitne, itp.)
Zwraca obiekt klasy NumberFormatInfo.
ThreeLetterISOLanguageName Trzyliterowy kod oznaczajcy dan kultur w standardzie
ISO 3166.
ThreeLetterWindowLanguageName Wersja trzyliterowego oznaczenia kultury stosowana w
systemie Windows.
TwoLetterISOLanguageName Dwuliterowy kod oznaczajcy dan kultur w standardzie
ISO 3166.

Informacje kulturowe dla danej strony ASP.NET mona take okreli przy uyciu atrybutu
Culture dyrektywy @ Page. Ponisza dyrektywa sprawi, e na stronie zostan wykorzystane
ustawienia kulturowe dla jzyka niemieckiego:
<%@ Page Language="VB" Culture="de" %>

W tym przypadku, jeli na stronie bd wykorzystywane obiekty zwizane z ustawieniami


kulturowymi, to wykorzystaj one ustawienia kulturowe podane w dyrektywie @ Page a nie
okrelone przez serwer. Na przykad, w przypadku wykorzystania ustawie kulturowych dla
jzyka niemieckiego, wywoanie DateTime.Now.ToString("D") spowoduje wywietlenie
nastpujcej daty:
Montag, 3. Dezember 2001

W przypadku uycia ustawie kulturowych dla jzyka oznaczonego symbolem en-us, ten sam
fragment kodu wygeneruje wyniki:
Monday, December 03, 2001

To bardzo prosty sposb okrelania ustawie kulturowych jakie maj by wykorzystane na stronie,
o ile s one z gry znane.

Notatka
Waciwo CultureInfo.CurrentCulture jest w rzeczywistoci skrtem do waciwoci
System.Threading.CurrentThread.CurrentCulture. Obie te waciwoci zwracaj
obiekt klasy CultureInfo, ktry moe zosta wykorzystany w sposb przedstawiony na
powyszych przykadach. Rnica pomidzy nimi polega na tym, i waciwo
CultureInfo.CurrentCulture jest przeznaczona wycznie do odczytu, natomiast
waciwo System.Threading.CurrentThread.CurrentCulture pozwala take na
zapis informacji. Z tego powodu, jeli bdziesz musia zmieni biece ustawienia kulturowe
powiniene posuy si t drug waciwoci.

Kultura jest waciwoci aktualnie wykonywanego wtku (innymi sowy aktualnie


wykonywanego fragmentu biecej aplikacji). W przypadku okrelania ustawie kulturowych w
ASP.NET s one okrelane dla caej aplikacji. Oznacza to, e te same informacje kulturowe
mona pobra za porednictwem biecego wtku jak i z obiektu CultureInfo. (W dalszej
czci rozdziau zostanie przedstawiony przykad wykorzystania obiektu
System.Threading.CurrentThread.

Oprcz obiektu CultureInfo mona take wykorzysta obiekt klasy RegionInfo zawierajcy,
midzy innymi, informacje o symbolu waluty oraz o tym, czy w danym regionie jest
wykorzystywany system metryczny. Sposb uycia obiektw obu tych klas jest bardzo podobny, z
tym, e w przypadku obiektw klasy RegionInfo nie mona podawa jzyka w celu okrelenia
postaci pobieranych informacji zamiast nich wykorzystywane s skrty nazw krajw. Na
przykad: US dla Stanw Zjednoczonych bd FR dla Francji. Przykad wykorzystania obiektw tej
klasy zosta przedstawiony na listingu 19.11.

Listing 19.11. Wywietlanie informacji o regionie z jakiego pochodzi uytkownik.


1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Globalization" %>
3
4 <script runat="server">
5 sub Page_Load(obj as object, e as eventargs)
6 dim objRegion as RegionInfo
7
8 if Page.IsPostBack then
9 objRegion = new RegionInfo(btRegion.Text)
10 else
11 objRegion = RegionInfo.CurrentRegion
12 end if
13
14 lblMessage.Text = "Region: " & objRegion.Name & "<br>"
15
16 lblMessage.Text += "Pena nazwa: " & _
17 objRegion.EnglishName & "<br>"
18 lblMessage.Text += "Waluta: " & _
19 objRegion.CurrencySymbol & "<br>"
20 lblMessage.Text += "Waluta ISO: " & _
21 objRegion.ISOCurrencySymbol & "<br>"
22 lblMessage.Text += "Skrt: " & _
23 objRegion.ThreeLetterISORegionName & "<br>"
24 lblMessage.Text += "Czy jest uywany system metryczny: " _
25 & objRegion.IsMetric
26 end sub
27 </script>
28
29 <html><body>
30 <form runat="server">
31 <b>Twoje ustawienia:</b> <p>
32 <asp:Label id="lblMessage" runat="server"/><p>
33 Zmie na (i.e. 'US', 'FR', 'JP', etc):
34 <asp:TextBox id="btRegion" runat="server"
35 AutoPostBack=true />
36 </form>
37 </body></html>

Analiza
W momencie pierwszego wywietlenia powyszej strony, do obiektu RegionInfo zostan
wczytane domylne informacje o regionie (patrz wiersz 11.). Informacje o aktualnie wybranym
regionie s wywietlane w wierszach od 14. do 25., midzy innymi nale do nich symbol i skrt
waluty. Gdy uytkownik wpisze jakie informacje w polu tekstowym zdefiniowanym w wierszach
34. i 35. strona zostanie automatycznie wywietlona ponownie (dziki uyciu atrybutu
AutoPostBack o wartoci true). Kod regionu podany przez uytkownika w polu tekstowym jest
nastpnie wykorzystywany w celu stworzenia nowego obiektu RegionInfo (patrz wiersz 9.).
Wygld strony po wybraniu regionu o kodzie JP (czyli Japonii) zosta przedstawiony na rysunku
19.10.

Rysunek 19.10. Na stronie zostaj wywietlone informacje o wybranym regionie

Najczciej wykorzystywane waciwoci klasy RegionInfo zostay przedstawione w tabeli 19.3.

Tabela 19.3. Waciwoci klasy RegionInfo.


Waciwo Opis
CurrencySymbol Symbol uywany do oznaczania wartoci monetarnych w
danym regionie.
CurrentRegion Waciwo pobiera domylny serwer uywany na serwerze
(a nie na komputerze uytkownika). Waciwo zwraca
obiekt klasy RegionInfo.
DisplayName Pena nazwa regionu identyfikowanego przez obiekt
RegionInfo w jzyku okrelonym przez interfejs
uytkownika.
EnglishName Nazwa regionu identyfikowanego przez obiekt RegionInfo
w jzyku angielskim.
IsMetric Warto logiczna okrelajca czy w danym regionie
wykorzystywany jest system metryczny.
ISOCurrencySymbol Kod ISO znaku zapisanego we waciwoci
CurrencySymbol. Na przykad, znakowi $ odpowiada kod
ISO USD.
Name Zawiera te same informacje co waciwo
CurrencySymbol, lecz jest przeznaczona wycznie do
odczytu.
ThreeLetterISORegionName Trzyliterowy kod oznaczajcy dan kultur w standardzie
ISO 3166.
ThreeLetterWindowRegionName Wersja trzyliterowego oznaczenia kultury stosowana w
systemie Windows.
TwoLetterISORegionName Dwuliterowy kod oznaczajcy dan kultur w standardzie
ISO 3166.

Nowe wyraenie
Istnieje take moliwo okrelenia sposobu kodowania wynikw generowanych przez strony
ASP.NET. Kodowanie, to sposb w jaki znaki s reprezentowane przez komputer; przykadowe
sposoby kodowania to Unicode lub ASCII. Strony ASP.NET domylnie uywaj kodowania
Unicode, jednak ustawienie to moe si zmienia w zalenoci od regionu.
Dostpne s dwa, rne sposoby okrelania sposobu kodowania wykorzystywanego w aplikacji
bezporednio na stronach ASP.NET bd te w pliku web.config. Na stronach ASP.NET sposb
kodowania okrela si przy uyciu atrybutu ResponseEncoding dyrektywy @ Page; jak na
poniszym przykadzie:
<%@ Page Language="VB" ResponseEncoding="UTF-8" %>

W przypadku okrelania sposobu kodowania w pliku web.config naley to zrobi w nastpujcy


sposb:
<configuration>
<system.web>
<globalization fileEncoding="utf-8" />
</system.web>
</configuration>

Jak na razie przedstawione zostay wycznie sposoby zmieniania informacji generowanych przez
obiekty zwizane z ustawieniami kulturowymi i regionalnymi, a co ze zwykym tekstem? Jak
mona skonwertowa zwyczajny tekst, tak aby korzysta z wybranych ustawie jzykowych?
Niestety nie mona tego zrobi w aden prosty sposb trzeba po prostu, samodzielnie
przetumaczy tekst. Jeli witryna jest odwiedzana przez osoby posugujce si rnymi jzykami,
to zazwyczaj bdzie to oznacza konieczno stworzenia odrbnych wersji jzykowych kadej ze
stron. Na szczcie w ASP.NET nie trzeba si ucieka do a tak drastycznych rozwiza mona
bowiem wykorzysta pliki zasobw.

Zapisywanie zasobw w plikach


Pliki zasobw s uywane do przechowywania informacji wykorzystywanych w aplikacjach
niezalenie od ich kodu. Istnieje moliwo zastosowania wielu wersji pliku zasobw, dziki
czemu strony ASP.NET mog prezentowa rne informacje bez koniecznoci wprowadzania
jakichkolwiek zmian w kodzie. Posugujc si przykadem lokalizacji, mona by stworzy wiele
rnych plikw zasobw, po jednym dla kadego z ustawie kulturowych wykorzystywanych
przez uytkownikw odwiedzajcych witryn. Kady z tych plikw zawieraby dokadnie te same
informacje zapisane w rnych jzykach.
Przeanalizujmy przykad prostej strony ASP.NET, ktrej tre mona umieci w pliku zasobw.
Kod tej strony zosta przedstawiony na listingu 19.12.

Listing 19.12. Strona ASP.NET, ktra posuy jako przykad wykorzystania plikw zasobw.
1 <%@ Page Language="VB" %>
2
3 <script runat="server">
4 sub Page_Load(obj as Object, e as EventArgs)
5 lblMessage.Text = DateTime.Now.ToString("t")
6 end sub
7 </script>
8
9 <html><body>
10 <b>Witamy!</b> Teraz jest:
11 <asp:Label id="lblMessage" runat="server"/><p>
12
13 Ta strona demonstruje sposb wykorzystywania plikw zasobw
14 w ASP.NET.<p>
15
16 <font size=1>Nie zapomnij sprawdzi tego w domu!</font>
17 </body></html>

Powyszy przykad jest bardzo prosty wywietla kilka komunikatw tekstowych o staej treci
oraz biec godzin. Wyniki wykonania tej strony zostay przedstawione na rysunku 19.11.

Rysunek 19.11. Prosta strona ASP.NET w ktrej mona wykorzysta pliki zasobw

Zamy, e chcielibymy przetumaczy t stron na jzyk francuski. Oczywicie mona by


stworzy now wersj strony o tej samej postaci lecz z innymi komunikatami tekstowymi, ale po
co utrudnia sobie ycie? Znacznie lepszym rozwizaniem bdzie stworzenie dwch plikw
zasobw. S to zwyczajne pliki tekstowe, ktre mona utworzy przy uyciu dowolnego edytora
tekstw. W pierwszej kolejnoci stwrzmy polsk wersj takiego pliku. W tym celu, w edytorze
tekstowym naley wpisa poniszy tekst:
[strings]
Powitanie=Witamy!
Czas=Teraz jest:
Tresc=Ta strona demonstruje sposb wykorzystywania plikw zasobw w ASP.NET
Stopka=<font size=1>Nie zapomnij sprawdzi tego w domu!</font>

Zapisz ten fragment tekstu w pliku o nazwie data.pl.txt (za chwil wyjani dlaczego nazwa pliku
ma akurat tak posta). Utworzony plik zawiera jedn sekcj, w ktrej zostay zapisane wszystkie
wykorzystywane acuchy znakw. Informacje zostay zapisane w formie par nazwa-warto:
Powitamie=Witamy!

Powitanie jest nazw zasobu do ktrego bdziemy si odwoywa w kodzie strony ASP.NET,
natomiast Witamy! jest wartoci jaka zostanie wywietlona na stronie wynikowej. Poniej
przedstawiona zostaa francuskojzyczna wersja pliku zasobw:
[strings]
Powitanie=Bonjour!
Czas=L'heure maintenent est:
Tresc=Cette page demonstrate utiliser files de resource avec ASP.NET
Stopka=<font size=1>N'oublie pas essayez de faire ceci chez soi!</font>

Powyszy tekst zapisz w pliku o nazwie data.fr.txt. (Tworzc oba pliki tekstowe naley pamita,
aby kady z acuchw znakw zosta zapisany w osobnym wierszu. Jeli w acuchu znakw
znajd si znaki nowego wiersza, to podczas generacji waciwych plikw zasobw pojawi si
bdy.) Warto zwrci uwag, i w obu plikach zostay uyte te same nazwy kluczy. Nazwy te
musz by identyczne, gdy w przeciwnym przypadku ASP.NET nie bdzie w stanie odszuka
zasobw.
ASP.NET nie jest jednak w stanie korzysta z plikw zasobw w ich obecnej postaci. Trzeba je
zatem skonwertowa do postaci, ktr ASP.NET bdzie rozumie. Do tego celu suy program
narzdziowy resgen.exe (nazywany take generatorem zasobw). Program ten konwertuje
tekstowe pliki zasobw i na ich podstawie generuje pliki z rozszerzeniem .resources. A zatem,
wywietl okno wiersza polece i przejd do folderu, w ktrym zapisae stworzone wczeniej pliki
.txt. Nastpnie wydaj ponisze polecenie (i nie zapomnij nacisn klawisza Enter):
resgen data.pl.txt

resgen data.fr.txt

Program powinien wywietli nastpujce wyniki:


Read in 4 resources from 'data.pl.txt'
Writing resource file... Done.

Po wykonaniu powyszych polece w folderze pojawi si dwa nowe pliki data.pl.resources


oraz data.fr.resources. Z tych plikw moe ju korzysta zarzdca zasobw ASP.NET. A zatem,
uyjmy tych zasobw na stronie ASP.NET!
Za obsug wszystkich zasobw w ASP.NET odpowiada obiekt klasy
System.Resources.ResourceManager. Obiekt taki jest w stanie odnale plik zasobw
odpowiadajcy ustawieniom kulturowym wykorzystywanym przez uytkownika i pobra zapisane
w nim zasoby. Sposb uycia tego obiektu zosta przedstawiony na listingu 19.13.

Listing 19.13. Pobieranie informacji z plikw zasobw przy wykorzystaniu obiektu


ResourceManager.
1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Globalization" %>
3 <%@ Import namespace="System.Resources" %>
4 <%@ Import namespace="System.Threading" %>
5
6 <script runat="server">
7 sub Page_Load(obj as object, e as eventargs)
8 dim objRM as ResourceManager
9 dim strLanguage as string = _
10 Request.UserLanguages(0).ToString
11 dim objCulture as new CultureInfo(strLanguage)
12 Thread.CurrentThread.CurrentCulture = _
13 new CultureInfo(strLanguage)
14 Thread.CurrentThread.CurrentUICulture = _
15 new CultureInfo(strLanguage)
16
17 objRM = ResourceManager. _
18 CreateFileBasedResourceManager("data", _
19 Server.MapPath("."), Nothing)
20
21 lblGreeting.Text = objRM.GetString("Powitanie")
22 lblTime.Text = objRM.GetString("Czas") & " " & _
23 DateTime.Now.ToString("t")
24 lblBlurb.Text = objRM.GetString("Tresc")
25 lblDisclaimer.Text = objRM.GetString("Stopka")
26
27 objRM.ReleaseAllResources
28 end sub
29 </script>
30
31 <html><body>
32 <b><asp:Label id="lblGreeting" runat="server"/></b>
33 <asp:Label id="lblTime" runat="server"/><p>
34
35 <asp:Label id="lblBlurb" runat="server"/><p>
36
37 <asp:Label id="lblDisclaimer" runat="server"/>
38 </body></html>

Analiza
W pierwszej kolejnoci naley zwrci uwag na wykorzystanie dwch dodatkowych przestrzeni
nazw, importowanych w wierszach 3. i 4. Przestrze nazw System.Resources jest konieczna
aby mona byo korzysta z obiektu ResourceManager. Take przestrze nazw
System.Threading jest niezbdna (w dalszej czci rozdziau wyjani dlaczego). W wierszu 8.,
w standardowy sposb, deklarowany jest nowy obiekt ResourceManager. W wierszach 9. i 10.
okrelany jest gwny jzyk wybrany w przegldarce (gwny jzyk jest okrelany w taki sam
sposb jak w przykadzie przedstawionym na listingu 19.9.).

W wierszach do 12. do 15., na podstawie wybranego jzyka gwnego, okrelane s ustawienia


kulturowe. Pamitasz zapewne, e informacje kulturowe mona podawa przy wykorzystaniu
waciwoci System.Threading.CurrentThread.CurrentCulture, ktra pozwala na
pobranie lub zapis obiektu klasy CultureInfo (bya o tym mowa we wczeniejszej czci
rozdziau, w podrozdziale pt.: Lokalizowanie aplikacji). W wierszu 12. tworzony jest nowy
obiekt klasy CultureInfo zawierajcy informacje kulturowe wybrane na podstawie okrelonego
wczeniej gwnego jzyka uywanego w przegldarce. Wszystkie obiekty, ktre dysponuj
moliwoci lokalizacji, bd teraz wykorzystyway wybrane informacje kulturowe (na przykad,
po wybraniu informacji kulturowych dla jzyka angielskiego, godzina bdzie wywietlana w
formie 10:16 PM, a nie 22:16).
Niemniej jednak sam fakt zmiany ustawie kulturowych nie sprawi, e ASP.NET pobierze dane z
odpowiednich plikw zasobw. W tym celu, oprcz wybrania odpowiednich informacji
kulturowych, naley take przypisa odpowiedni warto waciwoci
System.Threading.CurrentThread.CurrentUICulture (patrz wiersze 14. i 15.). To
wanie na podstawie tej waciwoci ASP.NET okrela jaki plik zasobw naley uy.
Odczytanie zasobw z pliku realizowane jest przez metod
CreateFileBasedResourceManager, ktrej wywoanie zostao zapisane w wierszach od 17. do
19. Metoda ta wymaga podania trzech argumentw pocztkowej czci (prefiksu) nazwy
plikw zasobw, cieki dostpu do tych plikw oraz obiektu ktrego naley uy do
przetworzenia informacji pobranych z pliku zasobw (przy czym ten trzeci argument jest
opcjonalny). Warto drugiego argumentu okrelana jest przy uyciu metody Server.MapPath,
ktra zwraca fizyczn ciek dostpu do folderu w jakim s przechowywane pliki zasobw.
(Wicej informacji na temat metody MapPath mona znale w rozdziale 4., pt.: Stosowanie
obiektw ASP.NET w jzykach C# i VB.NET, w podrozdziale Obiekt HttpServerUtility.) W
naszym przypadku nie jest potrzebny aden obiekt sucy do przetwarzania danych pobieranych z
pliku zasobw, a zatem jako trzeci argument wywoania metody
CreateFileBasedResourceManager naley przekaza warto Nothing.

Przypomnij sobie, e nazwy plikw zasobw maj nastpujc posta data.kultura.resources.


Metoda CreateFileBasedResourceManager poszukuje plikw o nazwach pasujcych do
schematu prefiks.kultura.resources. A zatem, prefiks podany w wywoaniu tej metody musi
odpowiada pocztkowej czci nazw plikw zasobw. W naszym przypadku, w razie wybrania
ustawie kulturowych dla jzyka pl (polskiego) metoda bdzie poszukiwa pliku o nazwie
data.pl.resources, natomiast w razie wybrania ustawie kulturowych dla jzyka fr (francuskiego)
bdzie ona poszukiwa pliku data.fr.resources. Prefiks suy do logicznego grupowania plikw
zasobw.
Nastpnie, w wierszach do 21. do 25. wywoywana jest metoda GetString obiektu
ResourceManager, ktra pobiera pary klucz-warto zapisane w pliku zasobw. Pobrane
acuchy znakw s wywietlane na stronie wynikowej przy uyciu czterech etykiet (elementw
sterujcych Label), zdefiniowanych w wierszach do 32. do 35. Otwierajc plik zasobw
zarzdzajcy nimi mechanizm blokuje dostp do nich, dziki czemu adne inne aplikacje nie bd
w stanie ich zmieni. Na rysunkach 19.12 oraz 19.13 zostay przedstawione wyniki wykonania
strony z listingu 19.13, w przypadku wyboru ustawie kulturowych dla jzykw pl-PL oraz fr-
FR.

Rysunek 19.12. W przypadku wybrania ustawie kulturowych dla jzyka pl-PL ASP.NET
pobiera dane z pliku zasobw data.pl.resources

Rysunek 19.13. W przypadku wybrania ustawie kulturowych dla jzyka fr-FR ASP.NET
pobiera dane z pliku zasobw data.fr.resources

Notatka
Warto pamita, e informacje kulturowe mona take okreli przy uyciu atrybut Culture
dyrektywy @ Page:

<%@ Page Language="VB" Culture="fr-FR" %>


Jeli jednak zastosujesz takie rozwizanie w ostatnim przykadzie, to zasoby nie zostan
pobrane z odpowiedniego pliku. Problem polega na tym, i informacje kulturowe s okrelana
na podstawie gwnego jzyka uywanego w przegldarce (okrelanego w wierszu 9.), a nie na
podstawie atrybutu dyrektywy @ Page. Aby rozwiza ten problem, wiersze do 9. do 11. listingu
19.13 naley zastpi nastpujcym fragmentem kodu:

dim strLanguage as string = CultureInfo.CurrentCulture.ToString

Podpowied
Zazwyczaj w caej aplikacji powinny by wykorzystywane te same informacje kulturowe, dlatego
moesz zastanowi si nad wykorzystaniem rozwizania polegajcego na podaniu tych
informacji w metodzie Application_BeginRequest definiowanej w pliku global.asax. W ten
sposb informacje kulturowe bd poprawnie ustawiane przed rozpoczciem obsugi kadego
dania odbieranego na serwerze.

Innym rozwizaniem mogoby by stworzenie obiektu ResourceManager i zapisanie go jako


zmiennej aplikacyjnej w metodzie Application_OnStart. W ten sposb mona unikn
koniecznoci tworzenia obiektw ResourceManager podczas obsugi kadego
otrzymywanego dania. Na przykad, do metody Application_OnStart mona by doda
poniszy fragment kodu:

Application("RM") = New ResourceManager("data", _


Server.MapPath("."), Nothing)

Powyszy fragment kodu tworzy obiekt ResourceManager dostpny dla caej aplikacji. Dostp
do niego mona uzyska za pomoc wyraenia Application("RM").

To nie jest ASP!


Denie od oddzielenia kodu od treci stron WWW i czerpania wynikajcych z tego korzyci nie
jest niczym nowym w technologii ASP.NET. W rzeczywistoci programici ASP dyli do tego
celu ju od duszego czasu, zwaszcza w klasycznej technologii ASP bazujcej na wykorzystaniu
blokw kodu wykonywalnego a nie blokw deklarowania kodu. Brak moliwoci separacji kodu
od treci sprawia, i kod ASP musia si przeplata ze zwyczajnym kodem HTML. To z kolei
niezwykle utrudniao testowanie i modyfikacj stron ASP, gdy programici musieli szuka
bdw na caej stronie. Dziki wykorzystaniu blokw deklarowania kodu problem ten niemal
cakowicie znikn, gdy cay kod jest umieszczany w jednym miejscu na samym pocztku
strony ASP.NET.
Programici korzystajcy z tradycyjnej technologii ASP musieli oddziela kod od treci stron przy
uyciu mechanizmw doczania zawartoci plikw zewntrznych (SSI). W takich doczanych
plikach mona byo umieszcza cakowicie dowolny kod, w tym take kod HTML, dlatego te
czsto w nich umieszczano fragmenty interfejsu uytkownika wraz z ich obsug. Mechanizmy
doczania plikw s wci dostpne lecz w stronach ASP.NET znacznie czciej korzysta si
aktualnie z elementw sterujcych uytkownika lub kodu obsugi formularzy. Oba te rozwizania
zarwno elementy sterujce uytkownika, jak i kod obsugi formularzy daj znacznie
wiksze moliwoci programistycznej kontroli nad tworzonym kodem ni technologia SSI, w
ktrej moliwoci takie praktycznie nie istniay.
Zupenie nowym elementem ASP.NET s pliki zasobw. Programici ktrzy mieli kontakt z
jzykami takimi jak Visual Basic (VB) lub C++ mogli si ju z nimi spotka. Pliki zasobw byy
w tych jzykach bardzo czsto wykorzystywane, zreszt z tych samych powodw, dla ktrych
aktualnie s one dostpne take w ASP.NET gwnie chodzi tu o moliwo oddzielania kodu
od treci.
W klasycznej technologii ASP nie byo adnych moliwoci oddzielenia od stron ASP informacji
wykorzystywanych przy lokalizowaniu aplikacji. Z tego wzgldu, bardzo czsto trzeba byo
tworzy wiele wersji tej samej strony. Co wicej, wczeniejsze wersje technologii ASP nie
pozwalay na modyfikowanie informacji kulturowych i regionalnych.
Wszystkie te modyfikacje sprawiaj, e technologia ASP.NET jest znacznie bardziej
wszechstronna ni jej poprzednie wersje. Aktualnie programici maj znacznie wicej moliwoci
zwizanych z rozmieszczaniem kodu na stronach.
Rozdzia 20.
Testowanie stron ASP.NET
W tym rozdziale zostanie poruszone niezwykle wane zagadnienie testowanie stron ASP.NET.
Wszyscy popeniamy bdy, niezalenie od tego jak doskonaymi programistami bymy nie byli.
Dlatego te konieczno testowania aplikacji jest oczywistym faktem. Im tworzony kod jest
duszy, tym wicej w nim bdzie bdw.
Jest cakiem prawdopodobne, e spotkae si ju z wieloma bdami w programach
komputerowych. Przypomnij sobie te wszystkie komunikaty generowane przez tradycyjne
aplikacje bd witryny WWW, opisujce bdy ktrych zupenie nie rozumiae. W wikszoci
przypadkw bdy te oznaczay przerwanie pracy programu, lecz czasami zdarzao si take, i
powodoway one generowanie nieodpowiednich danych wynikowych. Niemniej jednak, w
kadym z tych przypadkw nie bye w stanie zrobi tego co zaplanowae. W idealnym
przypadku powinnimy napisa kod i zapomnie o nim, jednak bardzo czsto jest to zupenie
nierealne.
ASP.NET udostpnia dwa wspaniae narzdzia suce do testowania aplikacji program
uruchomieniowy CLR (ang.: Microsoft Common Language Runtime Debugger) oraz usug
ledzenia (ang.: Trace Service). Oba te narzdzia zostan szczegowo omwione w treci
niniejszego rozdziau, podobnie jak instrukcje try i catch.
W tym rozdziale zostan omwione nastpujce zagadnienia:
Sposoby zastosowania instrukcji try oraz catch do testowania aplikacji.
Testowanie aplikacji przy wykorzystaniu metody Response.Write.
Sposoby tworzenia i zgaszania wasnych bdw.
Czym jest narzdzie ledzenia oraz jak mona z niego korzysta.
W jaki sposb mona wykorzysta program uruchomieniowy CLR do testowania
aplikacji podczas jej dziaania.

Informacje wstpne dotyczce testowania


aplikacji
Prawdopodobnie zdarzyo Ci si ju popeni kilka bdw podczas tworzenia stron ASP.NET.
Mogy to by proste bdy polegajce na pominiciu atrybutu runat="server", lub cakiem
zoone, ktrych odnalezienie wymagao dugich dni mudnej pracy. Bdy s bardzo frustrujce,
a cige ogldanie stron zawierajcych komunikaty o nich (takich jak ta przedstawiona na rysunku
20.1) moe sprawi, e bdziesz chcia wyrywa sobie wosy z gowy.
Rysunek 20.1. Typowa strona z informacjami o bdach, generowana przez ASP.NET.
Wraz ze wzrostem stopnia zoonoci tworzonych aplikacji, coraz trudniej jest zapobiega
powstawaniu nowych bdw oraz odnajdywa i poprawia bdy, ktre ju zostay zrobione.
Przyjrzymy si typowemu przykadowi przedstawionemu na listingu 20.1.
Listing 20.1. Odnajdywanie bdw.
1 <%@ Page Language="VB %>
2 <%@ Import Namespace="System.Data" %>
3 <%@ Import Namespace="System.Data.OleDB" %>
4
5 <script runat="server">
6 sub Page_Load(obj as Object, e as EventArgs)
7 'tworzymy poczenie
8 dim objConn as new OleDbConnection _
9 ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
10 "Data Source=C:\ASPNET\data\banking.mdb")
11
12 'otwieramy poczenie
13 dim objCmd as new OleDbDataAdapter _
14 ("select * from tblUsers", objConn)
15
16 'pobieramy dane
17 dim ds as DataSet = new DataSet()
18 objComm.Fill(ds, "tblUsers")
19 end sub
20 </script>
21
22 <html><body>
23 <form runat="server">
24
25 </form>
26 </body></html>

Sprbuj wywietli t stron w przegldarce (nie zapomnij wczeniej wczy testowania w pliku
konfiguracyjnym web.config). W przegldarce pojawi si strona przypominajce t z rysunku
20.2.
Rysunek 20.2. Ojej, co zego stao si z kodem naszej strony
Jest oczywiste, e kod przedstawiony na listingu 20.1 nie jest w porzdku; a jeli jeszcze nie
zauwaye gdzie znajduje si bd, to informacje wywietlone na stronie z rysunku 20.2 pomog
Ci go odnale. Warto zwrci uwag, i na stronie z rysunku 20.2 zosta wyrniony wiersz kodu
rdowego, w ktrym wystpi bd, a dodatkowo zostay na niej wywietlone informacje o
numerze tego wiersza oraz nazwie pliku. Wyglda na to, e w wierszu 18 popenilimy prosty bd
typograficzny. Zamiast nazwy objCmd zostaa uyta nazwa objComm. Dziki szczegowym
informacjom wywietlanym na stronie, bd tego typu mona bardzo atwo poprawi. Po
wprowadzeniu stosownych zmian, nasz kod bdzie dziaa bez zarzutu.
Przyjrzyjmy si dokadniej stronie z rysunku 20.2. atwo zauway, i zawiera ona cakiem sporo
dodatkowych informacji o przyczynie bdu. Na przykad, u dou tej strony znajduj si dwa
poczenia Show Detailed Compiler Output (poka szczegowe wyniki wygenerowane przez
kompilator) oraz Show Complete Compilation Source (poka kompletny kod rdowy uyty
podczas kompilacji strony). Kliknicie tych pocze spowoduje wywietlenie na stronie nowych
informacji, przedstawionych na rysunku 20.3.
Rysunek 20.3. Bardziej szczegowe informacje o bdzie

Notatka
Jeli nie zosta wczony tryb testowania, to dwa opisywane poczenia do dodatkowych
informacji na temat bdu, mog by niedostpne. Wicej informacji na ten temat znajdziesz w
rozdziale 18., pt.: Konfiguracja i wdraanie aplikacji ASP.NET.

Fragment strony wywietlany po klikniciu pierwszego z tych pocze Show Detailed


Compiler Output zawiera informacje o tym, co mechanizmy ASP.NET prboway wykona i
dlaczego im si to nie udao. Jego pierwszy wiersz zawiera polecenie, ktre zostao wydane w celu
skompilowania kodu rdowego strony ASP.NET. (Jak wida zosta do tego celu uyty
kompilator jzyka Visual Basic.NET.) Po sprawdzeniu parametrw wywoania kompilatora oraz
wykorzystanych w tym poleceniu obiektw biznesowych, wszystkie pozostae elementy polecenia
powinne by znajome.
Poniej polecenia, zostay wywietlone wyniki wygenerowane przez kompilator, ktre mog nam
pomc przy okrelaniu przyczyny bdu. Ten komunikat jest widoczny take na rysunku 20.2.
Fragment strony wywietlany po klikniciu drugiego poczenia Show Complete Compilation
Source prezentuje peny kod rdowy pliku, ktry mia by skompilowany, w tym take
wszelkie polecenia kompilatora oraz funkcje maszyny wirtualnej CLR.
Oglnie rzecz biorc, udostpnianie tych informacji uytkownikom kocowym nie jest zalecane.
Przed wszystkim, wikszo uytkownikw w ogle nie chce oglda jakichkolwiek komunikatw
o bdach. A co gorsze, sprytny uytkownik moe wykorzysta ten kod przeciwko nam. A zatem,
jest niezwykle wane, aby przetestowa strony przy uyciu wszelkich dostpnych rodkw i
narzdzi, i zrobi wszystko co moliwe, aby takie komunikaty o bdach si nie pojawiay.
Na szczcie ASP.NET udostpnia kilka mechanizmw, ktre pomagaj przy testowaniu aplikacji
i obsudze bdw. Pierwszy z nich zosta przedstawiony ju wczeniej s nim instrukcje try
oraz catch umieszczane w rnych miejscach programw (na przykad, w listingu 19.1,
przedstawionym w poprzednim rozdziale). Instrukcje te pozwalaj na przechwytywanie
potencjalnych bdw, ktre mog wystpi w aplikacji. W podobny sposb moe nam pomc
narzdzie ledzce, ktre oprcz tego udostpnia dodatkowe informacje. I w kocu ostatnim
narzdziem ktre mona wykorzysta podczas testowania aplikacji, jest program uruchomieniowy
CLR. Jest to potne narzdzie suce do odnajdywania i poprawiania bdw, ktre si ju
pojawiy.

Instrukcje try i catch


Zazwyczaj, gdy jaki fragment kodu spowoduje bd, to wykonywanie aplikacji zostaje przerwane,
a w przegldarce jest wywietlany stosowny komunikat o bdzie (przykadowa posta takiego
komunikatu zostaa przedstawiona na rysunku 20.1). Jeli istnieje jakakolwiek moliwo
uniknicia wywietlenia tego komunikatu, to naley j wykorzysta (w kocu, w idealnym
przypadku, bdy nigdy nie powinne by wywietlane).
Uycie instrukcji try informuje ASP.NET e pewien blok kodu naley wykona prbnie. W
takim przypadku, jeli jakikolwiek fragment kodu zapisany wewntrz tej instrukcji spowoduje
zgoszenie bdu, to nie doprowadzi on do przerwania wykonywania aplikacji i wywietlenia
stosownego komunikatu, lecz bdziemy mieli szans rozwizania zaistniaego problemu. Na
przykad, gdyby wiersz 18. listingu 20.1 zosta zapisany wewntrz instrukcji try, to istniaaby
potencjalna szansa uniknicia zatrzymania aplikacji przez zgaszany bd i jej dalszego
wykonywania.
Instrukcja try suy do ochrony fragmentw kodu, ktre mog spowodowa powstanie bdw.
W przypadku tworzenia tradycyjnych aplikacji stosowanie tych instrukcji jest koniecznoci, gdy
wykonanie niektrych operacji na pewno spowoduje zgoszenie bdu. By moe o tym nie wiesz,
ale kliknicie przycisku Anuluj w oknie dialogowym zazwyczaj powoduje zgoszenie bdu, ktry
aplikacja w jaki sposb musi obsuy. Instrukcja try oraz inne instrukcje uywane wraz z ni, s
wsplnie okrelane mianem strukturalnej obsugi wyjtkw.
Analizujc przykady podane w niniejszej ksice mona si ju byo przekona, e skadnia
instrukcji try jest cakiem prosta. Skada si ona z instrukcji try, po ktrym jest umieszczany
chroniony blok kodu, po ktrym s z kolei umieszczane instrukcje catch oraz finally. Oto
przykad zapisu tej instrukcji:
1 'tworzymy obiekt OleDbCommand
2 try
3 objCmd.Connection.Open
4 '....
5 catch
6 obsuga bdu
7 end try

W tym przypadku chroniony jest kod zapisany pomidzy wierszami 2. i 5., gdy to wanie on
moe spowodowa zgoszenie bdu. Jeli wewntrz bloku try nie zosta zgoszony aden bd, to
wykonywanie programu zostaje przeniesione do wiersza 7., a pozostay kod jest realizowany w
standardowy sposb. Jeli jednak bd zostanie zgoszony, to wykonywanie programu zostanie
przeniesione do instrukcji catch zapisanej w wierszu 5. Wewntrz tej instrukcji umieszczany jest
kod sucy do obsugi bdu.

Nowe wyraenie
Przyjrzyjmy si bliej technicznym szczegom caego procesu. Gdy w aplikacji VB.NET pojawia
si bd to mwimy e zosta zgoszony wyjtek. Oznacza to, e stao si co co nie powinno si
sta i VB.NET rzuca w powietrze bd, aby kto inny go zapa i obsuy. Jeli wyjtek nie
zostanie w aden sposb obsuony, to bd spowoduje przerwanie realizacji aplikacji a informacje
o bdzie zobaczy uytkownik kocowy.
Zgaszanie wyjtkw pozwala na przechwytywanie bdw zanim doprowadz one do przerwania
wykonywania aplikacji i wywietlenia stosownego komunikatu. Jeli bd w por zostanie
przechwycony, to istnieje moliwo zapobieenia awarii i rozwizania zaistniaego problemu.
Sprbujmy zatem uy instrukcji try. Gdy pojawi si bd instrukcja ta zaalarmuje towarzyszc
jej instrukcj catch, ktra przechwyci wyjtek i obsuy go. Listing 20.2 przedstawia przykad
zastosowania tych instrukcji.

Listing 20.2. Przykad testowania strony ASP.NET.


1 <%@ Page Language="VB" Debug="true" %>
2 <%@ Import Namespace="System.Data" %>
3 <%@ Import Namespace="System.Data.OleDb" %>
4
5 <script runat="server">
6 dim Conn as new OleDbConnection("Provider=" & _
7 "Microsoft.Jet.OLEDB.4.0;" & _
8 "Data Source=C:\ASPNET\data\banking.mdb")
9
10 sub GetData(obj as Object, e as EventArgs)
11 dim objCmd as OleDbCommand = new OleDbCommand _
12 ("select * from tblUsers where UserID = @ID", Conn)
13 dim objReader as OleDbDataReader
14
15 dim objParam as OleDbParameter
16 objParam = objCmd.Parameters.Add("@ID", OleDbType.Integer)
17 objParam.Direction = ParameterDirection.Input
18 objParam.Value = tbID.Text
19
20 objCmd.Connection.Open()
21 objReader = objCmd.ExecuteReader
22
23 dgData.DataSource = objReader
24 dgData.DataBind()
25
26 objReader.Close
27 objCmd.Connection.Close()
28 end sub
29 </script>
30
31 <html><body>
32 <form runat="server">
33 <asp:Label id="lblMessage" runat="server"
34 maintainstate=false /><br>
35 Podaj identyfikator: <asp:TextBox id="tbID" runat="server"
36 AutoPostBack=True
37 OnTextChanged=GetData /><p>
38 <asp:DataGrid id="dgData" runat="server"
39 BorderColor="black"
40 GridLines="Vertical"
41 width="100%"
42 Font-Name="Arial"
43 Font-Size="8pt"
44 HeaderStyle-BackColor="#cccc99"
45 ItemStyle-BackColor="#ffffff"
46 AlternatingItemStyle-Backcolor="#cccccc"
47 AutoGenerateColumns="true" />
48
49 </form>
50 </body></html>

Analiza
Powyszy listing przedstawia kod bardzo prostej strony ASP.NET wywietlajcej informacje o
uytkowniku na podstawie podanego identyfikatora. W momencie podania identyfikatora
uytkownika w polu tekstowym, wykonywane s polecenia SQL, ktre pobieraj dane z bazy i
wi je z elementem sterujcym DataGrid. Co si jednak stanie jeli w polu tekstowym
przypadkowo zostanie wpisana jaka litera? Wyniki wygenerowane przez stron w takim
przypadku przedstawione zostay na rysunku 20.4.
Rysunek 20.4. Wpisanie nieprawidowych danych w formularzu powoduje bd

Uytkownicy absolutnie nie powinni oglda takich stron. Dodajmy zatem do kodu strony z
listingu 20.2 instrukcj try, dziki ktrej bdziemy w stanie obsuy bd. Wiersze do 20. do 27.
listingu 20.2 zastp kodem przedstawionym na listingu 20.3.

Listing 20.3. Wykorzystanie instrukcji try w przykadzie z listingu 20.2.


20 try
21 objCmd.Connection.Open()
22 objReader = objCmd.ExecuteReader
23
24 dgData.DataSource = objReader
25 dgData.DataBind()
26
27 objReader.Close
28 objCmd.Connection.Close()
29 catch
30 lblMessage.Text = "Nieprawidowe dane wejciowe!"
31 end try

Sprbuj ponownie wywietli t stron; teraz wygenerowane wyniki powinne przypomina te z


rysunku 20.5.
Rysunek 20.5. Wyniki wykorzystania mechanizmw obsug bdw

Instrukcja try przechwycia bd zanim spowodowa on jakiekolwiek problemy i wywietlia


stosowny komunikat (patrz wiersz 30. listingu 20.3). Nastpnie wykonywanie programu zostao
wznowione w wierszu 31. i zakoczone w normalny sposb.
Wyjtki s pogrupowane hierarchicznie. Klas bazow wszystkich wyjtkw, jest klasa
System.Exception. Bezporednio poniej niej zostaa umieszczona klasa SystemException, a
z kolei poniej tej klasy wszystkie inne wyjtki, takie jak na przykad OleDbException czy
te FormatException.
Schodzc ku doowi hierarchii, bdy reprezentowane przez nalece do niej klasy staj si coraz
bardziej szczegowe. Na przykad, klasa SystemException obejmuje wszystkie wbudowane
bdy, natomiast klasa FormatException wycznie bdy spowodowane podaniem
nieprawidowych informacji. Wszystkie te wyjtki s klasami .NET, podobnie zreszt jak
wszystkie inne obiekty z ktrymi spotykalimy si w tej ksice. Fragment drzewa hierarchii klas
wyjtkw zosta przedstawiony na rysunku 20.6.

Rysunek 20.6. Fragment drzewa hierarchii klas wyjtkw


Opis rysunku
Wszystko tak jak jest w oryginale, to s bowiem nazwy klas, ktrych nie naley tumaczy.

Notatka
Zwr uwag, i cho klasa SystemException znajduje si w hierarchii poniej klasy
Exception, to naley ona do przestrzeni nazw System. Oznacza to, e naley si do niej
odwoywa za pomoc nazwy System.SystemException, a nie
System.Exception.SystemException.

Wykorzystanie oglnej postaci instrukcji catch uytej w poprzednim przykadzie, umoliwia


przechwytywanie bdw wszelkich moliwych typw. Innymi sowy instrukcja taka powoduje
przechwytywanie wszystkich wyjtkw, ktrych klasy le w drzewie hierarchii poniej klasy
Exception. Istnieje jednak moliwo przechwytywania wycznie wybranych typw wyjtkw;
w tym celu wykorzystywana jest instrukcja catch o nastpujcej postaci:
catch nazwaZmiennej as TypWyjtku

Na przykad, fragment kodu przedstawionego na listingu 20.3 mona by zamieni kodem z


listingu 20.4.

Listing 20.4. Zmodyfikowany blok try.


20 try
21 objCmd.Connection.Open()
22 objReader = objCmd.ExecuteReader
23
24 dgData.DataSource = objReader
25 dgData.DataBind()
26
27 objReader.Close
28 objCmd.Connection.Close()
29 catch objEx as FormatException
30 lblMessage.Text = objEx.Message
31 catch objEx as OleDbException
32 lblMessage.Text = "Bd bazy danych!"
33 catch objEx as Exception
34 lblMessage.Text = "Nieznany bd!"
35 end try

W wierszu 29. przechwytywane s wyjtki typu FormatException (jak rwnie wszystkie


wyjtki klas potomnych klasy FormatException). Jak na razie nie zwracaj uwagi na waciwo
Message wykorzystan w wierszu 30. zostanie ona opisana w dalszej czci rozdziau. W
wierszu 31. przechwytywane s wyjtki OleDbException, natomiast w wierszu 33. wszelkie
pozostae wyjtki. Jak wiadomo wyjtki s hierarchiczne, a zatem instrukcja catch bdzie
przechwytywa i obsugiwa wyjtki deklarowanej klasy jak i wszystkie wyjtki jej klas
potomnych (czyli bardziej szczegowe). Dlatego poszczeglne instrukcje catch naley
zapisywa w cile okrelonej kolejnoci, umieszczajc najbardziej szczegowe wyjtki na
pocztku, a te najbardziej oglne na kocu. W razie wykorzystania instrukcji catch naley
zwrci uwag i:
ze wzgldu na moliwo zgoszenia wyjtkw konkretnych klas potomnych (takich jak
FormatException lub OleDbException) lub konieczno wykonania szczeglnych
czynnoci podczas obsugi tych wyjtkw, naley je traktowa jako osobne przypadki i
przechwytywa niezalenie od pozostaych;
konstrukcja try catch przerywa przetwarzania wyjtkw po odnalezieniu instrukcji
catch sucej do obsugi wyjtkw danego typu;

Typ Exception jest najbardziej oglnym typem wyjtkw i uycie instrukcji catch xx
as Exception przypomina nieco uycie bloku case else w instrukcji if.

Zastpienie wierszy od 20. do 27. z listingu 20.2 fragmentem kodu przedstawionym na listingu
20.4 spowoduje wygenerowanie strony wynikowej pokazanej na rysunku 20.7.

Rysunek 20.7. Wykorzystanie kilku instrukcji catch umoliwia przechwytywanie bardziej


szczegowych bdw. Tekst opisujcy dany bd mona pobra przy uyciu waciwoci
Message obiektu wyjtku

Jest jeszcze jedna instrukcja, ktrej mona uywa wraz z instrukcj try finally. Umoliwia
ona podanie kodu wykonujcego operacje porzdkowe lub zakaczajce przetwarzanie, ktre
zostan wykonane niezalenie od tego, czy zosta zgoszony jaki wyjtek czy nie. Wiersze od 20.
do 27. listingu 20.2 mona by zastpi fragmentem kodu przedstawionym na listingu 20.5, dziki
czemu poczenie z baz danych byo by zamykane zawsze, niezalenie od tego czy wystpiy
jakie bdy czy nie.

Listing 20.5. Wykorzystanie instrukcji finally.


20 try
21 objCmd.Connection.Open()
22 objReader = objCmd.ExecuteReader
23
24 dgData.DataSource = objReader
25 dgData.DataBind()
26
27 objReader.Close
28 catch objEx as FormatException
29 lblMessage.Text = objEx.Message
30 catch objEx as OleDbException
31 lblMessage.Text = "Bd bazy danych!"
32 catch objEx as Exception
33 lblMessage.Text = "Nieznany bd!"
34 finally
35 objCmd.Connection.Close()
36 end try

Cay proces wykorzystania instrukcji try zosta przedstawiony na rysunku 20.8.

Rysunek 20.8. Przebieg realizacji programu wykorzystujcego instrukcj try


Opis rysunku
Execute code Wykonaj bloku kodu zapisany wewntrz instrukcji try
Error? Bd?
Yes Tak
No Nie
Execute catch Wykonaj blok kodu zapisany wewntrz instrukcji catch
Exscute finally Wykonaj blok kodu zapisany wewntrz instrukcji finally
Continue Kontynuuj dalsze wykonywanie programu

Kada klasa wyjtku udostpnia waciwoci, ktre mona wykorzysta do okrelenia przyczyny
bdu:
HelpLink poczenie z plikiem zawierajcym bardziej szczegowe informacje na
temat bdu (zarwno ten plik jak i poczenie do niego naley stworzy samemu).
InnerException odwoanie do wewntrznego wyjtku. Jeli inny wyjtek zosta
przechwycony i przekazany do innej procedury obsugi, to waciwo ta bdzie zawiera
odwoanie do niego.
Message komunikat opisujcy bd.

Source acuch znakw zawierajcy nazw obiektu, ktry spowodowa powstanie


bdu.
StackTrace waciwo ta zwraca obraz stosu zawierajcy informacje o
przyczynie bdu (wicej informacji na ten temat znajdziesz w dalszej czci rozdziau,
pt.: ledzenie).
TargetSite metoda, ktra spowodowaa powstanie bdu.
Zgaszanie wyjtkw
Wyjtki s bardzo przydatne i bynajmniej nie su one wycznie do przechwytywania i obsugi
bdw. W rzeczywistoci mog zaistnie sytuacje, w ktrych bdziemy chcieli zgasza swoje
wasne wyjtki.
Na przykad, przypomnij sobie serwisy sieci WWW ktre stworzylimy w rozdziaach 16. (pt.:
Tworzenie serwisw sieci WWW) i 17. (pt.: Wykorzystanie i zabezpieczanie serwisw sieci
WWW). Zamy, e sprawdzamy poprawno informacji na podstawie bazy danych i okazao
si, i nie s one poprawne. W takim przypadku, moglibymy zgosi wyjtek w naszym serwisie,
ktry aplikacja klienta mogaby przechwyci i obsuy przy uyciu instrukcji try i catch.
Do zgaszania wyjtkw suy instrukcja throw:
throw new Exception("O nie! Co z tym trzeba zrobi!")

Wykonanie powyszej instrukcji spowoduje utworzenie nowego wyjtku bazujcego na klasie


Exception. acuch znakw umieszczony wewntrz nawiasw jest komunikatem o bdzie.
Gdyby powysza instrukcja zostaa dodana z listingu 20.2 na samym pocztku procedury
GetData, to wyniki wykonania tej strony przypominayby te z rysunku 20.9.

Rysunek 20.9. Wykorzystanie instrukcji throw do zgaszania wasnych bdw

Zgaszanie wasnych wyjtkw moe by bardzo wygodne w sytuacjach gdy sami nie mamy
zamiaru ich obsugiwa. O ile tylko funkcja, ktra wywoaa fragment kodu zgaszajcy wyjtek
jest w stanie go przechwyci i obsuy, to nie mamy si czym przejmowa.
Na przykad, jedn z sytuacji w ktrych moe si przyda moliwo zgaszania wasnych bdw,
jest podawanie danych w formularzu. Po przesaniu danych na serwer, procedura ktra je
obsuguje moe wywoywa metod, ktra sprawdza czy s one poprawne czy nie (na przykad,
czy uytkownik zamiast imienia nie wpisa jakiej liczby). Metoda ta mogaby zgasza okrelone
przez nas bdy, aby poinformowa procedur, ktra j wywoaa, e co jest nie w porzdku.
Procedura obsugujca dane przesane z formularza mogaby nastpnie odpowiednio obsugiwa te
bdy.
Warto wiedzie, e nasze moliwoci nie ograniczaj si do zgaszania wasnych wyjtkw
mona zgasza wyjtki wszystkich dostpnych typw. Na przykad, przedstawiona poniej
instrukcja throw zgasza wyjtek informujcy o braku argumentu:
throw new ArgumentNullException()

Moliwoci te s niezwykle przydatne w przypadku tworzenia obiektw biznesowych, gdy


pozwalaj programistom korzystajcym z tych obiektw, na implementacj wasnych metod
obsugi bdw.

Kiedy naley stosowa instrukcj try


Instrukcja try jest przydatna podczas testowania kodu, gdy umoliwia wykrywania bdw bez
przerywania realizacji programu. Istnieje kilka podstawowych zasad, do ktrych naley si
stosowa w razie korzystania z tej instrukcji.
Po pierwsze, instrukcji try zawsze naley uywa w sytuacjach gdy s wykorzystywane systemy
nie nalece do rodowiska ASP.NET, takie jak bazy danych lub pliki. W takich przypadkach
istniej bowiem bardzo wiele czynnikw ktre mog spowodowa powstanie bdw, a nad
ktrymi nie mamy adnej kontroli (na przykad: brak pliku, niewystarczajce prawa dostpu do
pliku, brak moliwoci nawizania poczenia z baz danych, brak tabeli bazy danych na ktrej
chce operowa polecenie SQL, i tak dalej). I wanie dlatego, w przypadku wykorzystania
zewntrznych systemw i zasobw, uycie instrukcji try jest absolutn koniecznoci.
Instrukcj try warto take stosowa w przypadkach gdy nie jestemy pewni poprawnoci
napisanego fragmentu kodu, a w szczeglnoci, na etapie testowania i uruchamiania aplikacji. Na
przykad, moe si zdarzy e dziaanie pewnego fragmentu kodu zaley do wielu rnych
czynnikw (doskonaym przykadem jest tu wizanie danych z elementami sterujcymi
DataGrid).

Nie naley polega na instrukcjach try przy wykrywaniu bdw w informacjach podawanych
przez uytkownika. Do kontroli poprawnoci danych naley stosowa inne metody, na przykad
elementy sterujce Validation, ktre zostay zaprojektowane specjalnie w tym celu. Elementy te
zapewniaj wiksze moliwoci programistyczne suce do obsugi tego typu bdw i s w
stanie bardziej precyzyjnie okreli ich przyczyny ni instrukcje try.
I w kocu ostatnia sprawa, nie naley umieszcza caego kodu wewntrz instrukcji try. Powinno
si je stosowa wycznie w razie koniecznoci. Rnego typu koszty zwizane z wykorzystaniem
tych instrukcji mog by niewielkie, jednak uzyskiwane korzyci nie zawsze s ich warte.

ledzenie
By moe poznae ju sposb testowania tworzonych aplikacji przy wykorzystaniu przemylnie
uywanych wywoa metody Response.Write. Jeli podejrzewasz, e jaki fragment kodu
powoduje bdy, to moesz go zakomentowa, umieci w odpowiednim miejscu wywoanie
metody Response.Write i przekona si czy Twe przypuszczenia byy suszne. Na przykad,
przeanalizujmy przykad przedstawiony na listingu 20.6.

Listing 20.6. Testowanie fragmentw kodu.


1 <%@ Page Language="VB" %>
2 <%@ Import Namespace="System.Data" %>
3 <%@ Import Namespace="System.Data.OleDb" %>
4
5 <script runat="server">
6 sub Submit(obj as object, e as eventargs)
7 dim strSQL as string = _
8 "SELECT UserID FROM tblUsers WHERE " & _
9 "Firstname = '" & tbUserName.Text & "' AND " & _
10 "Lastname = '" & tbPassword.Text & "'"
11
12 'tutaj wykonujemy inne operacje na bazie danych
13 end sub
14 </script>
15
16 <html><body>
17 <form runat="server">
18 <asp:Label id="lblMessage" runat="server" />
19 Imi uytkownika:
20 <asp:Textbox id="tbUserName" runat="server" /><p>
21 Nazwisko uytkownika:
22 <asp:Textbox id="tbPassword" runat="server"
23 TextMode="password" /><p>
24 <ASP:Button id="tbSubmit" runat="server"
25 OnClick="Submit"
26 Text="Przelij" />
27 </form>
28 </body></html>

Analiza
Formularz wywietlany na powyszej stronie przeszukuje baz danych na podstawie podanego
imienia i nazwiska uytkownika. Jest to bardzo prosty przykad, lecz wyobramy sobie, e z
jakich powodw nie dziaa on poprawnie i podczas wykonywania strony pojawiaj si bdy
by moe ich przyczyn s nieodpowiednie informacje zwracane z bazy danych. W podobnych
przypadkach, czsto spotykanym rozwizaniem jest sprawdzenie poprawnoci zadawanego
zapytania SQL.
Aby sprawdzi poprawno zadawanego zapytania SQL mona umieci nastpujcy fragment
kodu, poniej 10. wiersza listingu 20.6:
Response.Write(strSQL)

Nastpnie zakomentujmy wszystkie podejrzane wiersze kodu, tak aby uniemoliwi powstawanie
bdw. Wyniki wykonania zmodyfikowanej wersji strony (listing2006-v2.aspx) zostay
przedstawione na rysunku 20.10.

Rysunek 20.10. Wywoanie metody Response.Write pozwala na sprawdzanie wartoci


zmiennych

Metoda Response.Write jest bardzo przydatnym narzdziem umoliwiajcym ledzenie


zmiennych i wywietlanie ich wartoci. Niestety nie jest ona w stanie dostarczy adnych innych
informacji poza wartoci zmiennej, a co gorsze, cige dodawanie i usuwanie jej wywoa w
rnych miejscach programu moe by prawdziwym utrapieniem.
Mechanizm ledzenia udostpniany przez ASP.NET rozwizuje ten problem. Pozwala on na
wywietlanie wyrae testujcych i ledzenie procesu wykonywania kodu. Mechanizm ledzenia
informuje jakie metody zostay wykonane, ile czasu zajo wykonanie kadej z nich, jakie s
biece wartoci zmiennych i udostpnia wiele innych przydatnych informacji, a wszystko to w
przejrzystym i czytelnym formacie.
Wane jest take to, i po zakoczeniu procesu testowania kodu nie trzeba z niego usuwa
instrukcji testowych. Wszystkie te instrukcje mona wyczy przy uyciu jednego polecenia.
Mechanizm ledzenia mona wczy na jednej konkretnej stronie lub na wszystkich stronach
wchodzcych w skad aplikacji. Niezalenie od sposobu uycia, po wyczeniu instrukcji
testujcych nie maj one adnego wypywu na sposb dziaania aplikacji i nie generuj adnych
danych wynikowych, ktre byyby przesyane do klienta.
ASP.NET udostpnia dwa poziomy ledzenia ledzenie na poziomie strony oraz ledzenie na
poziomie aplikacji.

ledzenie na poziomie strony


O moliwociach mechanizmu ledzenia mona si przekona bardzo atwo. Wystarczy doda
atrybut Trace="true" do dyrektywy @ Page (w 1. wierszu listingu 20.6):
<%@ Page Language="VB" Trace="true" %>

W powyszy sposb ledzenie na tej stronie zostao wczone. Rysunki 20.11 oraz 20.12
przedstawiaj wyniki wygenerowane na stronie po wczeniu ledzenia.

Rysunek 20.11. Mechanizm ledzenia daje dostp do bardzo wielu informacji przydatnych przy
testowaniu stron ASP.NET
Rysunek 20.12. Dalszy fragment tej samej strony ASP.NET

O rany, co si stao!? Nagle na naszej prostej stronie ASP.NET pojawia caa masa informacji.
Przejrzyj wywietlon stron i dokadnie przeanalizuj wszystkie jej fragmenty. Jak mona si
przekona mechanizm ledzenia udostpni niemal wszystkie informacje o stronie jakie mona
sobie wyobrazi! Omwmy poszczeglne fragmenty tych informacji.
Na samym pocztku wci jest widoczny formularz z listingu 20.6. Mona si nim posugiwa w
taki sposb, jak gdyby nie byo pod nim adnych dodatkowych informacji. ASP.NET dodaje te
tabele z informacjami automatycznie, w momencie wczenia mechanizmu ledzenia. Zawieraj
one dane, ktre mog si przyda przy testowaniu aplikacji i sprawdzaniu efektywnoci jej
dziaania. Oczywicie, pod adnym pozorem informacje te nie powinne by dostpne dla
uytkownikw kocowych.
Kolejny fragment strony Request Details (szczegowe informacje o daniu) zawiera
informacje o sposobie w jaki klient zada danej strony. Zawiera on unikalny identyfikator sesji
dla danego uytkownika, czas przesania dania, jego metod (w naszym przypadku jest to
metoda GET), kod statusu oraz informacje o uytym sposobie kodowania. Informacje te s bardzo
przydatne, cho w naszym przypadku niewiele moemy z nimi zrobi.
Fragment Trace Information (informacje ledzenia) zawiera informacje o przebiegu wykonywania
strony. Lista wywietlana w tej czci strony zawiera wszystkie zaistniae i obsuone zdarzenia
oraz czasy ich realizacji (liczc od pocztku obsugi dania oraz od momentu zakoczenia
wykonywania poprzedniego zdarzenia). Niektre ze zdarze widocznych na rysunku 20.11 s nam
ju znane, jest jednak take kilka zdarze z ktrymi spotkalimy si po raz pierwszy. Kolumna
Category (kategoria) informuje w jakim miejscu zosta wygenerowany kady z wywietlonych
ladw.
Kolejny fragment strony Control Tree (drzewo elementw sterujcych) prezentuje
hierarchiczne drzewo wszystkich elementw sterujcych serwera wykorzystywanych na danej
stronie ASP.NET. Warto zwrci uwag na to, i wywietlane s nawet elementy
LiteralControl (wicej informacji na ich temat mona znale w rozdziale 2., pt.: Tworzenie
stron ASP.NET). W tym fragmencie strony wywietlana jest wielko kadego z elementw
sterujcych (wyraona w bajtach) oraz wielko obszaru pamici koniecznego do zapamitania
stanu danego elementu (tzw. widoku stanu). To wanie w tym miejscu moesz si przekona ile
pamici pochania zapamitanie staniu formularza i na tej podstawie zdecydowa czy pozostawi,
czy te wyczy t opcj.
Nastpny fragment Cookies Collection (kolekcja cookies) zawiera informacje o
wykorzystywanych cookies oraz ich wartociach. W zalenoci od natury konkretnej aplikacji, ten
fragment strony moe by zupenie pusty, bd te moe prezentowa jakie informacje.
Fragment Headers Collection (kolekcja nagwkw) prezentuje informacje zapisane w
nagwkach HTTP. Midzy innymi s to informacje o serwerze, wersji i typie przegldarki,
adresie strony URL jaka bya wywietlona w przegldarce uytkownika w chwili gdy przesano
danie, typie zawartoci, i tak dalej.
Fragment Form Collection (kolekcja danych z formularza) przedstawia wszelkie dane przesane
metod POST. Jeli wanie przesae formularz wywietlony na ogldanej stronie, to w tej czci
w tej czci informacji wygenerowanych przez mechanizm ledzenia, powiniene zobaczy
wpisane przez siebie wartoci oraz informacje o widoku stanu.
I w kocu ostatni fragment wywietlanych informacji Server Variables (zmienne serwera)
zawiera dane o nagwkach HTTP, nazw i port na ktrym dziaa serwer, typ poczenia HTTP,
itd. S to informacje wykorzystywane przez serwer do skonfigurowania aplikacji.
Informacje generowane przez mechanizm ledzenia mona take posortowa ze wzgldu na czas
zajcia zdarzenia lub kategori do jakiej nale. W tym celu wykorzystywany jest atrybut
TraceMode dyrektywy @ Page:
<%@ Page Language="VB" Trace="true" TraceMode="SortByTime" %>

SortByTime (sortuj wedug czasu) to domylny sposb sortowania informacji wywietlanych


przez mechanizm ledzenia. W przypadku sortowania wynikw wedug kategorii
(SortByCategory) s one prezentowane w inny sposb, niemniej jednak w naszym przypadku
nie da si zauway adnej rnicy, gdy wykorzystywana jest tylko jedna kategoria.
Jak mona si przekona, powysza strona zawiera wiele informacji dotyczcych efektywnoci
dziaania aplikacji. Mona wrd nich znale dokadne dane o czasie realizacji kadego etapu
przetwarzania strony. Na ich podstawie mona okreli czy konieczne jest wprowadzanie
poprawek w celu usprawnienia dziaania danej strony. Na przykad, warto zwrci uwag, i czas
pomidzy zdarzeniami BeginRender oraz EndRender (czyli czas jaki zajo wywietlenie strony
w przegldarce), jest jednym z najwikszych.
Waciwo Trace mona wykorzysta do wywietlana wasnych komunikatw testowych na
wynikowej stronie ASP.NET. Waciwo ta przechowuje obiekt klasy TraceContext ktra
udostpnia dwie, niemal identyczne metody Write oraz Warn. Obie metody wywietlaj
informacje podane przez programist, z tym i druga z nich wywietla je w kolorze czerwonym.
Przyjrzyjmy si prostemu przykadowi. Dodaj poniszy fragment kodu do wiersza 12. listingu
20.6 (czyli zastp umieszczone w nim wywoanie metody Response.Write).
Trace.Write("Moja kategoria", strSQL )

Pierwszym argumentem wywoania tej metody jest kategoria, do ktrej ma nalee wywietlany
komunikat, a drugim tre tego komunikatu. Po przesaniu formularza powinne zosta
wywietlone wyniki przypominajce te z rysunku 20.13.
Rysunek 20.13. Dodawanie wasnych informacji testowych

Zwr uwag na now kategori wywietlon mniej wicej w poowie fragmentu strony Trace
Information. Zdarzenie to zostao wygenerowane pomidzy zdarzeniami Begin Raise
PostBackEvent a End Raise PostBackEvent, ktre odpowiadaj za obsug przesanego
formularza. Nowy, wygenerowany przez nas komunikat zawiera zapytanie SQL zapisane w
zmiennej strSQL. Naley zwrci uwag i komunikat ten nie pojawi si na faktycznej stronie, a
jedynie wrd informacji generowanych przez mechanizm ledzenia. Dzieje si tak dlatego, e
metody Trace.Write oraz Trace.Warn zapisuj komunikaty w dzienniku ledzenia, a nie w
wynikach dziaania samej strony ASP.NET przesyanych do klienta.
Przeanalizujmy teraz nieco bardziej zoony przykad, przedstawiony na listingu 20.7. Strona ta
tworzy obiekt DataSet, zapisuje go w pamici podrcznej, a nastpnie wie dane z elementem
sterujcym DataGrid. Podczas obsugi kolejnych da dane nie s pobierane z bazy danych,
lecz z pamici podrcznej, co skraca czas wykonywania strony. Na stronie jest take dostpny
przycisk, ktry pozwala uytkownikom na uniewanienie i usunicie zawartoci pamici
podrcznej, przez co proces pobierania informacji z bazy danych zostanie ponownie wykonany.

Listing 20.7. Bardziej zoony przykad wykorzystujcy mechanizm ledzenia.


1 <%@ Page Language="VB" Trace="true"%>
2 <%@ Import Namespace="System.Data" %>
3 <%@ Import Namespace="System.Data.OleDb" %>
4
5 <script language="VB" runat="server">
6 sub Page_Load(obj as Object, e as EventArgs)
7 Trace.Warn("Wasna", "adujemy stron...")
8 if not Page.IsPostBack then
9 Trace.Warn("Wasna", "Nowe danie, wywoujemy procedur
CreateData...")
10 CreateData()
11 end if
12 end sub
13
14 sub CreateData
15 dim source as DataView
16 source = Cache("DataView")
17
18 if source is nothing then
19 dim strConnString as string = "Provider=" & _
20 "Microsoft.Jet.OLEDB.4.0;" & _
21 "Data Source=C:\ASPNET\data\banking.mdb"
22
23 Trace.Warn("Wasna", "Tworzymy obiekt OleDbDataAdapter...")
24 dim objCmd as OleDbDataAdapter = new _
25 OleDbDataAdapter("select * from tblUsers", _
26 strConnString)
27 Trace.Warn("Wasna", "Zapytanie SQL: " & _
28 objCmd.SelectCommand.CommandText)
29
30 dim ds as DataSet = new DataSet()
31 objCmd.Fill(ds, "tblUsers")
32
33 source = new DataView(ds.Tables(0))
34 Trace.Warn("Wasna", _
35 "Wstawiamy obiekt DataSet do pamici podrcznej...")
36 Cache.Insert("DataView", source)
37
38 lblMessage.Text = "Dane pobrane bezporednio"
39 else
40 lblMessage.Text = "Dane pobrane z pamici " & _
41 "podrcznej<br>"
42 end if
43
44 Trace.Warn("Wasna", "Wiemy dane...")
45 dgData.DataSource = source
46 dgData.DataBind()
47 end sub
48
49 sub ExpireCache(obj as object, e as eventargs)
50 Trace.Warn("Wasna", "Usuwamy dane z pamici " & _
51 "podrcznej, wywoujemy procedur CreateData")
52 dim dv as dataview = Cache.Remove("DataView")
53 CreateData()
54 end sub
55 </script>
56
57 <html><body>
58 <form runat="server">
59 <asp:Label id="lblMessage" runat="server"
60 maintainState=false/><p>
61 <asp:Button id="btSubmit" runat="server"
62 text="Wyczy pami podrczn"
63 OnClick="ExpireCache"/><p>
64 <asp:DataGrid id="dgData" runat="server"
65 BorderColor="black" GridLines="Vertical"
66 cellpadding="4" cellspacing="0"
67 width="450" Font-Name="Arial"
68 Font-Size="8pt"
69 />
70 </form>
71 </body></html>

Analiza
Przede wszystkim naley zwrci uwag, e w 1. wierszu powyszego przykadu zostaje wczone
ledzenie (poprzez uycie atrybutu Trace="true" dyrektywy @ Page). Dziki temu na stronie
bd wywietlane informacje generowane przez mechanizm ledzenia raz nasze komunikaty
wywietlane przy uyciu metod Trace.Write i Trace.Warn.
Wywoania metody Trace.Warn zostay rozmieszczone w kluczowych miejscach strony w
wierszach: 7., 9., 23., 27., 34., 44. i 50. aby informowa nas o zachodzeniu konkretnych
zdarze. Po jednokrotnym wywietleniu strony i klikniciu przycisku Wyczy pami podrczn
zostan wywietlone informacje przedstawione na rysunku 20.14.
Rysunek 20.14. Generacja informacji testowych okrelanych przez twrc strony

Strona z rysunku 20.14 zawiera cakiem sporo przydatnych informacji. Przede wszystkim mona
na jej podstawie okreli kolejno zachodzenia poszczeglnych zdarze. W szczeglnoci naley
zwrci uwag, i zdarzenie Page_Load zachodzi znacznie wczeniej ni zdarzenia zwizane z
przetwarzaniem formularza. Wiele bdw czsto popenianych przy tworzeniu stron ASP.NET
wynika z faktu, i ich autorzy zapominaj o kolejnoci zachodzenia i obsugi zdarze.
Po drugie, na wygenerowanej stronie zostao wywietlone zadawane zapytanie SQL. W naszym
przypadku posta tego zapytania nie zmienia si, wic wywietlenie go nie ma szczeglnego
znaczenia. Niemniej jednak moliwo ta jest niezwykle przydatna jeli wykorzystywane
zapytanie SQL musi by tworzone dynamicznie.
Kolejnym zagadnieniem na jakie naley zwrci uwag, jest rnica czasu pomidzy
komunikatami Wstawiamy obiekt DataSet do pamici podrcznej i Zapytanie SQL. Okrela
ona czas jaki zabrao wykonanie zapytania i pobranie informacji z bazy danych. Jest on blisko 200
razy duszy od czasu pomidzy dowolnymi dwoma generowanymi przez nas komunikatami.
A teraz odwiemy stron (bez powtrnego przesyana danych formularza) i ponownie
przeanalizujmy informacje wygenerowane przez mechanizm ledzenia. Zwr uwag, i czny
czas wykonania strony jest ponad dwukrotnie krtszy.
I wreszcie na samym kocu przejrzyjmy cz strony Control Tree i zwrmy uwag na ilo
pamici koniecznej do zapamitania widoku stanu okrelon w kolumnie Viewstate Size Bytes
(excluding children) (rozmiar widoku stanu w bajtach (bez elementw podrzdnych)). (Wicej
informacji na temat widoku stanu mona znale w rozdziale 2., pt.: Tworzenie stron
ASP.NET.). Po dodaniu wszystkich wartoci wywietlonych w tej kolumnie okae si, e strona
wymaga okoo 6 kb pamici, czyli niemal 40% caej pamici koniecznej do wywietlenia strony
(podanej w kolumnie Render Size Bytes (including children) pami konieczna do wywietlenia
elementu (wraz z elementami podrzdnymi)). Jeli nie musimy korzysta z widoku stanu, to bez
wtpienia wyczenie go bardzo si opaci; mona to zrobi dodajc do dyrektywy @ Page atrybut
EnableViewState="false".
ledzenie na poziomie strony jest bardzo potnym narzdziem umoliwiajcym nie tylko
testowanie strony lecz take optymalizacj jej dziaania. Jeli informacje generowane przez
mechanizm ledzenia nie bd ju potrzebne, mona je ukry wyczajc ledzenie wystarczy
w tym celu doda do dyrektywy @ Page atrybut Trace="false". Warto zauway, i nie trzeba
usuwa z kodu strony wywoa metody Trace.Warn nie wpywaj one bowiem na sposb
wykonywania strony ani na efektywno jej dziaania.
Moe si zdarzy, e bdziemy chcieli wykona pewne fragmenty kodu wycznie w przypadku
jeli mechanizm ledzenia jest wczony. Na przykad, moemy chcie, aby podczas ledzenia
byy wywietlane generowane przez informacje testowe. W tym celu wystarczy sprawdzi warto
waciwoci Trace.IsEnabled:
1 If Trace.IsEnabled then
2 For i = 0 to ds.Tables("tblUsers").Rows.Count-1
3 Trace.Write("Info usr.", ds.Tables("tblUsers"). _
4 Rows(i)(0).ToString)
5 next
6 end if

W przypadku gdy mechanizm ledzenia zosta wczony, to powyszy fragment kodu dodaje do
generowanych przez niego informacji, dane pobrane z bazy danych. Oznacza to, e waciwo
Trace mona wykorzysta do okrelania kiedy maj by wykonywane fragmenty kod; moliwo
ta jest nieodzowna podczas testowania aplikacji.

ledzenie na poziomie aplikacji


Mechanizm ledzenia jest niezwykle przydatnym narzdziem, jednak wczanie go i wyczanie
na kadej ze stron wchodzcych w skad witryny moe by prawdziwym utrapieniem. Co wicej,
ledzenie na poziomie strony daje dostp do informacji dotyczcych wycznie aktualnie
wywietlanej strony ASP.NET nie ma wrd nich adnych informacji o jakichkolwiek innych
stronach witryny. Dziki ledzeniu na poziomie aplikacji mona w bardzo prosty sposb wcza i
wycza mechanizm ledzenia dla wszystkich stron witryny oraz przeglda generowane przez
niego informacje w jednym, centralnym miejscu.
Aby wczy mechanizm ledzenia na poziomie aplikacji (czyli tak, by zostay nim objte
wszystkie strony witryny), naley umieci w pliku konfiguracyjny web.config sekcj trace:
1 <configuration>
2 <system.web>
3 <trace enabled="true" />
4 </system.web>
5 </configuration>

Uycie powyszego pliku konfiguracyjnego spowoduje wczenie mechanizmu ledzenia dla caej
witryny, co oznacza, e mechanizm ledzenia bdzie generowa informacje dla kadej z
odwiedzanych stron (chyba e na ktrej ze stron zostanie on jawnie wyczony). Domylnie, w
przypadku wczania ledzenia na poziomie witryny, informacje generowane przez mechanizm
ledzenia nie s wywietlane na wykonywanych stronach. W tym przypadku wszystkie dostpne
informacje mona wywietli przy wykorzystaniu jednego, specjalnego pliku o nazwie trace.axd.
(Nie trzeba go tworzy rcznie wszystkim automatycznie zajmie si ASP.NET; w
rzeczywistoci pliku tego nie bdzie mona otworzy przy uyciu Eksploratora Windows, gdy
IIS tworzy go dynamicznie.) Plik trace.axd mona wywietli z poziomu dowolnego folderu
aplikacji:
http://localhost/aspnetdlakazdego/trace.axd

Strona wywietlona po podaniu powyszego adresu bdzie przypomina t z rysunku 20.15,


oczywicie jej zawarto bdzie zalee od stron jakie zostay wywietlone wczeniej.
Rysunek 20.15. Informacje generowane przez mechanizm ledzenia na poziomie aplikacji
udostpniane za porednictwem pliku trace.axd

Notatka
Nie zapomnij doda sekcji <trace enabled="true" /> do pliku konfiguracyjnego
web.config zanim zaczniesz wywietla strony wchodzce w skad aplikacji, gdy w przeciwnym
przypadku w pliku trace.axd nie bd dostpne adne informacje!

Domylnie strona trace.axd przedstawia podstawowe informacji dotyczcych 10 ostatnich da.


Wywietlany jest czas otrzymania dania, nazwa danego pliku, metoda dania oraz kod
odpowiedzi. Poczenia View Details (wywietl informacje szczegowe) umieszczone z prawej
strony kadego wiersza umoliwiaj wywietlenie informacji wygenerowanych przez mechanizm
ledzenia, przypominajcych te przedstawione na rysunku 20.11 (z tym i nie bdzie wrd nich
waciwych wynikw dziaania strony). Poczenie [ clear current trace ] (wyczy informacje
ledzenia) umoliwia usunicie z dziennika aplikacji wszelkich, przechowywanych w nim
informacji wygenerowanych przez mechanizm ledzenia. Informacje te zabieraj sporo miejsca, a
zatem usunicie ich moe nieznacznie poprawi efektywno dziaania aplikacji. (Warto jednak
pamita, e liczba obsuonych dania moe rosn bardzo szybko!)
A teraz otwrz nowe okno przegldarki, wywietl w nim dowoln stron naszej aplikacji i
kilkukrotnie j odwie. Nastpnie wr do okna prezentujcego plik trace.axd i odwie jego
zawarto. Powinne si w nim pojawi informacje o nowych daniach. Warto zwrci uwag, i
wraz z kadym nowym daniem wywietlonym na tej stronie zmniejsza si liczba wywietlona w
polu Remaining (pozostaje). Jeli przekroczymy dopuszczalny limit, to starsze dania bd
usuwane.
Informacje prezentowane w pliku trace.axd mona konfigurowa na wiele rnych sposobw
mona zmienia ilo zapamitywanych da, sposb wywietlania informacji oraz miejsce w
jakim bd prezentowane. Poniej przedstawiona zostaa pena skadnia sekcji trace,
zapisywanej w pliku konfiguracyjnym web.config:
<trace enabled="wartoLogiczna" pageOutput="wartoLogiczna"
requestLimit="liczba" traceMode="trybledzenia" />

Atrybut traceMode peni t sam funkcj co w przypadku ledzenia na poziomie strony


okrela w jaki sposb powinien dziaa mechanizm ledzenia. Atrybut pageOutput okrela czy
informacje generowane przez mechanizm ledzenia maj by wywietlane nie tylko w pliku
trace.axd lecz take na poszczeglnych stronach ASP.NET; domylnie atrybut ten ma warto
false. Kolejny atrybut requestLimit okrela ilo da, o ktrych informacje bd
przechowywane w pamici; domylna warto tego atrybutu wynosi 10.

Notatka
Ustawienia atrybutu Trace (konkretnie Trace="false") umieszczane w dyrektywie @ Page
na poszczeglnych stronach ASP.NET maj wyszy priorytet ni ustawienia dotyczce
ledzenia na poziomie aplikacji. Oznacza to, e jeli wyczymy ledzenie dla danej strony, to
informacje o niej nie bd dostpne w pliku trace.axd.

ledzenie na poziomie aplikacji zapewnia szybki i atwy sposb dostpu do informacji


dotyczcych wszystkich stron witryny. Dziki niemu mona wykrywa wskie garda aplikacji
w sytuacji gdy bdzie ona obciona du iloci da.

Program uruchomieniowy CLR


Testowanie kompilowanych aplikacji moe wymaga zastosowania szczeglnych rozwiza;
moe si bowiem zdarzy, e aplikacje te nie bd w stanie generowa wynikw ktre programista
mgby bezporednio zobaczy (na przykad, skompilowane obiekty biznesowe przewanie nie
wywietlaj adnych informacji). Zazwyczaj, kod takich aplikacji jest tumaczony na jzyk
maszynowy lub jzyk poredni MSIL, ktre znacznie utrudniaj analiz przebiegu wykonywania
aplikacji. Programy tego typu wymagaj uycia programu uruchomieniowego innego typu
programu, ktry mona doczy do dziaajcego procesu.

Nowe wyraenie
Podczas uruchamiania aplikacji, jej skompilowany kod jest wykonywany przez komputer. Kod ten
wykonuje polecenia, tworzy zmienne, przypisuje im wartoci, a nastpnie je usuwa. Przypominasz
sobie zapewne, e wszystkie te zmienne s przechowywane w pamici. Doczanie programu
uruchomieniowego oznacza, e inna aplikacja a konkretnie, wanie program uruchomieniowy
obserwuje pami wykorzystywan przesz testowany program. Program uruchomieniowy moe
interpretowa wykonywane instrukcje oraz zawarto pamici uywanej przez testowany program
i prezentowa j programicie w przejrzysty i zrozumiay sposb.
Metody testowania przedstawione we wczeniejszej czci tego rozdziau wymagay
modyfikowania kodu rdowego aplikacji ASP.NET przed ich wykonanie oraz analizy
wygenerowanych wynikw. Doczanie programu uruchomieniowego jest bardzo przydatnym
rozwizaniem jeli obserwacja procesu realizacji strony i modyfikacja wykonywanych instrukcji
musi nastpowa podczas wykonywania danej strony. Rnica pomidzy tymi dwiema metodami
testowania zostaa zilustrowana na rysunku 20.16.

Rysunek 20.16. Doczania program uruchomieniowego pozwala na ledzenie procesu


wykonywania aplikacji krok po kroku
Opis rysunku
Output debugging Testowanie aplikacji na podstawie generowanych wynikw
Modify code to Modyfikacja kodu polegajca na wstawieniu instrukcji testujcych
Let program run until Wykonania programu a do jego zakoczenia
Examine output Analiza wynikw
Repeat Powtrzenie procesu
Runetime debuggint Testowanie programu podczas jego dziaania
Execute program Wykonanie programu
Attach debugger Doczenie programu uruchomieniowego
Watch/alter commands Obserwacja i modyfikacja instrukcji i zmiennych podczas dziaania
programu
See immediate results Natychmiastowa obserwacja wynikw
Stop Zatrzymanie programu uruchomieniowego
Repeat Powtrzenie procesu

Uycie programu uruchomieniowego CLR


Zanim bdzie mona uy programu uruchomieniowego naley wczy moliwo testowania
aplikacji w pliku konfiguracyjnym web.config. W tym celu, do pliku web.config zapisanego w
gwnym folderze aplikacji naley doda nastpujcy fragment kodu:
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
</configuration>

Nowe wyraenie
Powysza sekcja compilation powoduje wygenerowanie pliku symboli (z rozszerzeniem .pdb)
dla danej aplikacji. Plik ten dostarcza programowi uruchomieniowemu informacji koniecznych do
poprawnego skojarzenia interpretowanych polece z kodem rdowym aplikacji. Dziki temu
mona ledzi przebieg wykonywania programu obserwujc jego kod rdowy, a nie tajemniczy i
niezrozumiay kod maszynowy.
Dodanie powyszej sekcji do pliku konfiguracyjnego powoduje take wywietlania podstawowych
informacji uatwiajcych testowanie bezporednio na stronach ASP.NET, na ktrych wystpi bd
(patrz podrozdzia Informacje wstpne dotyczce testowania aplikacji).

Ostrzeenie
Koniecznie naley wyczy opcje testowania aplikacji, gdy tylko proces sprawdzania
poprawnoci jej dziaania zostanie zakoczony. Kompilacja podczas ktrej s generowane pliki
symboli w znaczcym stopniu spowalnia dziaanie aplikacji.

Sprbujmy teraz wykona program uruchomieniowy CLR. Nosi on nazw DbgCLR.exe i


domylnie jest zapisywany w folderze c:\Program Files\Microsoft.NET\FramworkSDK\DbgCLR1.
Wygld okna tego programu zaraz po uruchomieniu zosta przedstawiony na rysunku 20.17.

1
We wczeniejszych wersjach .NET SDK program ten nosi nazw DbgUrt.exe
Rysunek 20.17. Interfejs graficzny programu uruchomieniowego CLR

Po uruchomieniu programu uruchomieniowego CLR mona przystpi do testowania stron


ASP.NET. Proces ten skada si z czterech etapw:
1) otworzenia pliku, ktry chcemy testowa;
2) doczenia programu uruchomieniowego do procesu ASP.NET;
3) ustawienia punktw przerwa;
4) wykorzystania moliwoci programu uruchomieniowego do manipulowania
przebiegiem wykonywania aplikacji.
Zakadam, e kod z listingu 20.7 zapisae w pliku o nazwie listing2007.aspx; teraz wywietl t
stron w przegldarce, tak aby zostaa wykonana. W ten sposb uruchomimy proces ASP.NET
(jeli nie zosta uruchomiony ju wczeniej). Teraz otwrz ten sam plik w programie
uruchomieniowym CLR. W tym celu wybierz opcje FileOpenFile, a nastpnie, w
wywietlonym oknie dialogowym, odszukaj odpowiedni folder i otwrz plik listing2007.aspx. Po
otworzeniu pliku jego kod rdowy powinien si pojawi w oknie programu uruchomieniowego,
a jego nazwa w oknie Solutions Explorer wywietlonym z prawej strony okna programu
uruchomieniowego.
Aby doczy program uruchomieniowy do procesu ASP.NET naley wybra z menu gwnego
opcj ToolsDebug Processes. Po wybraniu tej opcji na ekranie pojawi si okno dialogowe
przedstawione na rysunku 20.18.
Rysunek 20.18. Doczania programu uruchomieniowego do procesu ASP.NET

Teraz zaznacz pole wyboru Show system processes (jeli nie jest zaznaczone) i na licie
wywietlonej powyej niego odszukaj proces o nazwie aspnet_ewp.exe. Zaznacz ten proces po
czym kliknij przycisk Attach. Zamknij okno dialogowe klikajc przycisk Close.
Teraz w oknie programu uruchomieniowego pojawi si nowe okno Disassembly. Okno to
przedstawia zinterpretowane instrukcje kodu maszynowego testowanej strony.

Ostrzeenie
Gdy doczasz program uruchomieniowy do jakiejkolwiek innej aplikacji, to zazwyczaj aplikacja
ta zostaje zamroona (nie mona z niej normalnie korzysta) a wszystkie niezapisane
informacje mog zosta utracone. ASP.NET nie stanowi pod tym wzgldem adnego wyjtku.
Doczajc program uruchomieniowy do dziaajcych procesw upewnij si, e nie zablokujesz
adnych produkcyjnych aplikacji.

Nowe wyraenie
Punkt przerwania to konkretne miejsce kodu programu w ktrym jego realizacja zostaje
wstrzymana. Punkty przerwania s niezwykle przydatne w tych wszystkich sytuacjach, gdy
chcemy przetestowa konkretny wiersz programu. Na przykad, jeli wiemy w ktrym wierszu
programu powstaj bdy, to moemy ustawi punkt przerwania bezporednio przed tym wierszem
i uy programu uruchomieniowego do przeanalizowania wykonywanych instrukcji i biecych
wartoci zmiennych.
Aby ustawi punkt przerwania, kliknij szar kolumn wywietlon z lewej strony kod rdowego
testowanego programu. Pojawi si w niej czerwone kko oznaczajce, e wykonywanie programu
zostanie wstrzymane w danym wierszu. (Jeli w tym czerwonym kku pojawi si znak zapytania,
moe to wiadczy o tym, i testowanie nie zostao wczone w pliku konfiguracyjnym
web.config.) Przytrzymaj wskanik myszy w obrbie kka, a poniej zostanie wywietlona
dokadna lokalizacja punktu przerwania (patrz rysunek 20.19).
Rysunek 20.19. Ustawienie punktu przerwania spowoduje tymczasowe wstrzymanie
wykonywania programu we wskazanym miejscu

Teraz ponownie wywietl stron listing2007.aspx w przegldarce. Gdy realizacja programu dotrze
do ustawionego punktu przerwania, zostanie ona zatrzymana, a uaktywni si program
uruchomieniowy CLR.
Poniej menu gwnego programu uruchomieniowego CLR znajduj si elementy sterujce
umoliwiajce kontrol przebiegu wykonywania testowanej strony; pozwalaj ona, midzy innymi
na przejcie do nastpnej instrukcji programu lub zakoczenie testowania. Program
uruchomieniowy jest bardzo zoonym narzdziem o niezwykle rozbudowanych moliwociach.
Wicej informacji na jego temat mona znale w dokumentacji .NET SDK.
Testowanie skompilowanych aplikacji moe by procesem trudnym i nieprzyjemnym, gdy nie
mona przerwa wykonywania takiego programu bez utraty podanych w nim informacji, ani
obserwowa wartoci zmiennych w czasie jego dziaania. W znacznym stopniu utrudnia to
okrelanie miejsca w jakim pojawia si bd, zwaszcza jeli testowana aplikacja jest bardzo
zoona. Program uruchomieniowy CLR udostpnia wszystkie narzdzia konieczne do testowania
stron ASP.NET i sprawia, e proces ten staje si wyjtkowo prosty.

Notatka
Aplikacje ASP.NET nie s jedynymi aplikacjami, do ktrych mona docza program
uruchomieniowy CLR. Program ten mona docza i uy do testowania wszystkich
programw stworzonych w rodowisku .NET. (Oznacza to, e program ten moe suy
wycznie do testowania aplikacji napisanych w rodowisku .NET; nie mona go wykorzysta do
testowania aplikacji przeznaczonych dla systemu Windows 95.) Trzeba tylko pamita, e dana
aplikacja musi umoliwia testowanie czyli musi posiada konieczne pliki symboli.
Zalecenia zwizane z testowaniem aplikacji
ASP.NET udostpnia kilka rnych metod testowania aplikacji. Ale ktrej z nich naley uy i w
jakiej sytuacji?
Jeli nie wiemy w jakim miejscu wystpuj bdy, to najlepszym rozwizaniem bdzie
wykorzystanie mechanizmu ledzenia. W tym przypadku, do kodu aplikacji naley doda
wywoania metod Trace.Write oraz Trace.Warn i a nastpnie sprawdzi ktre z nich s
wykonywane, a ktre zostay pominite. Zazwyczaj metoda ta pozwala na dokadne okrelenie
miejsca wystpowania bdu, a dysponujc t wiedz bdziemy mogli go odpowiednio obsuy.
Instrukcje try oraz catch naley stosowa jeli nie jestemy pewni czy napisany fragment kodu
bdzie dziaa poprawnie oraz gdy informacje o bdach nie mog by widoczne dla uytkownika
kocowego. Instrukcje te pozwalaj na przechwytywanie bdw i ich obsug, dziki czemu
adne niepodane komunikaty nie bd wywietlane.
I w kocu ostatnim dostpnym rozwizaniem jest wykorzystanie programu uruchomieniowego
CLR. Naley si nim posugiwa gdy chcemy przeledzi proces realizacji programu podczas jego
dziaania. Dziki temu narzdziu moemy wykonywa aplikacje krokowo instrukcja po
instrukcji i sprawdza czy zmienne maj poprawne wartoci. Program uruchomieniowy CLR to
bardzo potne narzdzie, ktre niezwykle uatwia odnajdywanie i poprawianie bdw. Niemniej
jednak stosowanie go ma niekorzystne efekty uboczne, takie jak moliwo utraty danych oraz
rne koszty dodatkowe. Doczaj program uruchomieniowy do procesu, jego wykonywanie
zostaje zamroone co oznacza, e proces ten nie bdzie w stanie dziaa poprawnie; to z kolei
moe przysporzy problemw zarwno aplikacjom jak i korzystajcym z nich uytkownikom.

To nie jest ASP!


ASP.NET ma zdecydowanie wicej narzdzi ktre mona wykorzystywa przy testowania
aplikacji, ni tradycyjna wersja tej technologii. Wielu programistw uywajcych wczeniejszej
wersji ASP doskonale zna metod testowania polegajc na wykorzystaniu wywoa metody
Response.Write. Z metody tej take mona korzysta w ASP.NET.

Jednak ASP.NET udostpnia znacznie lepsze metody testowania aplikacji. Mechanizm ledzenia
udostpnia wiele informacji ktre mona wykorzysta do testowania oraz analizy efektywnoci
dziaania aplikacji. W tradycyjnej wersji technologii ASP najbliszym odpowiednikiem
mechanizmu ledzenia byo wykorzystanie wywoa metody Response.Write do wywietlania
informacji wykorzystywanych przez strony ASP.
Jak wiadomo strony ASP.NET s kompilowane. Daje to nam moliwo wykorzystania programu
uruchomieniowego CLR do analizy dziaania strony ASP.NET podczas ich wykonywania.
Program ten pozwala na obserwacj stanu aplikacji. W tradycyjnej technologii ASP nie istnia
aden odpowiednik tego narzdzia.
W porwnaniu z tradycyjn technologi ASP, narzdzia wspomagajce testowanie dostpne w
ASP.NET zostay w ogromnym stopniu rozbudowane i ulepszone. Teraz nie trzeba ogranicza si
do skpych moliwoci funkcjonalnych udostpnianych przez metod Response.Write, lecz
mona wykorzysta narzdzia testowe i uruchomieniowe z prawdziwego zdarzenia. W ten sposb
programici ASP.NET mog tworzy lepsze i bardziej niezawodne aplikacje.
Rozdzia 21.
Zabezpieczanie aplikacji
ASP.NET
Zagadnienia zwizane z bezpieczestwem aplikacji internetowych s niejednokrotnie trudne
zarwno dla programistw jak i uytkownikw kocowych; niemniej jednak w dzisiejszych
czasach s one niezwykle wane i nie mona ich pomija. Oglnie pojte bezpieczestwo aplikacji
internetowych wie si z sprawdzeniem tosamoci uytkownika (uwierzytelnianiem) oraz
okreleniem jego praw dostpu do zasobw (autoryzacj). W ASP.NET obie te czynnoci mona
wykonywa na wiele rnych sposobw, a co najwaniejsze, implementacja adnego z nich nie
jest szczeglnie trudna.
Technologia ASP.NET sprawia, e zabezpieczanie aplikacji jest cakiem atwe. Kiedy ju
zdobdzie si konieczn wiedz, implementacja odpowiednich mechanizmw zabezpieczajcych
w aplikacji nie przysporzy najmniejszych trudnoci.
W tym rozdziale zostan omwione nastpujce zagadnienia:
Czym jest bezpieczestwo aplikacji internetowych.
Obsuga mechanizmw zabezpiecze w systemie Windows.
Trzy rne sposoby uwierzytelniania oraz metody ich implementacji.
Sposoby kontroli dostpu do zasobw serwera.
Czy jest personifikacja oraz jak mona z niej korzysta.

Bezpieczestwo aplikacji internetowych


zagadnienia podstawowe
Przewaajca wikszo witryn WWW domylnie zezwala na anonimowy dostp do swoich
zasobw. Oznacza to, e kady kto dysponuje dostpem do Internetu moe wej na tak witryn i
przejrze umieszczone na niej strony WWW. Uytkownicy nie musz by uwierzytelniani, ich
tosamo nie musi by sprawdzana, a kady uytkownik dysponuje moliwoci obejrzenia
dowolnych plikw znajdujcych si na witrynie. Wyobramy sobie jednak, e prowadzimy
witryn, ktrej uytkownicy musz paci za moliwo ogldania stron na przykad, witryn
giedow udostpniajc profesjonalne analizy i porady. Bez adnych mechanizmw
zabezpieczajcych kady mgby wej na nasz witryn i zdoby bezcenne, publikowane na niej
porady i analizy. Bez wtpienia byoby to klsk dla firmy po c uytkownicy mieliby paci
za prawo dostpu do niej, skoro nie byoby to konieczne? Mechanizmy bezpieczestwa aplikacji
internetowych maj za zadanie ograniczanie praw dostpu do pewnych plikw i udzielanie go
wycznie okrelonym grupom uytkownikw.
Zamy, e pracujemy dla cile tajnej agencji rzdowej. Do holu budynku moe wej kady,
jednak dalej mog przej wycznie osoby, ktrych tosamo zostaa odpowiednio
potwierdzona. Otworzenie kadych drzwi w strzeonym kompleksie, take wymaga potwierdzanie
tosamoci, wykonywanego na podstawie analizy siatkwki oka.

Nowe wyraenie
Powyszy proces przedstawia podstawowy sposb dziaania mechanizmw zabezpieczajcy
stosowanych na WWW. Pierwszym krokiem jest uwierzytelnienie czyli proces okrelenia
tosamoci uytkownika dajcego dostpu do informacji. Tosamo uytkownikw okrelana
jest na podstawie odpowiednich informacji uwierzytelniajcych, ktre mog przyjmowa bardzo
rne postaci (najczciej jest to nazwa uytkownika oraz haso). Dziki uwierzytelnianiu mona
uzyska pewno, e uytkownik ktry przesa danie jest tym, za kogo si podaje. Jeli system
zabezpiecze nie bdzie w stanie okreli tosamoci uytkownika na podstawie przesanych
informacji uwierzytelniajcych, to proces uwierzytelniania nie zostanie wykonany poprawnie, a
anonimowy uytkownik nie uzyska dostpu do zasobw. Jeli jednak informacje uwierzytelniajce
oka si poprawne, to uytkownik uzyska dostp do systemu i zostanie mu przydzielona
odpowiednia tosamo.

Nowe wyraenie
Po okreleniu tosamoci uytkownika, system sprawdza do jakich zasobw moe on uzyska
dostp. Proces ten nazywany jest autoryzacj. Kontynuujc przykad tajnej agencji rzdowej,
mona zaoy, e niektre drzwi mog otwiera wycznie osoby dysponujce odpowiednimi
prawami dostpu. System okrela je na podstawie uprawnie nadanych konkretnej tosamoci
(czyli konkretnemu uytkownikowi). Dziki temu pracownik agencji moe dysponowa prawem
otwierania pewnych drzwi, jednak inne pozostan dla niego niedostpne. W przypadku WWW
oznacza to, e to od tosamoci uytkownika bdzie zaleao do jakich plikw bdzie on mia
dostp.

Nowe wyraenie
W kocu ostatnim etapem, jest personifikacja. System zabezpieczajcy budynku agencji rzdowej
mona sobie wyobrazi jako stranika. Ma on dostp do kadego pomieszczenia w budynku i
moe otwiera wszystkie znajdujce si w nim drzwi, a to wszystko bez koniecznoci
wykonywania analizy siatkwki. A teraz wyobramy sobie, e jaki chytry i inteligentny szpieg
wama si do tego systemu. Osoba taka uzyskaaby dostp do wszystkich pomieszcze w
budynku, a system bezpieczestwa nie speniby swego zadania.

Jako dodatkowy rodek zabezpieczajcy projektanci systemu zabezpieczajcego wprowadzili


mechanizm personifikacji. Gdy jaka osoba prbuje wej do budynku lub uy ktrego z
zainstalowanych w nim komputerw, stranik personifikuje t osob (czyli zaczyna j udawa)
ograniczajc tym samym swoje wasne uprawnienia.
Innymi sowy stranik chtnie rezygnuje ze swych wasnych moliwoci, aby wamywacz nie
mg ich wykorzysta. Mona by to porwna od generaa, ktry zaywa jakie tajemnicze piguki
dziki ktrej moe zapomnie wszystkie kluczowe informacje w razie gdyby zosta schwytany
przez nieprzyjaci. By moe pojcia te wydaj si nieco abstrakcyjne, jednak stan si znacznie
bardziej zrozumiae, gdy wykorzystanym je przy tworzeniu i zabezpieczaniu stron ASP.NET. Na
rysunku 21.1 zosta przedstawiony proces, jaki przechodzi uytkownik aby uzyska dostp do
zasobw systemowych.

Rysunek 21.1. Typowy protok bezpieczestwa


Opis rysunku
Supply Podanie danych uwierzytelniajcych uytkownika
Authenticated? Uwierzytelniony?
Yes Tak
No Nie
Try to Prba uzyskania dostpu do zasobw
Authorized? Autoryzowany?
Impersonate Personalizacja danej tosamoci

Oglnie rzecz biorc mechanizmy zabezpiecze w ASP.NET s implementowane przy


wykorzystaniu dwch rnych metod. Mona uwierzytelnia i autoryzowa uytkownikw przy
wykorzystaniu kont uytkownikw systemu operacyjnego (za porednictwem moliwoci serwera
IIS) lub te mona porwnywa dane uytkownika z prawami dostpu okrelonymi w rdach
danych (na przykad, za pomoc plikw konfiguracyjnych web.config). Wykorzystanie pierwszej z
tych metod wymaga bardzo niewielkiej pracy i wprowadzenia jedynie nieznacznych modyfikacji
w kodzie stron ASP.NET. Jednak z drugiej strony, metoda ta daje mniejsz kontrol nad
przebiegiem procesu uwierzytelniania. Z kolei druga metoda jest przeciwiestwem pierwszej
wymaga znacznego wkadu pracy lecz daje znacznie wiksze i bardziej elastyczne moliwoci.
Obie te metody zostan szczegowo omwione w dalszej czci rozdziau.

Zabezpieczenie w systemie Windows


Nowe wyraenie
System operacyjny Windows dysponuje mechanizmami zabezpiecze bazujcymi na rolach.
Rola okrela typ tosamoci. Na przykad, jeli jeste sprawujesz piecz nad systemem
komputerowym firmy oraz odpowiadasz za instalacj sprztu i oprogramowania, to znaczy e
dziaasz w roli administratora. Jeli kto bdzie jedynie chcia przejrze jakie strony WWW, to
bdzie wystpowa w roli gocia (gocia w odniesieniu do zasobw komputera). Role okrelaj
w jakim stopniu dana tosamo moe kontrolowa komputer oraz jakimi uprawnieniami
dysponuje.
Zazwyczaj z rolami jest skojarzonych kilka tosamoci. Na przykad, Twoim komputerem moe
si opiekowa kilka osb, czyli moe by kilku administratorw. Moe take Ty jeste jednym z
nich? W systemie Windows te tosamoci s okrelane jako uytkownicy.
Przyjrzyjmy si uytkownikom dostpnym na Twoim komputerze. W systemie Windows 2000
kliknij przycisk Start i wybierz z menu opcj ProgramyNarzdzia
administracyjneZarzdzanie komputerem. W wywietlonym oknie, na hierarchicznej licie
wywietlonej z jego lewej strony zaznacz opcj Narzdzia systemoweUytkownicy i grupy
lokalneUytkownicy (patrz rysunek 21.2). Na ekranie powinno si pojawi okno podobne do
tego, przedstawionego na rysunku 21.2.
Rysunek 21.2. Lista uytkownikw w systemie Windows 2000.

Jak wida na powyszym rysunku, w prawej czci okna zostaa wywietlona lista wszystkich
uytkownikw zdefiniowanych w systemie. By moe zauwaysz na niej kilku, o ktrych istnieniu
nic nie wiedziae! Aby wywietli list wszystkich zdefiniowanych w systemie grup, naley
klikn opcj Uytkownicy i grupy lokalneGrupy z lewej strony okna Zarzdzanie komputerem.
Jeli chcesz sprawdzi jacy uytkownicy nale do jakiej grupy, kliknij j dwa razy w
wywietlony oknie dialogowym pojawi si lista wszystkich uytkownikw nalecych do danej
grupy.

Podpowied
Jedn z czsto stosowanych i atwych metod zabezpieczania jest usunicie wszystkich
nieznanych uytkownikw wywietlonych na rysunku 21.2. Naley jednak zachowa du
ostrono, aby nie usun wasnego uytkownika ani adnego z uytkownikw systemowych.

Przewi list ku doowi, a pojawi si na niej uytkownik o nazwie IUSR_NazwaKomputera. To


domylna tosamo z ktrej bd korzystali uytkownicy uywajcy danego komputera za
porednictwem lokalnego serwera WWW. Jest to konto anonimowe, co oznacza, e aby
wykorzysta go do uzyskania dostpu do zasobw komputera, nie trzeba podawa adnego hasa.
Z tego powodu domylne uprawnienia jakimi dysponuje ta tosamo s minimalne.
Zwr uwag, i w tym miejscu nie mona okrela praw dostpu jakimi bdzie dysponowa dana
tosamo. Wicej informacji na ten temat zostanie podanych w dalszej czci rozdziau, pt.:
Autoryzacja.

Uwierzytelnianie
W technologii ASP.NET uwierzytelnianie jest implementowane za porednictwem tak zwanych
dostawcw uwierzytelnie (ang.: authentication providers), czyli moduw zawierajcych kod
sucy do uwierzytelniania da przesyanych przez klienty WWW. Dziaanie tych moduw
jest kontrolowane za porednictwem plikw konfiguracyjnych web.config, a konkretnie za pomoc
umieszczanych w nich znacznikw authentication. Podstawowy sposb zapisu tych
znacznikw zosta przedstawiony na poniszym przykadzie:
<configuration>
<system.web>
<authentication mode="tryb">
</authentication>
</system.web>
</configuration>

Wewntrz znacznikw authentication mona dodatkowo umieci elementy form oraz


credentials. Wicej informacji na ich temat znajdziesz w dalszej czci rozdziau, pt.:
Uwierzytelnianie za porednictwem formularza.

Ostrzeenie
Znacznik authentication mona stosowa wycznie w pliku web.config umieszczonym na
gwnym poziomie witryny. Prba uycia tego znacznika w plikach web.config umieszczonych w
jakimkolwiek innym folderze witryny zakoczy si zgoszeniem bdu.

Technologia ASP.NET udostpnia trzy metody (zwane take modelami) uwierzytelniania


uytkownikw uwierzytelnianie systemu Windows, uwierzytelnianie przy wykorzystaniu
usugi Passport oraz uwierzytelnianie za porednictwem formularzy. Kada z nich zostaa
zaimplementowana przez innego dostawc uwierzytelnie. Pierwsza z tych metod jest realizowana
przy wykorzystaniu serwera IIS i nie wymaga adnych (lub bardzo niewielkich) modyfikacji w
tworzonych stronach ASP.NET. Pozostae dwie metody uwierzytelnianie za porednictwem
formularzy oraz uwierzytelnianie przy uyciu usugi Passport s bardzo podobne. Pierwsza z
nich jest implementowana na serwerze na jakim dziaa aplikacja, a druga jako patna usuga
wiadczona przez firm Microsoft. Wszystkie te trzy metody zostan szczegowo omwione w
kolejnych czciach rozdziau.

Uwierzytelnianie systemu Windows


Gdy klient przesya danie dotyczce jakiej strony ASP.NET w pierwszej kolejnoci jest ono
odbierane przez serwer WWW, a konkretnie Internet Information Server (IIS). Po odebraniu
dania serwer IIS moe uwierzytelni uytkownika bd pozostawi przeprowadzenie
uwierzytelnienia w gestii aplikacji ASP.NET. Jeli to serwer bdzie uwierzytelnia uytkownika,
to jest on w stanie porwna jego dane uwierzytelniajce bezporednio z informacjami jakimi
dysponuje system operacyjny (Windows 2000 lub Windows NT). Schemat uwierzytelnienia
wykonywanego przez IIS zosta przedstawiony na rysunku 21.3.

Rysunek 21.3. Schemat zabezpiecze ASP.NET


Opis rysunku
Client Klient
Browser Przegldarka
Request danie
Server Serwer
IIS IIS
ASP.NET ASP.NET
.NET Framework rodowisko .NET
Windows NT/2000 Windows NT/2000

Notatka
Serwer IIS nie wymaga przeprowadzania uwierzytelniania. Serwer moe przekazywa
wszystkie odbierane dania bezporednio do aplikacji, co sprawi, e to strony ASP.NET bd
odpowiedzialne za uwierzytelnienie uytkownika. Wszyscy uytkownicy, ktrym IIS pozwala na
dostp do zasobw serwera bez potwierdzenia ich tosamoci, okrelani s jako uytkownicy
anonimowi.

Tosamoci wykorzystywane przez IIS s okrelane przez konta uytkownikw systemu


Windows. To wanie z tego powodu ten sposb uwierzytelniania okrelany jest jako
uwierzytelnianie systemu Windows. Te konta uytkownikw systemu Windows przypominaj
nieco role przedstawione na rysunku 21.2. W tym przypadku klienci WWW dysponuj takimi
samymi uprawnieniami co uytkownicy i role systemu Windows. Na przykad, jeli klient peni
rol administratora, to bdzie on mia prawo wprowadzania dowolnych modyfikacji w systemie
plikw, czyli take do usuwania i przenoszenia plikw.
Aby wykorzysta ten sposb uwierzytelniania, naley umieci poniszy znacznik w pliku
konfiguracyjnym web.config:
<authentication mode="Windows" />

Serwer IIS uywa trzech rnych typw uwierzytelniania systemu Windows podstawowego
(Basic), bazujcego na skrtach (Digest) oraz NTLM (okrelanego take jako zintegrowane
uwierzytelnianie Windows, ang: Integrated Windows Authentication). Zobaczmy teraz jak dziaa
kady z tych trzech typw uwierzytelniania systemu Windows oraz jak mona go
zaimplementowa w aplikacjach ASP.NET.
Uwierzytelnianie podstawowe (Basic) jest najprostsz metod uwierzytelniania. Jej moliwoci s
tak ograniczone i, na dobr spraw, nie rni si ona od braku wykorzystania jakichkolwiek
mechanizmw uwierzytelniajcych. By moe, odwiedzajc witryny WWW, spotkae si ju z t
metod uwierzytelniania. Jest ona bowiem standardowym sposobem pobierania danych
uwierzytelniajcych do uytkownikw i stanowi element specyfikacji protokou HTTP
opracowanej przez konsorcjum W3C. Poniej zosta opisany przebieg uwierzytelniania
podstawowego:
1. Klient przesya na serwer danie dotyczce chronionego zasobu.
2. Serwer WWW przesya odpowied zawierajc nagwek 401 Unauthorized.
3. Przegldarka WWW odbiera t odpowied i prosi uytkownika o podanie danych
uwierzytelniajcych zazwyczaj jest to nazwa uytkownika i haso.
4. Przegldarka ponownie prbuje uzyska dostp do zasobu serwer posugujc si przy tym
podanymi przez uytkownika danymi uwierzytelniajcymi.
5. Jeli dane uwierzytelniajce nie s poprawne, to cay proces rozpoczyna si ponownie od
etapu 2.
6. Jeli uda si potwierdzi tosamo uytkownika, przegldarka uzyskuje dostp do
danego zasobu (lub zasobw).

A zatem zabezpieczmy co! Pierwszym krokiem bdzie uruchomienie Menedera usug


internetowych. W tym celu kliknij przycisk Start i wybierz opcj UstawieniaPanel sterowania;
w wywietlonym oknie dwukrotnie kliknij ikon Narzdzia administracyjne, a w kolejnym oknie
ikon Meneder usug internetowych. W wywietlonym oknie Internet Information Services
rozwi hierarchiczn list wywietlon z jego lewej strony i zaznacz opcje Domylna witryna sieci
Web. Teraz wybierz folder (lub katalog wirtualny) ktry chcesz zabezpieczy (my zabezpieczymy
folder /aspnetdlakazdego/rozdzial21; jeli to konieczne to stwrz go w folderze
c:\inetpub\wwwroot). Teraz kliknij wybrany folder prawym przyciskiem myszy i z menu
kontekstowego wybierz opcj Waciwoci (patrz rysunek 21.4.).
Rysunek 21.4. Wywietlanie waciwoci folderu w Menaderze usug internetowych

W wywietlonym oknie dialogowym, na zakadce Katalog, zaznacz pole wyboru Przegldanie


katalogw; dziki temu bdziemy wiedzie kiedy proces uwierzytelnienia uytkownika zakoczy
si pomylnie. Nastpnie przejd na zakadk Zabezpieczenia katalogw i kliknij przycisk Edytuj
w sekcji Dostp anonimowy i kontrola uwierzytelnienia. Na ekranie powinno si pojawi okno
dialogowe przedstawione na rysunku 21.5.
Rysunek 21.5. Okrelanie waciwoci uwierzytelniania

Jeli jest zaznaczone pole wyboru Dostp anonimowy, to usu z niego znacznik. Dostp
anonimowy sprawia, e kady uytkownik ma prawo pobra dowolne zasoby znajdujce si w
danym katalogu, a w przypadku naszej aplikacji nie chcemy aby byo to moliwe. Nastpnie
zaznacz pole wyboru Uwierzytelnienie podstawowe (i usu znacznik z pola Zintegrowane
uwierzytelnienie systemu Windows).
Po zmodyfikowaniu ustawie zamknij oba okna dialogowe klikajc przycisk OK w kadym z nich.
Teraz wpisz w przegldarce nastpujcy adres URL:
http://localhost/aspnetdlakazdego/rozdzial21
Na ekranie powinno si pojawi okienko dialogowe przedstawione na rysunku 21.6; naley w nim
poda informacje, ktre zostan uyte do uwierzytelnienia uytkownika.

Rysunek 21.6. Po wczeniu uwierzytelniania podstawowego przegldarka prosi o podanie


informacji o uytkowniku
W powyszym okienku dialogowym wpisz informacje o dowolnym koncie uytkownika
zdefiniowanym na lokalnym komputerze (na przykad od koncie ktrego uywasz aby zalogowa
si na ten komputer). IIS porwna podane informacje z list uytkownikw systemu operacyjnego
i uwierzytelni lub odrzuci danie. Jeli poprawno podanych informacji zostanie potwierdzona,
to w przegldarce powinna pojawi si strona przedstawiona na rysunku 21.7.

Rysunek 21.7. Po uwierzytelnieniu uytkownika zostaje wywietlona strona z zawartoci


folderu

Notatka
Po pomylnie wykonanym uwierzytelnieniu uytkownika, aby skorzysta z innego uytkownika i
hasa, bdziesz musia ponownie uruchomi przegldark, zada strony i poda nowe dane
uwierzytelniajce. Przegldarka zapamituje bowiem te informacje i uywa ich a do momentu
zamknicia programu. Oznacza to, e otworzenie nowego, kolejnego okna przegldarki nie
wystarczy jeli chcesz poda nowe dane uwierzytelniajce.

W przypadku uwierzytelniania podstawowego nazwa uytkownika oraz hasa wpisywane w


okienku dialogowym przedstawionym na rysunku 21.6. s przesyane na serwer w postaci
zwyczajnego tekstu. To efektywny lecz niezbyt bezpieczny sposb przeprowadzania
uwierzytelniania. Inteligentny hacker moe przej wiadomo nim ta dotrze na serwer i
wykorzysta zapisane w niej informacje, aby uzyska dostp do systemu.
Uwierzytelnianie bazujce na skrtach dziaa podobnie jak uwierzytelnianie podstawowe, z tym e
zarwno nazwa uytkownika jak i haso s szyfrowane przed wysaniem. Wykorzystywany
algorytm szyfrujcy, nazywany funkcj skrtu, modyfikuje informacje w taki sposb i nie mona
ich odszyfrowa. Proces ten jest wycznie jednokierunkowy:
1. Klient da dostpu do chronionego zasobu, a serwer przesya w odpowiedzi prob o
uwierzytelnienie.
2. Serwer przesya odpowied o "401 Unauthorized".
3. Przegldarka WWW odbiera t odpowied i prosi uytkownika o podanie danych
uwierzytelniajcych. Nastpnie przegldarka dodaje do nich nieco cakowicie losowych
informacji i szyfruje je. Dziki tym unikalnym informacjom mona zapewni, e nikt nie
bdzie w stanie skopiowa kodu skrtu i wykorzysta go do uzyskania dostpu do
systemu w pniejszym czasie.
4. Przegldarka przesya na serwer zaszyfrowane informacje uwierzytelniajce oraz
niezaszyfrowan kopi dodatkowych informacji. Serwer wykorzystuje te dodatkowe
informacje do zaszyfrowania posiadanych przez niego danych uwierzytelniajcych (czyli
informacji o uytkowniku systemu Windows).
5. Serwer porwnuje utworzone przez siebie zaszyfrowane dane uwierzytelniajce z danymi
przesanymi przez przegldark.
6. Jeli obie porwnywane informacje nie s identyczne, danie nie zostaje
uwierzytelnione i cay proces rozpoczyna si ponownie od punktu 3.
7. W przypadku poprawnego uwierzytelnienia dania przegldarka uzyskuje dostp do
odpowiedniego zasobu.
Aby umoliwi wykorzystanie tej metody uwierzytelniania naley zaznaczy pole wyboru
Uwierzytelnienie skrcone dla serwerw domeny systemu Windows (patrz rysunek 21.5) (naley
zwrci uwag, i opcja ta jest dostpna wycznie wtedy, gdy serwer bdzie podczony do
domeny). Dodatkowo naley si upewni, e nie jest zaznaczone pole wyboru Dostp anonimowy.
I w kocu, w przypadku zastosowania ostatniej metody uwierzytelniania NTLM nigdy nie
jest wywietlane adne okienko dialogowe, w ktrym uytkownik mgby poda dane
uwierzytelniajce. Nie jest to konieczne, gdy gdy tylko przegldarka nawie kontakt z serwerem
przesya do niego zaszyfrowane informacje, ktre uytkownik poda przy logowaniu si do
systemu. Po otrzymaniu tych informacji serwer przetwarza je i sprawdza czy dany uytkownik
powinien uzyska dostp do danego zasobu.
Wykorzystanie tej metody uwierzytelniania te mona wczy w oknie dialogowym Metody
uwierzytelnienia przedstawionym na rysunku 21.5. Trzeba jednak wiedzie, i ta metoda
uwierzytelniania dziaa wycznie wtedy, gdy zarwno klient jak i serwer dziaaj w systemie
operacyjnym Windows. Warto take zauway, i jeli zaznaczymy kilka metod uwierzytelniania,
to ta najbardziej restrykcyjna bdzie miaa najwikszy priorytet (na przykad, zintegrowane
uwierzytelnianie systemu Windows zostanie wykorzystane zamiast dostpu anonimowego).
Zazwyczaj zintegrowane uwierzytelnianie sytemu Windows jest wykorzystywane w tych
przypadkach gdy chcemy uy prostej w implementacji metody uwierzytelniania, ktra wymaga
jak najmniejszych modyfikacji w kodzie stron ASP.NET. W takim przypadku wystarczy bowiem
wybra odpowiednie ustawienia konfiguracyjne w serwerze IIS.
Zarwno uwierzytelnianie bazujce na skrtach jak i zintegrowane uwierzytelnianie systemu
Windows wymagaj, aby uytkownik korzysta z przegldarki Microsoft Internet Explorer, co
oznacza i przed wykorzystaniem ktrejkolwiek z tych metod konieczne bdzie skonsultowanie
si z uytkownikami aplikacji. Co wicej, uwierzytelnianie bazujce na skrtach dziaa wycznie
na niektrych typach serwerw; wicej informacji na ten temat mona znale w artykule:
http://support.microsoft.com/support/kb/articles/q222/0/28.asp

Uwierzytelnianie za porednictwem formularza


Technologia ASP.NET daje moliwo realizacji uwierzytelniania nie za porednictwem serwera
IIS, lecz tworzonej aplikacji ASP.NET. Jest to moliwe dziki wykorzystaniu mechanizmu
okrelanego jako uwierzytelnianie za porednictwem formularzy. Mechanizm ten daje znacznie
wiksz kontrol nad uywanym sposobem uwierzytelniania. Na przykad, dane uwierzytelniajce
uytkownikw mog by przechowywane w bazie danych lub w pliku XML; nie musi nimi wcale
zarzdza bezporednio system operacyjny Windows.
Przy wykorzystaniu tej metody uwierzytelniania uytkownicy s kierowani do specjalnego
formularza wchodzcego w skad aplikacji ASP.NET, ktry suy do podawania informacji
uwierzytelniajcych. Nastpnie aplikacja przeprowadza uwierzytelnienie uytkownika przy uyciu
algorytmu okrelonego przez jej twrc. Jeli dane zostan zaakceptowane, to ASP.NET tworzy
specjalne cookie autoryzacyjne, ktre jest nastpnie przesyane i zapamitywane na komputerze
uytkownika (wicej informacji na temat cookies mona znale w rozdziale 4, pt.: Stosowanie
obiektw ASP.NET w jzykach C# i VB.NET). Cookie to zawiera bd to zapisane w dowolnej
postaci informacje uwierzytelniajce, bd te acuch znakw, ktry umoliwi pniejsze
pobranie danych uwierzytelniajcych. Informacje zapisane w tym cookie bd nastpnie uywane
do uwierzytelniania uytkownika w caej aplikacji. Poniej opisany zosta przebieg caego procesu
uwierzytelniania przy wykorzystaniu formularza:
1. Klient da dostpu do chronionej strony.
2. Jeli wraz z daniem nie zostao przesane wane cookie uwierzytelniajce, to serwer
przekierowuje przegldark pod adres URL okrelony w atrybucie loginURL dyrektywy
Authentication zapisanej w pliku konfiguracyjnym web.config. Pod podanym
adresem powinien znajdowa si formularz sucy do logowania uytkownikw.
3. Uytkownik podaje dane uwierzytelniajce w formularzu, a nastpnie wysya go (dane s
przesyane na serwer metod POST).
4. Jeli dane uwierzytelniajce podane przez uytkownika s poprawne (co mona okreli
na kilka rnych sposobw, o ktrych bdzie mowa w dalszej czci rozdziau), to
ASP.NET tworzy cookie uwierzytelniajce i przesya je do klienta.
5. Teraz uytkownik moe zosta przekierowany do strony, ktr chcia wywietli.
Proces ten zosta zilustrowany na rysunku 21.8.

Rysunek 21.8. Sposb dziaania uwierzytelniania za porednictwem formularza


Opis rysunku
Client request Uytkownik zgasza danie
IIS IIS
Allow through Zezwala na przekazanie dania
Allow access Uytkownik uzyskuje prawo dostpu do zasobu
Yes Tak
No Nie
Is authorized Czy jest dostpne cookie autoryzacyjne?
Direct user Przekierowanie uytkownika do formularza logowania
User Pobranie danych uwierzytelniajcych
Authenticated? Czy uwierzytelniony?
Deny Brak dostpu do zasobu
Set Stworzenie cookie uwierzytelniajcego

Po utworzeniu cookie uwierzytelniajcego wszystkie dania przesyane przez danego


uytkownika bd automatycznie uwierzytelniane a do momentu zamknicia przegldarki i
zakoczenia sesji. Po zakoczeniu sesji, jeli uytkownik ponownie sprbuje uzyska dostp do
chronionych zasobw, bdzie si musia ponownie zalogowa. Jak si wkrtce przekonamy,
istnieje take moliwo by cookie uwierzytelniajce nie byo usuwane. Dziki temu, jeli
uytkownik cho raz si zaloguje i zostanie poprawnie uwierzytelniony, ju nigdy nie bdzie
musia logowa si ponownie.
Przyjrzymy si teraz ustawieniom jakie naley poda w pliku konfiguracyjnym web.config, aby
wykorzysta autoryzacj za porednictwem formularza.
<configuration>
<system.web>
<authentication mode="Forms">
<forms name="nazwa" loginUrl="adresFormularzaLogowania" />
</authentication>
</system.web>
</configuration>

Trzeci wiersz powyszego fragmentu kodu informuje, e wykorzystywana jest autoryzacja


realizowana za porednictwem formularza. W kolejnym, czwartym wierszu okrelana jest nazwa
cookie autoryzacyjnego oraz adres URL strony zawierajcej formularz sucy do logowania
uytkownikw.
Nadszed czas, aby przedstawi odpowiedni przykad. Dla folderu /aspnetdlakazdego/rozdzial21
wycz wszystkie metody uwierzytelniania realizowanego przez IIS i zezwl na dostp
anonimowy (informacje na temat tego jak naley to zrobi, zostay podane we wczeniejszej
czci rozdziau, pt.: Uwierzytelnianie systemu Windows). Nastpnie, w gwnym folderze
aplikacji (w naszym przypadku jest to /aspnetdlakazdego) umie plik konfiguracyjny web.config i
dopisujc do niego poniszy fragment kodu (pamitaj aby umieci go w odpowiedniej sekcji
konfiguracyjnej patrz poprzedni przykad).
<authenticate mode="Forms">
<forms name="AuthCookie" loginUrl="rozdzial21/login.aspx" />
</authenticate>

W przypadku poprawnego uwierzytelnienia uytkownika, zostanie utworzone cookie o nazwie


AuthCookie. Jeli wraz z daniem nie zostanie przesane cookie o tej nazwie, to uytkownik
zostanie przekierowany na stron rozdzial21/login.aspx, ktra powinna zawiera formularz
sucy do logowania. Kolejnym krokiem bdzie utworzenie strony login.aspx. Jej kod zosta
przedstawiony na listingu 21.1.

Listing 21.1. Prosty formularza do logowania.


1 <%@ Page Language="VB" %>
2
3 <script runat="server">
4 sub Login(obj as object, e as eventargs)
5 if tbUserName.Text = "clpayne" and _
6 tbPassword.Text = "hello" then
7 FormsAuthentication.SetAuthCookie("clpayne", false)
8
9 Response.redirect("account.aspx")
10 else
11 lblMessage.Text = "<font color=red>Przykro mi, " & _
12 "nieprawidowa nazwa uytkownika lub haso!</font><p>"
13 end if
14 end sub
15 </script>
16
17 <html><body>
18 Prosz poda nazw uytkownika i haso.<p>
19
20 <form runat="server">
21 <asp:Label id="lblMessage" runat="server" />
22
23 Nazwa uytkownika:
24 <asp:Textbox id="tbUserName" runat="server" /><br>
25 Haso:
26 <asp:Textbox id="tbPassword" TextMode="password"
27 runat="server" /><p>
28 <asp:Button id="Submit" runat="server"
29 OnClick="Zaloguj"
30 Text="Submit" />
31 </form>
32 </body></html>

Analiza
Formularz przedstawiony na powyszym listingu umoliwia uytkownikom podawanie swojej
nazwy oraz hasa. Informacje te wpisywane s w polach tekstowych definiowanych w wierszach
od 24. do 27. Po przesaniu formularza wykonywana jest procedura Login, ktra sprawdza
podane informacje i okrela czy s one poprawne. Nasza strona jest jedynie bardzo prostym
przykadem uwierzytelniania, a zatem, w 5. wierszu porwnujemy podan nazw i haso z
zakodowanymi wartociami. Jeli wartoci bd sobie odpowiada, to uytkownik zostanie
uwierzytelniony. W wierszu 7. wywoywana jest metoda SetAuthCookie obiektu
FormsAuthentication. Tworzy ona cookie uwierzytelniajce zawierajce podan nazw
uytkownika, przekazan jako pierwszy argument wywoania metody. Drugi argument wywoania
tej metody okrela czy cookie autoryzacyjne powinno zosta usunite po zamkniciu przegldarki
czy te nie. Podanie wartoci true spowoduje e cookie nie bdzie usuwane, a uytkownik nie
bdzie musia logowa si nawet po ponownym uruchomieniu przegldarki. W kocu, w wierszu
9. przegldarka uytkownika zostaje przekierowana pod waciwy adres.
Jeli dane uwierzytelniajce podane w formularzu nie s poprawne, to instrukcja else zapisana w
wierszu 10. wywietli stosowny komunikat o bdzie. Na rysunku 21.9 zostay przedstawione
wyniki wykonania tej strony w przypadku podania nieprawidowych danych uwierzytelniajcych.

Rysunek 21.9. Wyniki dziaania formularza uwierzytelniajcego po podaniu nieprawidowych


informacji.

Notatka
Podczas uwierzytelniania informacje wpisane przez uytkownika nie musz by porwnywane z
danymi podanymi na stae (tak jak w ostatnim przykadzie). W metodzie Login mona
zaimplementowa dowolny sposb weryfikacji poprawnoci danych w tym take
wykorzystujcy informacje przechowywane w bazie danych.

Oprcz elementu forms w pliku konfiguracyjnym mona take umieszcza element


credentials. Zawieraj one nazwy uytkownikw oraz odpowiadajce im hasa, ktre naley
wykorzysta przy uwierzytelnianiu uytkownikw. Dziki temu mona porwnywa informacje
uwierzytelniajce podane przez uytkownika z danymi przechowywanymi w pliku
konfiguracyjnym web.config. Cay proces wyglda bardzo podobnie do tego z listingu 21.1, lecz
jest wykonywany automatycznie.
Zmodyfikujmy plik web.config w poniszy sposb:
<configuration>
<system.web>
<authentication mode="Forms">
<forms name="AuthCookie" loginUrl="rozdzial21/login.aspx">
<credentials passwordFormat="Clear">
<user name="clpayne" password="helloworld" />
</credentials>
</forms>
</authentication>
</system.web>
</configuration>

Sekcja credentials zawiera poprawne informacje o uytkownikach, ktre powinne zosta


wykorzystane przy uwierzytelnianiu da. Atrybut passwordFormat okrela sposb
szyfrowania danych uwierzytelniajcych, jaki powinien zosta wykorzystany przy ich przesyaniu
na serwer. Atrybut ten moe przyjmowa nastpujce wartoci: Clear (dane nie s szyfrowane),
MD5 lub SHA1 (obie te wartoci okrelaj doskonale znane algorytmy szyfrujce). Jeli uytkownik
korzysta z nowoczesnej wersji przegldarki, to przy przesyaniu danych uwierzytelniajcych
bdzie mona wykorzysta kad z metod szyfrowania.
Wewntrz sekcji credentials umieszczane s elementy user. Kady z nich zawiera dwa
atrybuty name oraz password (okrelaj one odpowiednio nazw uytkownika oraz haso,
ktre naley uy w procesie uwierzytelniania). Naley zwrci uwag, i nie ma adnych
ogranicze co do iloci uytych elementw user. Na listingu 21.2 zostaa przedstawiona strona
ASP.NET uwierzytelniajca dania na podstawie danych zapisanych w sekcji credentials
pliku konfiguracyjnego web.config.

Listing 21.2. Uwierzytelnianie przy wykorzystaniu informacji zapisanych w sekcji


credentials w pliku web.config (login2.aspx)
1 <%@ Page Language="VB" %>
2
3 <script runat="server">
4 sub Login(obj as object, e as eventargs)
5 if FormsAuthentication.Authenticate(tbUserName.Text, _
6 tbPassword.Text) then
7 FormsAuthentication.SetAuthCookie(tbUsername.Text, false)
8
9 lblMessage.Text = "<font color=red>Udao si!</font><p>"
10 else
11 lblMessage.Text = "<font color=red>Przykro mi, " & _
12 "nieprawidowa nazwa uytkownik lub haso!</font><p>"
13 end if
14 end sub
15 </script>
16
17 <html><body>
18 Prosz poda nazw uytkownika i haso.<p>
19
20 <form runat="server">
21 <asp:Label id="lblMessage" runat="server" />
22
23 Nazwa uytkownika:
24 <asp:Textbox id="tbUserName" runat="server" /><br>
25 Haso:
26 <asp:Textbox id="tbPassword" TextMode="password"
27 runat="server" /><p>
28 <asp:Button id="btSubmit" runat="server"
29 OnClick="Login"
30 Text="Zaloguj" />
31 </form>
32 </body></html>

Analiza
Powyszy formularz jest bardzo podobny do formularza z poprzedniego listingu, zawiera
dokadnie te same elementy sterujce oraz procedur obsugi zdarzenia. Oba przykady rni si
w zasadzie wycznie kodem umieszczonym w wierszu 5. W tym przypadku, dane
uwierzytelniajce s porwnywane nie z informacjami podanymi na stae (jak byo w poprzednim
przypadku) lecz zostaj one przekazane do metody Authenticate obiektu
FormsAuthentication. Metoda ta wymaga podania dwch argumentw nazwy uytkownika
oraz hasa ktre nastpnie porwnuje z informacjami zapisanymi w sekcji credentials pliku
konfiguracyjnego web.config. Jeli dane uwierzytelniajce przesane z formularza odpowiadaj
informacjom podanym w ktrymkolwiek z elementw user, to metoda Authenticate zwrci
warto true; w takim przypadku mona stworzy cookie uwierzytelniajce (patrz wiersz 7.). Jak
zatem wida, plik konfiguracyjny web.config udostpnia bardzo atwy sposb definiowania
uytkownikw.
Klasa FormsAuthentication, z ktrej korzystalimy w dwch ostatnich przykadach udostpnia
wiele dodatkowych metod ktrych mona uy przy uwierzytelnianiu uytkownikw oraz kontroli
etonw uwierzytelniajcych. Poznalimy ju dwie metody tej klasy Authenticate oraz
SetAuthCookie, ktrymi posugiwalimy si w poprzednich przykadach.

Gdy uytkownik da dostpu do chronionej strony, mechanizmy ASP.NET automatycznie


przekieruj jego przegldark pod adres URL podany w atrybucie loginUrl elementu
konfiguracyjnego forms. W przypadku przekierowania adres URL strony ktrej pocztkowo
dotyczyo danie zostaje zapisany w acuchu zapytania, dziki czemu bdzie go mona pniej
uy. Jak na razie warto ta bya przez nas cakowicie ignorowana, jednak po poprawnym
uwierzytelnieniu uytkownika mona jej uy do przekierowania jego przegldarki pod waciwy
adres.
Metoda RedirectFromLoginPage klasy FormsAuthentication przypomina metod
SetAuthCookie take tworzy cookie uwierzytelniajce, lecz dodatkowo powoduje take
przekierowanie przegldarki uytkownika pod adres URL, ktrego pocztkowo dotyczyo danie.
Jeli w acuchu zapytania nie zostay zapisane informacje o danej stronie, to metoda ta
przekieruje przegldark uytkownika na stron default.aspx znajdujc si w gwnym folderze
aplikacji. Na przykad, procedur Login z listingu 21.2 mona by zmieni w nastpujcy sposb:
1 sub Login(obj as object, e as eventargs)
2 if FormsAuthentication.Authenticate(tbUserName.Text, _
3 tbPassword.Text) then
4 FormsAuthentication.RedirectFromLoginPage _
5 (tbUsername.Text, false)
6
7 lblMessage.Text = "<font color=red>Udao si!</font><p>"
8 else
9 lblMessage.Text = "<font color=red>Przykro mi, " & _
10 "nieprawidowa nazwa uytkownik lub haso!</font><p>"
11 end if
12 end sub

Jeli zadamy tej strony bezporednio, to po pomylnym uwierzytelnieniu uytkownika zostanie


wywietlona strona default.aspx. Nie mona zatem o niej zapomnie! Metoda
RedirectFromLoginPage jest przydatna do przesyania uytkownikw na stron ktr chcieli
ogldn jednak brakuje jej moliwoci wykonania jakichkolwiek czynnoci po stworzeniu cookie
uwierzytelniajcego. Aby wygenerowa cookie uwierzytelniajce i pobra adres strony ktrej
pocztkowo dotyczyo danie bez przechodzenia do niej, mona uy metody GetRedirectURL:
dim strURL = FormsAuthentication.GetRedirectURL("uzytkownik", false)

Klasa FormsAuthentication udostpnia take inn przydatn metod GetAuthCookie.


Tworzy ona obiekt klasy HttpCookie zawierajcy informacje uwierzytelniajce (wicej
informacji na temat klasy HttpCookie mona znale w rozdziale 4.). Metoda ta nie powoduje
jednak wygenerowania tego cookie i zapamitania go na komputerze uytkownika. Ma ona jednak
t zalet, i pozwala na wykonanie jakich czynnoci po utworzeniu cookie autoryzacyjnego i
przed jego przekazaniem do przegldarki uytkownika. Na przykad, wykorzystujc j mona
doda do cookie uwierzytelniajcego jakie dowolne, dodatkowe informacje. Nie mona jednak
zapomina o wygenerowaniu cookie po zakoczeniu wykonywania dodatkowych czynnoci. Jeli
tego nie zrobimy, to uytkownik nie zostanie uwierzytelniony. Stosowny przykad przedstawiony
zosta na listingu 21.3.

Listing 21.3. Wykorzystanie metody GetAuthCookie do wzbogacenia informacji


przechowywanych w cookie uwierzytelniajcym.
1 <%@ Page Language="VB" %>
2
3 <script runat="server">
4 sub Login(obj as object, e as eventargs)
5 if FormsAuthentication.Authenticate(tbUserName.Text, _
6 tbPassword.Text) then
7
8 dim cookie as HttpCookie
9
10 cookie = FormsAuthentication.GetAuthCookie("clpayne", false)
11 cookie.Expires = DateTime.Now.AddMinutes(2)
12
13 Response.Cookies.Add(cookie)
14
15 lblMessage.Text = "<font color=red>Udao si!</font><p>"
16 else
17 lblMessage.Text = "<font color=red>Przykro mi, " & _
18 "nieprawidowa nazwa uytkownik lub haso!</font><p>"
19 end if
20 end sub
21 </script>

Analiza
Powyszy przykad niewiele rnic si od przykadw z listingw 21.1 oraz 21.2; dlatego te w
powyszym listingu zosta pominity kod HTML definiujcy interfejs uytkownika tej strony. W
wierszu 8. powyszego przykadu tworzona jest zmienna klasy HttpCookie, w ktrej zostanie
zapisane cookie uwierzytelniajce. Wywoanie metody GetAuthCookie zapisane w wierszu 10.
tworzy nowe cookie i zapisuje go w zmiennej cookie. Warto zwrci uwag, i w wywoaniu
metody uywane s takie same argumenty co w wywoaniu metody SetAuthCookie. Teraz,
przed zakoczeniem uwierzytelniania uytkownika bdziemy mogli w dowolny sposb
zmodyfikowa uzyskane cookie. Na przykad, w wierszu 11. zmieniamy dat wyganicia
wanoci cookie i ustawiamy j na dwie minuty od chwili obecnej. Po wprowadzaniu wszystkich
niezbdnych modyfikacji naley wygenerowa cookie dodajc je do kolekcji Response.Cookies
(patrz wiersz 13.).
Klasa FormsAuthentication udostpnia take metod SignOut, ktra pozwala na
wylogowanie danego uytkownika. Metoda ta usuwa cookie autoryzacyjne co sprawia, e przy
ponownej prbie dostpu do chronionych zasobw uytkownik bdzie si musia ponownie
zalogowa. Wiele witryn ktre wymuszaj na uytkownikach konieczno logowania,
udostpniaj take moliwo wylogowania, ktra jest dodatkowych mechanizmem
zabezpieczajcym. Dziki niej, uytkownicy korzystajcy z tego samego komputera nie musz
uywa tego samego konta na witrynie. Aby wylogowa uytkownika wystarczy skierowa go na
stron, ktra wykona metod SignOut:
FormsAuthentication.SignOut

Uwierzytelnianie za porednictwem formularzy ma ogromne moliwoci i daje programistom du


elastyczno co do sposobu implementacji uwierzytelniania. Co wicej jest to metoda atwa do
wykorzystania, gdy stosowane przez ni ustawienia s podawane w pliku konfiguracyjnym
web.config. Na przykad, mona zapisa informacje o uytkownikach w bazie danych i stworzy
wasne metody uwierzytelniania, cho z drugiej strony rozwizanie takie uniemoliwi
autoryzowanie uytkownikw przy uyciu metody Authenticate.

Uwierzytelnianie przy uyciu usugi Passport


Passport to scentralizowana usuga uwierzytelniania (nie ma ona nic wsplnego z serwisami sieci
WWW) prowadzona przez firm Microsoft. Dziaa ona bardzo podobnie do uwierzytelniania za
porednictwem formularzy, z t drobn rnic i adnych moliwoci funkcjonalnych nie trzeba
implementowa samodzielnie. Podstaw dziaania obu tych metod s cookies przechowywane na
komputerach uytkownikw i wykorzystywane przy uwierzytelnianiu. W razie wykorzystania
uwierzytelniania przy uyciu usugi Passport uytkownicy wchodzcy na chronion stron s
kierowani na specjaln stron logowania zawierajc bardzo prosty formularz, ktry naley
wypeni i przesa (wicej informacji na ten temat mona znale na witrynie
http://www.passport.com). Formularz ten sprawdza dane uwierzytelniajce uytkownika
porwnujc je z danymi zgromadzonymi przez usug Passport i okrela czy s one poprawne czy
nie. Jeli uytkownik zostanie poprawnie uwierzytelniony, to podobnie jak w poprzedniej
metodzie, generowane jest cookie uwierzytelniajce. Poniej opisane zostay poszczeglne
czynnoci wykonywane podczas uwierzytelniania t metod:
1. Klient da chronionej strony z naszej witryny.
2. Jeli danie nie zawiera wanego cookie uwierzytelniajcego stosowanego przez usug
Passport, to serwer przekazuje danie do mechanizmu logowania usugi Passport.
Jednoczenie przekazywane s take dodatkowe, zaszyfrowane informacje dotyczce
dania.
3. W przegldarce uytkownika wywietlany jest formularz logowania usugi Passport.
Informacje uwierzytelniajce s podawane w tym formularzu, a nastpnie zostaj
przesane do usugi Passport przy uyciu bezpiecznego protokou SSL.
4. Jeli informacje s poprawne, usuga Passport tworzy eton uwierzytelniajcy i
umieszcza go w acuchu zapytania, po czym kieruje uytkownika na witryn ktr
chcia odwiedzi.
5. Gdy serwer odnajdzie eton uwierzytelniajcy w acuchu zapytania, tworzy dla danego
uytkownika cookie uwierzytelniajce.
Jak zatem wida, usuga Passport w zasadzie nie tworzy cookie uwierzytelniajcego za
realizacj tego zadania jest odpowiedzialny serwer WWW do ktrego zostao skierowane danie.
Prawdopodobnie nie bdziesz zajmowa si bardziej szczegowo t usuga, gdy w tym celu
Twoja witryna musiaby by by zarejestrowanym czonkiem usugi Microsoft Passport. Co wicej,
aby zosta czonkiem tej usugi konieczne jest wniesienie stosownych opat. Jeli chcesz zdoby
wicej informacji na temat usugi Microsoft Passport moesz skorzysta z jej dokumentacji,
znajdujcej si pod adresem http://www.passport.com/business. Kiedy ju zarejestrujesz si jako
czonek usugi Microsoft Passport, bdziesz musia Passport SDK i odpowiednie skonfigurowa
swoj aplikacj.
Ostatnim etapem przygotowywania aplikacji do wykorzystania uwierzytelniania przy
wykorzystaniu usugi Passport, jest odpowiednie zmodyfikowanie pliku konfiguracyjnego
web.config. Oto przykadowa posta takiego pliku, jak wida jest ona cakiem prosta:
<configuration>
<system.web>
<authentication mode="Passport">
</authentication>
</system.web>
<configuration>

Wykorzystanie usugi Microsoft Passport jest bardzo przydatnym i prostym sposobem


implementacji na wasnej witrynie mechanizmw uwierzytelniajcych, ktrym mona w peni
zaufa. Z usugi tej korzysta ju bardzo wiele witryn, w tym take (co nie jest adnym
zaskoczeniem) wszystkie witryny firmy Microsoft. Kiedy kto zarejestruje si ju w usudze
Microsoft Passport i otrzyma swoj wasn tosamo, to posugujc si t sam nazw
uytkownika i hasem bdzie w stanie uzyska dostp do wszystkich witryn korzystajcych z tego
sposobu uwierzytelniania. Z tego wzgldu, jeli mylisz w ogle o nawizaniu wsppracy z inn
witryn lub stworzenia grupy witryn, to usuga Microsoft Passport moe by doskonaym
mechanizmem zabezpieczajcym.

Autoryzacja
Nowe wyraenie
Przypominasz sobie zapewne, e kady system zabezpieczajcy spenia dwie funkcje
uwierzytelnia uytkownikw oraz ich autoryzuje. Jak si przekonalimy, autoryzacja jest
procesem polegajcym na okreleniu tosamoci uytkownika na podstawie pewnych informacji.
Z kolei autoryzacja polega na okreleniu zasobw, z jakich ten uytkownik moe korzysta. W
technologii ASP.NET proces autoryzacji mona wykona na dwa sposoby. Po pierwsze moe on
bazowa na systemie operacyjnym Windows, ktry zwraca informacje o tym, do jakich zasobw
ma dostp konkretny, uwierzytelniony uytkownik. Metoda ta nazywana jest autoryzacj dostpu
do plikw. Alternatywnym rozwizaniem jest autoryzacja bazujca na adresie URL danego
zasobu; w tym przypadku proces ten nosi nazw autoryzacji dostpu do adresw URL.
Konfiguracja i wykorzystanie obu tych metod nie przysparza najmniejszych problemw.
Zanim przedstawi sposb dziaania autoryzacji dostpu do plikw przyjrzyjmy si, w jaki sposb
system operacyjny obsuguje mechanizmy zabezpiecze. Uruchom Eksploratora Windows, kliknij
prawym przyciskiem myszy na dowolnym folderze (na przykad c:\winnt) i z menu podrcznego
wybierz opcj Waciwoci, a nastpnie przejd na zakadk Zabezpieczenia; powinna ona
przypomina t z rysunku 21.10.

Rysunek 21.10. Opcje zabezpiecze systemu operacyjnego

Jeli uywasz systemu operacyjnego Windows NT lub Windows 2000 i Twj dysk twardy zosta
sformatowany w systemie NTFS (wicej informacji na ten temat mona znale w dokumentacji
systemu operacyjnego), to bdzie mona okrela opcje zabezpiecze niezalenie dla kadego
folderu i pliku zapisanego na dysku.
Opcje te uprawniaj uytkownikw do odczytywania zawartoci pliku, zapisywania w nim
danych, wykonywania aplikacji czy te przegldania zawartoci folderw (patrz lista Uprawnienia
widoczna u dou rysunku 21.10). Wszystkie te informacje o prawach dostpu do plikw i
folderw, s przechowywane w listach kontroli dostpu (ang.: Access Control Lists, w skrcie
ACL) obsugiwanych przez system operacyjny Windows. Modyfikacja poszczeglnych praw
dostpu do wybranych elementw systemu plikw jest bardzo atwa, gdy sprowadza si do
zaznaczania lub usuwania znacznika z odpowiednich pl wyboru na zakadce Zabezpieczenia.
W przypadku wykorzystania autoryzacji dostpu do plikw, ASP.NET prowadzi interakcj z
systemem operacyjnym w celu powizania tosamoci uytkownika z informacjami zapisanymi na
listach kontroli dostpu. Gdy uwierzytelniony uytkownik sprbuje uzyska dostp do jakiego
pliku na serwerze WWW, system operacyjny sprawdzi odpowiednie listy kontroli dostpu, aby
okreli czy dany uytkownik lub dana rola ma prawa konieczne do wywietlenia zawartoci tego
pliku. Wszystkie te czynnoci s wykonywane w sposb automatyczny i niezauwaalny. Dziki
temu ten sposb autoryzacji jest bardzo prosty do wykorzystania. Przy okrelaniu uprawnie na
podstawie list kontroli dostpu, autoryzacja dostpu do plikw wspdziaa z procesem
personifikacji. (Wicej informacji na temat tego procesu znajdziesz w dalszej czci niniejszego
rozdziau, pt.: Personifikacja.)
Niemniej jednak zarzdzanie listami kontroli dostpu moe by prawdziwym utrapieniem.
Wyobramy sobie, e nasza witryna skada si z 50 folderw, a w kadym z nich jest
przechowywanych kilka plikw. W takim przypadku zarzdzanie listami kontroli dostpu moe
by niezwykle uciliwe. Wanie z tego powodu ASP.NET udostpnia take moliwo
autoryzacji w oparciu o adresy URL. Metoda ta polega na odwzorowaniu tosamoci uytkownika
na foldery znajdujce si w danych adresach URL.
Aby umoliwi wykorzystanie tego sposobu autoryzacji, naley wprowadzi kilka zmian w pliku
konfiguracyjnym web.config. Poniej przedstawiona zostaa skadnia znacznika authorization:
<authorization>
<allow users="listaUytkownikwOddzialonychPrzecinkami"
roles="listaRlOddzielonychPrzecinkami" />
<deny users="listaUytkownikwOddzialonychPrzecinkami"
roles="listaRlOddzielonychPrzecinkami" />
<authorization>

Znaczniki allow oraz deny okrelaj tosamoci jakim naley udzieli bd odmwi dostpu do
zasobw. Gdybymy umiecili plik web.config przedstawiony na kolejnym przykadzie w
gwnym folderze witryny, u uytkownik clpayne dysponowa by dostpem do wszystkich
zasobw, natomiast uytkownik janek nie mgby skorzysta z adnego z nich (oczywicie
zakadajc, e w aplikacji nie jest wykorzystywany aden inny plik konfiguracyjny, ktry mgby
przesoni ustawienia naszego przykadowego pliku web.config).
<authorization>
<allow users="clpayne" />
<deny users="janek" />
</authorization>

Przy uyciu znacznikw allow oraz deny mona okrela informacje autoryzacyjne zarwno dla
tosamoci uytkownikw jak i dla rl. Oznacza to, e w bardzo prosty sposb mona zabroni
dostpu do pewnego zasobu caej grupie uytkownikw wystarczy poda w znaczniku deny
nazw roli do ktrej wszyscy Ci uytkownicy nale.

Notatka
Naley zauway, i uprawnienia podawane w znacznikach allow oraz deny obowizuj
wycznie w folderze w ktrym znajduje si odpowiedni plik konfiguracyjny web.config oraz we
wszystkich folderach podrzdnych. Innymi sowy uprawnienia te s stosowane podobnie jak
wszystkie inne ustawienia konfiguracyjne podawane w plikach web.config zgodnie z
hierarchiczn struktur systemu konfiguracyjnego.

ASP.NET udostpnia dwie specjalne tosamoci, umoliwiajce dalsze grupowanie


uytkownikw. Znak zapytania ("?") umieszczony w atrybucie users oznacza uytkownikw
anonimowych czyli tych, ktrzy nie zostali w aden sposb uwierzytelnieni. Natomiast
gwiazdka ("*") oznacza wszystkich uytkownikw niezalenie od tego czy zostali oni
uwierzytelnieni czy nie. Przedstawiony poniej przykad pokazuje w jaki sposb mona udzieli
dostpu do pewnego zasobu wycznie uwierzytelnionym uytkownikom:
<authorization>
<deny users="?" />
</authorization>

Z drugiej strony, kolejny przykad pokazuje jak udzieli dostpu do pewnego folderu wszystkich
moliwym uytkownikom:
<authorization>
<allow users="*" />
</authorization>

Powyszy przykad demonstruje domylne ustawienia wykorzystywane przez ASP.NET w


przypadku, gdy nie zostay wybrane adne inne metody uwierzytelniania i autoryzacji.
Oprcz moliwoci okrelania uytkownikw oraz rl, technologia ASP.NET pozwala take na
autoryzacj dostpu do zasobw na podstawie sposobu w jaki uytkownicy si do nich odwouj.
Atrybut verb okrela metod protokou HTTP przy uyciu ktrej mona uzyska dostp do
danego zasobu. Metodami tymi s GET oraz POST. Przykadowo, poniszy fragment pliku
konfiguracyjnego pozwala by wszyscy uytkownicy pobierali zasoby przy uyciu metody GET,
jednak tylko uytkownikowi piotr danej moliwo pobierania ich przy uyciu metody POST:
<authorization>
<allow verb="GET" users="*" />
<allow verb="POST" users="piotr" />
<deny verb="POST" users="?" />
</authorization>

Ale czy kiedykolwiek bdziemy chcieli wykorzysta taki schemat udzielania praw dostpu do
zasobw? Wyobramy sobie, e zaimplementowalimy na stronach ASP.NET niezwykle
przydatne moliwoci funkcjonalne na przykad kalkulator obliczajcy raty kredytw. Chcemy,
aby kady mg ogldn ten kalkulator i wyprbowa jego podstawowe moliwoci. Jednak
jednoczenie chcemy, aby tylko zarejestrowani uytkownicy mogli korzysta z penych
moliwoci kalkulatora, gdy wymaga to przesyania danych na serwer. Czyli wszyscy mog
pobienie zapozna si z moliwociami kalkulatora, co powinno zachci uytkownikw do
zarejestrowania si i uzyskania penego dostpu do jego moliwoci.
Cho taki hierarchiczny system konfiguracyjny jest bardzo wygodny, to jednak nie daje duych
moliwoci wybirczej kontroli. Na przykad, ustawienia podane w pliku web.config dotycz
plikw znajdujcych si w tym samym folderze oraz we wszystkich folderach podrzdnych. Aby
zmieni ustawienia konfiguracyjne w folderach podrzdnych, trzeba bdzie stworzy odpowiedni
plik konfiguracyjny web.config w kadym z nich. Szczerze mwic, bardzo nieznacznie rni si
to od problemw wystpujcych przy zarzdzaniu listami praw dostpu.
Jednak pliki konfiguracyjne web.config pozwalaj na znacznie bardziej szczegowe okrelanie
jakich zasobw dotycz definiowane w nich ustawienia. Moliwoci te zapewniaj znaczniki
location, ktre mona umieszcza we wszystkich plikach web.config. Znaczniki te okrelaj
zasoby jakich dotycz definiowane ustawienia konfiguracyjne, zgodnie ze struktur folderw
witryny. Na przykad, umieszczajc plik konfiguracyjny z listingu 21.4 w gwnym folderze
witryny mona kontrolowa autoryzacj w kilku folderach podrzdnych. Zreszt zobacz sam.

Listing 21.4. Plik web.config umoliwiajcy kontrol dostpu do kilku folderw.


1 <configuration>
2 <location path="rozdzial21/account.aspx">
3 <system.web>
4 <authorization>
5 <deny users="?"/>
6 </authorization>
7 </system.web>
8 </location>
9 <location path="rozdzial21/folder2">
10 <system.web>
11 <authorization>
12 <deny users="?"/>
13 </authorization>
14 </system.web>
15 </location>
16 </configuration>

Analiza
W wierszu 2. okrelamy, e podawane informacje konfiguracyjne bd dotyczy pliku rozdzial21/
accounts.aspx. W wierszu 4., przy uyciu znacznika authorization uniemoliwiamy dostp do
tego pliku wszystkim uytkownikom anonimowym. W wierszu 11. informujemy, e kolejne
ustawienia bd dotyczy folderu rozdzial21/folder2/. Ustawienia ta uniemoliwiaj dostp do
zawartoci tego folderu uytkownikom anonimowym. W ten sposb, w pliku web.config mona
zdefiniowa ustawienia konfiguracyjne dla dowolnej iloci plikw i folderw niezalenie od ich
pooenia w strukturze folderw witryny.
Naley zwrci uwag, i znaczniki location s umieszczone na zewntrz znacznikw
authorization. Czsto spotykanym bdem popenianym przez pocztkujcych programistw,
jest zapisywanie tych dwch znacznikw w odwrotnej kolejnoci czyli znacznikw location
wewntrz znacznikw authorization. Warto take wiedzie, e informacje autoryzacyjne
dotyczce kadego folderu trzeba podawa w odrbnej sekcji location.

Personifikacja
Personifikacja pozwala technologii ASP.NET na wykonywanie strony przy wykorzystaniu
tosamoci klienta ktrego danie jest obsugiwane. Innymi sowy, jeli uytkownik zosta
uwierzytelniony jako clpayne, to ASP.NET zabroni lub udzieli mu dostpu do zasobw na
podstawie praw dostpu okrelonych dla tego uytkownika.
Ale chwileczk! Czy przez przypadek nie jest to standardowy sposb dziaania? Przeanalizujmy
schemat przedstawiony na rysunku 21.11, aby wszystko lepiej zrozumie.

Rysunek 21.11. Przebieg procesu wykonywania stron ASP.NET w przypadku wykorzystania


personifikacji
Opis rysunku
User makes request Uytkownik przesya danie
IIS IIS
User authenticated Czy uytkownik zosta uwierzytelniony?
Yes Tak
No Nie
Deny access Brak dostpu do zasobu
ASP.NET ASP.NET
Impersonalization Personifikacja wczona?
ASP.NET assumes ASP.NET przyjmuje tosamo uytkownika
Application Aplikacja zostanie uruchomiona przy wykorzystaniu tosamoci IIS
ACLs allow Czy listy kontroli dostpu zezwalaj na dostp?
Access granted Udzielony dostp do zasobu

Domylnie mechanizm personifikacji jest wyczony. W tym przypadku, gdy zakoczy si etap
uwierzytelniania uytkownika przez IIS i obsuga dania zostanie przekazana do aplikacji
ASP.NET, to mechanizmy ASP.NET bd wykonywane przy uyciu tosamoci nadanej
serwerowi IIS (zazwyczaj jest to Lokalny komputer). Zazwyczaj tosamo ta dysponuje
prawami dostpu do wszystkich plikw i folderw. Do obsugi dostpu naley wykorzysta inne
mechanizmy zabezpiecze, takie jak autoryzacja dostpu do adresw URL.
Jeli jednak personifikacja zostanie wczona, to ASP.NET przyjmuje tosamo przekazan przez
IIS. Jeli uytkownik nie zosta uwierzytelniony, to ASP.NET przyjmie tosamo uytkownika
anonimowego. W przeciwnym przypadku, jeli uytkownik zosta uwierzytelniony to ASP.NET
wykorzysta jego tosamo. Dziki temu, e teraz ASP.NET dziaa jako inny uytkownik, system
operacyjny Windows moe ograniczy dostp do aplikacji, na podstawie informacji zapisanych w
listach praw dostpu.
Aplikacje ASP.NET s uytkownikami zasobw systemowych. Korzystaj one z plikw,
folderw, pamici, itp. Domylnie proces aplikacji ASP.NET ma due uprawnienia i oglnie rzecz
biorc moe uzyska dostp do wszystkich zasobw dostpnych w systemie operacyjnym. To
konieczne, gdy ASP.NET potrzebuje tych zasobw do poprawnego funkcjonowania. Niemniej
jednak w niektrych sytuacjach bdziemy chcieli ogranicza dostp do okrelonych zasobw, w
zalenoci od uytkownika ktry korzysta z aplikacji ASP.NET. Na przykad, uytkownik
anonimowy nie powinien mie moliwoci skorzystania z tego, i aplikacja dysponuje prawami
dostpu do wszystkich zasobw systemowych. Wanie do tego suy mechanizm personifikacji,
ktry pozwala ASP.NET przyj tosamo uytkownika i na tej podstawie okreli prawa
dostpu jakimi dysponuje.
Gdy ASP.NET przyjmuje tosamo uytkownika, to pod kadym wzgldem dziaa tak jak on. W
rzeczywistoci, system operacyjny bdzie sdzi, e to wanie dany uytkownik korzysta z
zasobw systemowych. W tej sytuacji mona wykorzysta listy kontroli dostpu i na ich
podstawie ogranicza dostp do zasobw zarwno ASP.NET jak i uytkownikowi.
Wyobramy sobie typowy schemat dziaania w przypadku wczonej personifikacji. Ot nasz
witryn odwiedza zarejestrowany uytkownik JanNowak, ktry nie dysponuje adnymi
uprawnieniami administracyjnymi. Gdy tylko uytkownik zostanie uwierzytelniony, ASP.NET
przyjmuje jego tosamo i cay kod jest wykonywany w taki sposb, jak gdyby realizowa go
uytkownik JanNowak zalogowany na lokalnym serwerze a nie ASP.NET.
Jedna ze stron na naszej witrynie, na przykad files.aspx, wywietla list wszystkich plikw
dostpnych na serwerze i umoliwia zarzdzanie nimi. Oczywicie dostp do tej strony powinni
mie wycznie administratorzy. Jeli uytkownik JanNowak sprbuje uzyska dostp do tej
strony, to ASP.NET (ktre aktualnie dziaa jako uytkownik JanNowak) nie bdzie w stanie
wykona tego kodu, gdy uytkownik JanNowak nie ma uprawnie do odczytu wszystkich plikw
na serwerze. Jak zatem wida, personifikacja uniemoliwia uytkownikom korzystanie z plikw,
do ktrych nie maj dostpu. Jednak, czy ASP.NET nie powinno domylnie stosowa takich
mechanizmw zabezpieczajcych? Ot nie. Domylnie ASP.NET przyjmuje e s
wykorzystywane inne mechanizmy uwierzytelniania i autoryzacji, a zatem personifikacja nie jest
konieczna. Na przykad, przy wykorzystaniu uwierzytelniania systemu Windows, mona
uniemoliwi uytkownikowi dostp do zasobw, zanim w ogle bdzie w stanie wykorzysta
jak stron ASP.NET. W tym przypadku personifikacja nie jest konieczna, gdy uytkownik
nigdy nie bdzie w stanie wykona programu. Niemniej jednak, jeli uytkownik moe uzyska
dostp do plikw, z ktrych nie powinien korzysta, to w takich sytuacjach personifikacja jest
bardzo przydatna.

Notatka
Nawet w przypadku wykorzystania personifikacji ASP.NET bdzie korzysta z wasnej
tosamoci, aby pobiera informacje z plikw konfiguracyjnych. Gdyby byo inaczej, aplikacje
nie mogyby dziaa poprawnie. Na przykad, wikszo uytkownikw nie ma dostpu do
plikw systemowych, takich jak machine.config, w ktry s przechowywane informacje o
sposobie konfiguracji wszystkich aplikacji ASP.NET.

A zatem dlaczego mielibymy rezygnowa z wykorzystania personifikacji, jeli udostpnia ona tak
wygodne mechanizmy kontroli dostpu? Przypomnij sobie, e zarzdzanie uprawnieniami
uytkownikw przy uyciu list kontroli dostpu jest dosy kopotliwe. Bardzo czsto lepszym
rozwizaniem jest zastosowanie innych metod autoryzacji, na przykad, autoryzacji dostpu do
adresw URL. Co wicej, aby skorzysta z personifikacji konieczne jest uwierzytelnianie
uytkownikw przez serwer IIS, a takiego rozwizania niektrzy twrcy aplikacji wol unika.

Tak Nie
Personifikacji warto uywa jeli chcemy Nie warto korzysta z personifikacji jeli
skrci czas konieczny do stworzenia kodu planujemy stworzenie wasnych mechanizmw
ASP.NET. W przypadku wykorzystania uwierzytelniania.
personifikacji, pozostaje tylko zastosowa
mechanizmy uwierzytelniania serwera IIS i
zarzdza listami kontroli dostpu.

Wczanie personifikacji jest bardzo proste wystarczy doda jeden wiersz kodu do pliku
web.config:
<configuration>
<system.web>
<identity impersonate="true" username="uytkownik"
password="haso" />
</system.web>
</configuration>

Jedynym wymaganym atrybutem znacznika identity jest impersonate. Jeli atrybut ten bdzie
mia warto true, to personifikacja zostanie wczona. Jeli w znaczniku identity zostan
podane dwa opcjonalne atrybuty username oraz password, bdzie to oznaczao, i ASP.NET
zawsze ma uywa tosamoci podanego uytkownika; w tym przypadku informacje o
uytkownikach uwierzytelnionych przez IIS s ignorowane. Moliwo ta jest bardzo przydatna w
sytuacjach, gdy wszyscy uytkownicy maj mie dokadnie te same uprawnienia.
Przykadowo zamy, e dysponujemy wieloma uytkownikami systemu Windows, ktrzy
powinni posiada dokadnie te same uprawnienia. Ze wzgldu na czas konieczny do zdefiniowania
list kontroli dostpu dla kadego pliku i uytkownika, zdefiniowalimy uprawnienia tylko dla
jednego z nich. Teraz, kady uytkownik moe zosta uwierzytelniony przez IIS, a nastpnie
wszyscy mog podawa si za konkretnego uytkownika, dla ktrego zostay okrelone prawa
dostpu. Rozwizanie takie moe zaoszczdzi nam wiele czasu.
Jeszcze innym przykadem moe by sytuacja w ktrej informacje o uytkownikach s
przechowywane na innym komputerze w domenie. W takim przypadku, gdy uytkownik zostanie
uwierzytelniony przez serwer, ASP.NET moe wykorzysta konto uytkownika zdefiniowane na
innym komputerze, ktre moe mie inne uprawnienia od konta uytkownika uwierzytelnionego
na serwerze. Take w tym przypadku, jeden wiersz kodu pozwala ASP.NET odpowiednio
przeprowadzi personifikacj wszystkich uwierzytelnianych uytkownikw i odpowiednio
wykorzysta listy kontroli dostpu aby okreli ich uprawnienia.

To nie jest ASP!


Take w tradycyjnej wersji technologii ASP s dostpne proste metody uwierzytelniania. Na
przykad, IIS by w stanie uwierzytelnia uytkownikw przy wykorzystaniu uwierzytelniania
prostego, bazujcego na skrtach oraz zintegrowanego uwierzytelniania systemu Windows.
Dostpna bya take moliwo stworzenia wasnych mechanizmw uwierzytelniajcych przy
uyciu Passport SDK, cho niejednokrotnie byo to zadanie wymagajce ogromnych nakadw
czasu i pracy. Niektre witryny wykorzystyway take rozwizania przypominajce
uwierzytelnianie za porednictwem formularzy, lecz mechanizmy te musiay by tworzone
zupenie od podstaw.
Prawdziw zmian jest atwo implementacji jak daje ASP.NET. Mechanizmy uwierzytelniania
za porednictwem formularzy zostay wbudowane w t technologi, a ich wykorzystanie wymaga
bardzo niewielkiego nakadu pracy. Wszystkie najwaniejsze mechanizmy uwierzytelniania
zostay ju stworzone, a programista musi jedynie podj decyzj gdzie maj by weryfikowane
informacje podawane przez uytkownikw.
W ASP.NET zostay take uproszczone sposoby wykorzystania mechanizmw autoryzacji.
Autoryzacja dostpu do plikw bya take dostpna w klasycznej wersji technologii ASP.
Nowoci jest natomiast autoryzacja dostpu do adresw URL, ktra stanowi duy krok na przd
jeli chodzi o kontrol dostpu do zasobw. Due i atwe moliwoci konfiguracji kontroli dostpu
do adresw URL daj pliki web.config.
Jeli dobrze si znasz na mechanizmach bezpieczestwa stosowanych w tradycyjnej wersji
technologii ASP, to pojcie personifikacji nie powinno by Ci obce. Ze wzgldu na zgodno z
poprzednimi wersjami technologii, take ASP.NET wykorzystuje te same mechanizmy
personifikacji.
Implementacja mechanizmw zabezpiecze w klasycznej wersji technologii ASP niejednokrotnie
wymagaa wprowadzania stosownych modyfikacji w konfiguracji serwera IIS oraz sytemu
operacyjnego bezporednio na serwerze; oczywicie konieczne byo posiadanie odpowiednich
uprawnie administracyjnych. W ASP.NET nie jest to ju konieczne dziki wykorzystaniu
plikw konfiguracyjnych web.config programista moe modyfikowa ustawienia aplikacji
dziaajcej na dowolnym serwerze, nie ruszajc si do swego biurka.
System zabezpiecze dostpny w technologii ASP.NET zosta zaprojektowany w taki sposb, aby
maksymalnie uatwi implementacj zabezpiecze w tworzonych aplikacjach, a jednoczenie
zapewni bardzo wysoki poziom bezpieczestwa. Wszystkie mechanizmy dostpne w klasycznej
wersji ASP wci s dostpne, a nowe rozwizania zapewniaj atwo implementacji.
Dodatek A
Najczciej popeniane
bdy w ASP.NET
W tym dodatku zostao opisanych wiele bdw najczciej popenianych przez programistw
ASP.NET i to niezalenie od tego czy s oni zupenie pocztkujcy czy te maj due
dowiadczenie w tworzeniu aplikacji w tradycyjnej technologii ASP. Istnieje wiele przykadw
prostych bdw, ktre mog sprawi, e programici bd ama sobie gowy prbujc okreli
co si dzieje. W rzeczywistoci wiele spord tych bdw mona bardzo atwo poprawi.
Dodatek ten zosta napisany w formie krtkiego poradnika prezentujcego takie bdy. Dziki
niemu programici ASP.NET bd w stanie byskawicznie znale przyczyn bdu, poprawi go
oraz dowiedzie si jak w przyszoci unika bdw tego typu.
Niniejszy dodatek zosta podzielony na dwie czci. W pierwszej z nich zostay opisane bdy
typowe dla technologii ASP.NET, ktre bardzo czsto pozostaj niezauwaone. W drugiej czci
opisane zostay zmiany, na ktre naley zwrci szczegln uwag przy przerabianiu klasycznych
stron ASP na strony ASP.NET. Midzy innymi chodzi tu take o ogromne rnice syntaktyczne
pomidzy jzykami VBScript a VB.NET.

Zagadki ASP.NET
ASP.NET ma wiele szczeglnych cech, ktre mog si sta przyczyn prawdziwych tragedii
programistycznych. Kada z sekcji podanych w tej czci rozdziau podaje typowe komunikaty o
bdach wywietlane w razie napotkanie konkretnego problemu, szczegowy opis tego problemu
oraz sposb jego rozwizania. (Naley zwrci uwag i fragmenty komunikatw o bdach
wywietlone kursyw, mog zosta zastpione bardziej szczegowymi nazwami.)

Problemy z formularzami internetowymi


Problem: Unexpected end of file looking for </asp:Control> tag.
(Nieoczekiwany koniec pliku podczas poszukiwania zamykajcego znacznika </asp:Control>)
Opis: Zapomniano o zamykajcym znaczniku elementu sterujcego ASP.NET.
Rozwizanie: Wszystkie elementy sterujce musz posiada odpowiednie znaczniki zamykajce.
Naley doda znacznik zamykajcy zapisany w jeden z nastpujcych sposobw:
<asp:Label id="lblKomunikat" runat=server />
<asp:Label id="lblKomunikat" runat=server />
Problem: Literal content ("html") is not allowed within a 'control'.
(Zawarto tekstowa (html) nie moe by umieszczona wewntrz elementu sterujcego
elemSter)
Opis: Prbowano utworzy element sterujcy bez koniecznego znacznika zamykajcego.
Rozwizanie: Problemy tego typu wystpuj zazwyczaj w przypadku stosowania elementw
sterujcych DataGrid oraz DataList i s spowodowane pominicie zamykajcego znacznika
elementu sterujcego. Bez tego znacznika ASP.NET przyjmuje e cay dalszy kod HTML strony
jest elementem tego elementu sterujcego i dlatego zgasza bd. Aby rozwiza problemy tego
typu wystarczy dopisa odpowiedni znacznik zamykajcy.
Problem: Element sterujcy nie jest wywietlany lub nie dziaa zgodnie z oczekiwaniami.
Opis: ASP.NET nie obsuguje poprawnie elementu sterujcego; dane przesyane z formularza nie
s rozpoznawane, waciwoci okrelajce wygld elementu nie s wywietlane, i tak dalej.
Rozwizanie: Najbardziej prawdopodobn przyczyn wystpowania tych problemw jest
pominicie atrybutu runat="server" elementu sterujcego. Aby rozwiza problem, naley
doda ten atrybut do elementu w ktrym wystpuj problemu.
Problem: Dane nie s poprawne wywietlane w elemencie sterujcym.
Opis: ASP.NET w ogle nie wywietla danych w elemencie sterujcym, bd te nie uaktualnia
ich poprawnie.
Rozwizanie: Zapomniano o wywoaniu metody DataBind.
Problem: An exception has been thrown by the class contstructor for
System.Drawing.Internal.SystemColorTracker. (Konstruktor klasy
System.Drawing.Internal.SystemColorTracker zgosi wyjtek.)

Opis: ASP.NET nie jest w stanie poprawnie wywietli danego elementu sterujcego (zazwyczaj
dotyczy to elementw DataGrid).
Rozwizanie: Uruchom ponownie aplikacj. Mona to zrobi na kilka sposobw:
z poziomu wiersza polece uruchomi program iisreset;
zmodyfikowa i zapisa na dysku jeden z plikw global.asax lub web.config;
ponownie skompilowa ktry z obiektw biznesowych zapisanych w folderze /bin.
Problem: Procedury obsug zdarze nie generuj oczekiwanych wynikw.
Opis: Korzystajc z formularzy internetowych i elementw sterujcych wykonywanych po stronie
serwera starasz si wygenerowa odpowiednie dane wyjciowe, ale co nie dziaa zgodnie z
oczekiwaniami. Na przykad, prbujesz zmodyfikowa zawarto pola tekstowego lub etykiety,
lecz warto ta si nie zmienia lub zmienia si nie tak by sobie tego yczy.
Rozwizanie: Trzeba pamita, e zdarzenie Page_Load jest zawsze wykonywane przed
wszystkimi innymi procedurami obsugi zdarze, ktre z kolei nie s wykonywane w adnej
okrelonej kolejnoci. Procedura Page_Load moe modyfikowa lub przywraca oryginaln
warto elementu sterujcego zanim procedura obsugi zdarzenia bdzie miaa szans uy tej
wartoci. Tak sytuacj demonstruje poniszy fragment kodu:
sub Page_Load(obj as Object, e as EventArgs)
tbMessage.Text = "Witaj wiecie!"
end sub
sub HandleSubmit(obj as Object, e as EventArgs)
Response.Write(tbMessage.Text)
end sub

...

<asp:TextBox id="tbMessage" runat="server"


OnTextChanged="HandleSubmit"
AutoPostBack=true />
...

W przypadku zmiany zawartoci pola tekstowego, formularz jest przesyany na serwer. Jednak w
pierwszej kolejnoci jest wykonywana metoda Page_Load ktra za kadym razem zapisuje w
polu tekstowym acuch znakw Witaj wiecie!. Dopiero potem procedura HandleSubmit
prbuje wywietli zawarto pola tekstowego, lecz zamiast podanego tekstu za kadym razem
wywietlany jest acuch znakw Witaj wiecie!.
Jednym z moliwych rozwiza jest sprawdzenie w procedurze Page_Load wartoci waciwoci
Page.IsPostBack, na podstawie ktrej mona okreli czy formularz zosta wypeniony. W
takim przypadku a wartoci jego pl nie powinne by zmieniane:
sub Page_Load(obj as Object, e as EventArgs)
if not Page.IsPostBack then
tb.Message.Text = "Witaj wiecie!"
end if
end sub
Innym sposobem jest zmiana struktury uywanych procedur.

Inne problemy
Problem: MissingMethodException: Member not found. (MissingMethodException: Nie
odnaleziono metody lub waciwoci)
Opis: Zostaa podjta prba odwoania si do metody lub waciwoci obiektu (zazwyczaj
zwrconego jako wynik dziaania jakiej metody).
Rozwizanie: Cho istnieje wiele potencjalnych przyczyn tych bdw, to jednak ten najczciej
spotykany wie si z rzutowaniem typw. Na przykad przeanalizujmy ponisz procedur
obsugi zdarze:
sub MyHandler(obj as Object, e as EventArgs)
Response.Write(obj.Text)
end sub
Zakadaj e powysza procedura jest wywoywana w celu obsugi zdarze generowanych przez
etykiet, to powinnimy mie moliwo dostpu do jej waciwoci Text. Jednak nigdy nie
naley polega na tym, co dana zmienna powinna reprezentowa. Powinnimy natomiast
odpowiednio rzutowa typ obiektu:
Response.Write(CType(obj, Label).Text)
W ASP.NET zmienne typu Object czsto wykorzystuj mechanizm wczesnego cznia, co
oznacza, e mog by przetwarzane ju w czasie kompilacji strony (a nie w czasie obsugi
zgoszonego dania). Wanie z tego powodu ASP.NET uwaa odwoanie do waciwoci Text
za bd bo przecie klasa Object nie definiuje takiej waciwoci. Niemniej jednak, w czasie
obsugi dania zostanie przesane odpowiednie odwoanie; wtedy jednak jest ju za pno.
Naley pamita, aby zawsze odpowiednio rzutowa typy zmiennych.
Problem: The type obiekt in Assembly nazwa, Version=wersja,
Culture=kultura, PublicKeyToken=eton is not marked as serializable. (Typ
obiekt w komponencie nazwa, o podanej kulturze i etonie klucza publicznego nie zosta
oznaczony jako umoliwiajcy serializacj.)
Opis: Zostaa podjta prba zachowania obiektu w sesji lub stanie aplikacji.
Rozwizanie: Niektre obiekty, takie jak na przykad obiekty DataSet nie mog by
automatycznie zapisywane sucych do przechowywania stanu. Aby rozwiza ten problem
naley sprbowa wywoa metod ShouldSerializeObiekt obiektu ktry sprawia problemy.
Problem: Type not defined: typ. (Typ typ nie zosta zdefiniowany)
Opis: Zostaa podjta prba zadeklarowania kopii obiektu nieznanego typu.
Rozwizanie: Naley si upewni czy nazwa typu zostaa zapisana poprawnie. Warto take
sprawdzi czy s importowane wszystkie konieczne przestrzenie nazw. Naley pamita, e w
klasach jzyka VB.NET (takich jak kod obsugi formularzy oraz obiekty biznesowe) przestrzenie
nazw nie s importowane domylnie (jak to si dzieje w przypadku stron ASP.NET).
Zmiany w stosunku do tradycyjnej
technologii ASP
Przeksztacajc strony ASP pisane w jzyku VBScript do postaci stron ASP.NET pisanych w
jzyku VB.NET programici czsto popenia bdy syntaktyczne oraz problemy innych typw.
Bdy te oraz sposoby ich rozwizywania zostay opisane w tej czci niniejszego dodatku.

Problemy z jzykiem VBScript


Bd: Wend is no longer supported; use End While instead. (Sowo kluczowe
Wend nie jest ju stosowana, zamiast niej naley uy instrukcji End While)
Opis: Prbowano zakoczy ptl while przy uyciu sowa kluczowego wend.
Rozwizanie: W jzyku VB.NET sowo kluczowe wend nie jest dostpne, zamiast niego naley
uy instrukcji End While.
Bd: The syntax <lower bound> To <upper bound> is no longer supported for
specifying array bounds. (Skadnia <dolna granica> To <grna granica> nie jest ju
stosowana do okrelania zakresu indeksw tablic)
Opis: Zostaa podjta prba okrelenia staej wielkoci tablicy.
Rozwizanie: W jzyku VBScript dopuszczalne byo uycie instrukcji dim MyArray(0, 5) w
celu utworzenia tablicy o staej wielkoci. W ASP.NET nie jest to moliwe.
Bd: The name 'mojaTablica' is not declared. (Zmianna mojaTablica nie zostaa
zadeklarowana, przy czym mojaTablica jest tablic)
Rozwizanie: Prawdopodobnie zostaa podjta prba zadeklarowania tablicy przy uyciu
instrukcji ReDim. Zanim bdzie mona jej uy trzeba zadeklarowa tablic przy uyciu instrukcji
Dim.

Bd: A value of type 'type' cannot be conferted to object. (Warto typu typ
nie moe zosta skonwertowana do obiektu)
Opis: Zazwyczaj oznacza to, e zostaa podjta prba przypisania waciwoci do obiektu, bez
okrelania nazwy waciwoci
Rozwizanie: W jzyku VBScript obiekty dysponoway tak zwanymi domylnymi
waciwociami. Innymi sowy, nie trzeba byo podawa nazwy takiej waciwoci aby okreli jej
warto. A zatem, posugujc si hipotetycznym przykadem wykorzystujcym element sterujcy
Label, w jzyku VBScript mona by uy nastpujcego fragmentu kodu:
dim Lable as Label
Label = "Witaj wiecie!"

Wykonanie powyszego fragmentu kodu spowodowaoby przypisani waciwoci Text podanego


acucha znakw. W jzyku VB.NET domylne waciwoci nie s ju dostpne, chyba e
uywaj parametrw. Oznacza to e naley jawnie podawa nazwy waciwoci:
Label.Text = "Witaj wiecie!"
Problem: Let and Set are no longer supported on assignment statements. (Przy
przypisaniach nie s ju stosowane sowa kluczowe Let i Set)
Opis: Zostaa podjta prba przypisania czego do obiektu przy wykorzystaniu sowa kluczowego
Let lub Set.
Rozwizanie: Sowa kluczowe Let i Set nie s stosowane w jzyku VB.NET; wystarczy je
usun z kodu i wszystko powinno by w porzdku.
Problem: The name 'N' is not declared. (Nazwa N nie zostaa zadeklarowana) Nawet
pomimo faktu, e j deklarowae.
Opis: Deklaracja zmiennej z jednej czci strony nie jest dostpna w innej czci tej samej strony.
Rozwizanie: W jzyku VBScript zmienne deklarowane wewntrz instrukcji blokowych (czyli
dowolnych instrukcji koczcych si sowami kluczowymi End, Next bd Loop) byy widoczne
poza blokiem, w ktrym zostay zadeklarowane. Na przykad, wykonanie poniszego fragmentu
kodu spowoduj wywietlenie w przegldarce liczby 11:
dim I as integer
For I = 1 To 10
Dim N as Double
N = N + I
Next
Response.Write(N)

W jzyku VB.NET zmienna N bdzie widoczna wycznie w bloku, w jakim zostaa


zadeklarowana poza nim nie bdzie dostpna (co oznacza e bdzie niedostpna poza ptl
For). Wanie z tego powodu powyszy fragment kodu umieszczony na stronie ASP.NET nie
bdzie poprawny. Aby rozwiza powyszy problem wystarczy zadeklarowa zmienn poza ptl.
Problem: Optional parameters must always specify a default value. (Parametry
opcjonalne zawsze musz okrela warto domyln)
Opis: Zadeklarowae funkcj wykorzystujc sowo kluczowe optional, okrelajce e dany
parametr jest opcjonalny.
Rozwizanie: W jzyku VB.NET parametry opcjonalne musz okrela domyln warto. Na
przykad, poniszy fragment kodu zapisany w jzyku VBScript:
sub MySub(Optional mParametr as String)
naley zmieni na:
sub MySub(Optional mParametr as String = "Witam!")
Warto take widzie, e funkcja IsMissing, suc w jzyku VBScript do okrelania czy dany
zostaa podana warto okrelonego parametru opcjonalnego, w jzyku VB.NET nie jest dostpna.
Problem: Argument lists in all call statements must now be enclosed in
parentheses. (Teraz, listy argumentw we wszystkich wywoaniach musz by zapisywane w
nawiasach)
Opis: Zostaa podjta prba wywoania funkcji lub procedury, ktrej argumenty wywoania nie
zostay zapisane w nawiasach. Na przykad:
Response.Write "Witaj wiecie!"
Rozwizanie: W jzyku VB.NET argumenty podawane w wywoaniach wszystkich funkcji lub
procedur musz by zapisywane w nawiasach, niezalenie od tego czy dana funkcja zwraca
warto czy nie. Oznacza to, e zamiast powyszy fragment kodu naley zmieni w nastpujcy
sposb:
Response.Write("Witaj wiecie!")
Problem: Type-declaration character & does not match declared data type
typ. (Znak deklaracyjny & nie odpowiada deklarowanemu typowi danych typ)

Opis: Znak & zosta wykorzystany do konkatenacji acuchw znakw.


Rozwizanie: W jzyku VBScript moliwe byo czenie acuchw przy wykorzystaniu operatora
& bez umieszczania odstpw pomidzy operatorem a nazwami zmiennych. Na przykad,
wykonanie poniszego fragmentu kodu napisanego w jzyku VBScript spowodowaoby
wywietlenie w przegldarce napis Witaj pikny wiecie!:
dim a as string = "Witaj "
dim b as string = "pikny "
dim c as string = "wiecie!"
Response.Write(a&b&c)

W ASP.NET powyszy fragment kodu spowoduje zgoszenie bdu. Aby rozwiza problem
naley zmieni ostatni wiersz powyszego przykadu w nastpujcy sposb:
Response.Write(a & b & c)
Problemy z klasycznymi stronami ASP
Problem: Syntax Error or Expected variable, constant, Enum, Type or
procedural declaration. (Bd syntaktyczny lub oczekiwana zmienna, staa, typ
wyliczeniowy, typ lub deklaracja proceduralna)
Opis: Deklaracja metody lub zmiennej globalnej nie jest prawidowa. Zostaa podjta prba
zadeklarowania zmiennej lub metody wewntrz bloku generowania kodu. Na przykad:
<%
dim I as Integer
sub Powitanie
...
end sub
%>

Rozwizanie: W jzyku VB.NET wszystkie deklaracje metod i zmiennych globalnych musz by


umieszczane w blokach deklarowania kodu (czyli pomidzy znacznikami <script>). Co wicej,
wszystkie instrukcje, ktre nie s przypisaniami, musz by umieszczane wewntrz metod, takich
jak Page_Load.
Problem: Obiekt Request nie zwraca oczekiwanych danych.
Opis: Zostaa podjta prba uycia obiektu Request do zwrcenia danych z dania HTTP; na
przykad Request.Form lub Request.QueryString.
Rozwizanie: W klasycznej technologii ASP, obiekt Request zwraca acuch znakw zawierajcy
ca kolekcj zmiennych. Na przykad, zakadajc, e klasyczna strona ASP zostaa wywoana
przy uyciu adresu URL: http://localhost/test/Test.asp?val=45&val=453, to ponisze wywoanie:
Response.Write(Request.Querystring(val))

spowodowaoby wywietlenie w przegldarce jednego acucha znakw 45, 453. W ASP.NET


obiekt Request zwraca tablic acuchw znakw a nie jeden poczony acuch. Na przykad,
gdyby przy uyciu powyszego adresu URL zostaa wywoana strona ASP.NET, to wywoanie
Response.Write(Request.Querystring(val)(0))

spowodowaoby wywietlenie liczy 45, natomiast wywoanie


Response.Write(Request.Querystring(val)(1))

spowodowaoby wywietlenie liczby 453. W powyszy sposb dziaa obiekt Request, oraz
waciwoci Request.Querystring oraz Request.Form.
Dodatek B
Elementy sterujce
ASP.NET: Waciwoci i
metody
W tym dodatku zostan przedstawione waciwoci i metody wszystkich elementw sterujcych
wykorzystywanych w ASP.NET elementw sterujcych HTML, internetowych elementw
sterujcych oraz elementw sterujcych sucych do kontroli poprawnoci. Wicej
szczegowych informacji na temat tych wszystkich elementw sterujcych mona znale w
dokumentacji .NET SDK.
Wszystkie elementy sterujce przedstawione w tym dodatku dziedzicz waciwoci po klasie
System.Web.UI.Control, przedstawionej w tabeli B.1.

Tabela B.1. Waciwoci klasy Control dziedziczone przez wszystkie elementy sterujce
ASP.NET wykonywane na serwerze.
Waciwo Opis
ClientID Identyfikator elementu sterujcego wygenerowany dla niego
przez ASP.NET.
Controls Zwraca obiekt klasy ControlCollection reprezentujcy
wszystkie podrzdne elementy sterujce danego elementu.
EnableViewState Okrela czy element sterujcy powinien zapamitywa swj stan
(tzw. widok stanu) oraz stan wszystkich elementw podrzdnych.
ID Okrela identyfikator danego elementu sterujcego. Waciwo
ta musi zosta okrelona, by mona byo korzysta z danego
elementu sterujcego w programie i obsugiwa generowane
przez niego zdarzenia.
NamingContainer Zwraca odwoanie do nadrzdnego elementu sterujcego, ktry
okreli przestrze nazw uywan przez dany element sterujcy.
Page Zwraca obiekt klasy Page reprezentujcy stron na ktrej jest
umieszczony dany element sterujcy.
Parent Zwraca nadrzdny element sterujcy w hierarchii elementw
sterujcych interfejsu uytkownika.
Site Zwraca informacje na temat witryny na jakiej wywietlany jest
dany element sterujcy.
TemplateSourceDirectory Okrela katalog wirtualny w ktrym jest przechowywana strona
zawierajca dany element sterujcy.
UniqueID Okrela unikalny, hierarchiczny identyfikator elementu
sterujcego.
Rni si ona od waciwoci ID, gdy okrela pooenie danego
obiektu w hierarchii elementw sterujcych.
Visible Okrela czy dany element sterujcy powinien by widoczny na
stronie.

W tabeli B.2 zostay przedstawione metody dziedziczone przez wszystkie elementy sterujce
ASP.NET dziedziczone po klasie Control.

Tabela B.2. Metody klasy Control dziedziczone przez wszystkie elementy sterujce
ASP.NET.
Metoda Opis
DataBind Wie dane z okrelonym elementem sterujcym.
Dispose Wykonuje wszelkie ostateczne czynnoci porzdkowe przed
usuniciem elementu sterujcego.
FindControl(acuch) Przeszukuje dany element sterujcy w poszukiwaniu elementu
podrzdnego okrelonego za pomoc podanego acucha
znakw. Zwraca obiekt klasy Control.
HasControls Okrela czy dany element sterujcy ma jakie elementy
podrzdne.
RenderControl(pisarz) Generuje zawarto elementu sterujcego i przekazuje j do
obiektu klasy HtmlTextWriter okrelonego za pomoc
argumentu pisarz.
SetRenderMethodDelegate Zapisuje w nadrzdnym elemencie sterujcym delegata procedury
(metoda) obsugi zdarzenia sucego do wywietlenia danego elementu
sterujcego oraz jego zawartoci. Argumentem wywoania tej
metody jest obiekt klasy RenderMethod.

W tabeli B.3 przedstawione zostay zdarzenia klasy Control, dziedziczone przez wszystkie
elementy sterujce ASP.NET.
Zdarzenie Opis
DataBinding Zdarzenie zachodzi gdy z elementem sterujcym s wizane dane.
Disposed Zdarzenie zachodzi gdy element sterujcy jest usuwany z pamici.
Init Zdarzenie zachodzi podczas inicjalizacji elementu sterujcego (konkretnie
rzecz biorc podczas pierwszego etapu inicjalizacji).
Load Zdarzenie zachodzi gdy element sterujcy jest pobierany przez obiekt Page.
PreRender Zdarzenie zachodzi przed wywietleniem elementu sterujcego.
Unload Zdarzenie zachodzi gdy element sterujcy jest usuwany z pamici.

Elementy sterujce HTML


W tej czci dodatku zostay przedstawione szczegowe informacje na temat wszystkich
elementw sterujcych HTML dostpnych w rodowisku formularzy internetowych. Pamitasz
zapewne, e kady element HTML mona przeksztaci w element sterujcy HTML; wystarczy
doda do niego atrybut runat="server". W tej czci rozdziau znajdziesz szczegowe
informacje na temat wszystkich predefiniowanych elementw sterujcych HTML. Wszystkie
elementy ktre nie s predefiniowane dysponuj tym samym zbiorem wsplnych waciwoci,
metod i zdarze, ktre zostay opisane w poniszym podrozdziale pt.: Wsplne waciwoci
wszystkich elementw sterujcych HTML.

Wsplne waciwoci wszystkich elementw


sterujcych HTML
Tabela B.4 przedstawia waciwoci dziedziczone po klasie
System.Web.UI.HtmlControls.HtmlControl przez wszystkie elementy sterujce HTML.

Tabela B.4. Wsplne waciwoci elementw sterujcych HTML.


Waciwo Opis
Attributes Pobiera wszystkie pary nazwa-warto reprezentujce atrybuty znacznika.
Disabled Okrela czy na stronie WWW dany element sterujcy ma by przeznaczony
wycznie do odczytu.
Style Zwraca waciwoci kaskadowych arkuszy stylw dla danego elementu.
TagName Zwraca nazw elementu sterujcego.

W tabeli B.5 zostay przedstawione waciwoci dostpne we wszystkich elementach sterujcych


HTML sucych do wprowadzania informacji (takich jak HtmlInputText,
HtmlInputCheckBox, i tak dalej) dziedziczone po klasie
System.Web.UI.HtmlControls.HtmlInputControl.

Tabela B.5. Wsplne waciwoci elementw sterujcych HTML sucych do


wprowadzania danych.
Waciwo Opis
Name Okrela unikaln nazw danego elementu sterujcego.
Value Okrela zawarto danego elementu sterujcego.
Type Zwraca typ danego elementu sterujcego.

W tabeli B.6 zostay przedstawione waciwoci dostpne we wszystkich kontenerowych


elementach sterujcych HTML (takich jak HtmlTable, HtmlForm, itp.) dziedziczone po klasie
System.Web.UI.HtmlControls.HtmlContainerControl.

Tabela B.6. Wsplne waciwoci kontenerowych elementw sterujcych HTML.


Waciwo Opis
InnerHtml Okrela zawarto (kod HTML) zapisan pomidzy otwierajcym i
zamykajcym znacznikiem danego elementu sterujcego.
InnerText Okrela tekst zapisany pomidzy otwierajcym i zamykajcym znacznikiem
elementu sterujcego. Wszelkie znaki specjalne HTML wystpujce w
zawartoci tej waciwoci s odpowiednio kodowane (do postaci
odpowiednich symboli HTML).
Elementy sterujce HTML
W tej czci rozdziau zostay opisane waciwoci i metody wszystkich predefiniowanych
elementw sterujcych HTML. Naley pamita i wszystkie te elementy posiadaj take
dodatkowe waciwoci dziedziczone po swoich klasach bazowych (opisanych w poprzednim
podrozdziale).

HtmlAnchor
Te elementy sterujce reprezentuj odnoniki lub poczenia wystpujce na stronach WWW.
Waciwoci i zdarzenia klasy HtmlAnchor zostay przedstawione w tabeli B.7. Poniej zostaa
przedstawiona skadnia zapisu tych elementw sterujcych:
<a href="..." ... runat="server">...</a>

Tabela B.7. Waciwoci i zdarzenia elementu sterujcego HtmlAnchor.


Waciwo Opis
Href Okrela docelowy adres URL.
Name Okrela nazw zakadki okrelon w danym elemencie sterujcym.
Target Okrela okno przegldarki w jakim naley wywietli docelow stron WWW.
Title Okrela tytu docelowej strony WWW wywietlany przez przegldark.
Zdarzenie Opis
ServerClick Zachodzi gdy uytkownik kliknie element sterujcy

HtmlButton
Elementy sterujce HtmlButton reprezentuj przyciski (dostpne wycznie w przegldarkach
obsugujcych standard HTML 4.0). Tabela B.9 przedstawia zdarzenie generowane przez
elementy sterujce HtmlButton. Poniej zostaa przedstawiona skadnia zapisu tych elementw
sterujcych:
<button ... runat="server">

Tabela B.8. Zdarzenie generowane przez elementy sterujce HtmlButton.


Zdarzenie Opis
ServerClick Zachodzi gdy uytkownik kliknie element sterujcy.

HtmlForm
Elementy sterujce HtmlForm reprezentuj formularze HTML. Ich waciwoci zostay
przedstawione w tabeli B.9. Poniszy przykad przedstawiona skadnia zapisu tych elementw
sterujcych:
<form ... runat="server">

Tabela B.9. Waciwoci elementw sterujcych HtmlForm.


Waciwo Opis
Action Okrela adres URL strony obsugujcej i przetwarzajcej informacje podane w
formularzu po ich przesaniu na serwer.
EncType Sposb kodowania wykorzystywany przez przegldark do przesania
informacji podanych w formularzu (na przykad: "text/plain" lub
"image/jpeg".
Method Okrela w jaki sposb informacje wpisane w formularzu zostan przesane na
serwer, na przykad "Get" lub "Post".
Name Okrela nazw formularza.
Target Okrela docelowe okno przegldarki w jakim zostan wywietlone wyniki
przetworzenia formularza.

HtmlImage
Te elementy sterujce reprezentuj obrazy wywietlane na stronach WWW. Tabela B.10.
przedstawia waciwoci tych elementw sterujcych, a poniszy przykad prezentuje skadni ich
zapisu:
<img ... runat="server">

Tabela B.10. Waciwoci elementw sterujcych HtmlImage.


Waciwo Opis
Align Wyrwnanie obrazu wzgldem pozostaych elementw strony WWW.
Alt Alternatywny tekst okrelajcy tytu obrazu.
Border Grubo ramki wywietlanej wok obrazu.
Height Wysoko obrazu.
Src Plik zawierajcy obraz.
Width Szeroko obrazu.

HtmlInputButton
Elementy sterujce HtmlInputButton reprezentuj przyciski wywietlane na formularzach
HTML. Tabela B.11 zawiera informacje na temat zdarzenia generowanego przez te elementy
sterujce. Poniej zostaa przedstawiona skadnia zapisu tych elementw sterujcych:
<input type="button" ... runat="server">

Tabela B.11. Zdarzenie elementw sterujcych HtmlInputButton.


Zdarzenie Opis
ServerClick Zachodzi gdy uytkownik kliknie element sterujcy.

HtmlInputCheckBox
Elementy sterujce HtmlInputCheckBox reprezentuj pola wyboru. Tabela B.12 przedstawia
waciwoci i zdarzenia tych elementw sterujcych. Poniej zostaa przedstawiona skadnia
zapisu tych elementw sterujcych:
<input type="checkbox" ... runat="server">

Tabela B.12. Waciwoci i zdarzenia elementw sterujcych HtmlInputCheckBox.


Waciwo Opis
Checked Okrela czy dany element sterujcy zosta zaznaczony.
Zdarzenie Opis
ServerChange Zdarzenie zachodzi po przesaniu formularza, jeli biecy stan danego
elementu sterujcego od stanu wczeniejszego.
HtmlInputControl
Klasa HtmlInputControl reprezentuje oglny element sterujcy wykorzystywany w
formularzach HTML. Waciwoci elementw sterujcych tej klasy zostay przedstawione w tabeli
B.13. Poniej zostaa przedstawiona skadnia zapisu tego elementu sterujcego:
<input ... runat="server">

Tabela B.13. Waciwoci elementw sterujcych HtmlInputControl.


Waciwo Opis
Name Unikalna nazwa elementu sterujcego.
Type Okrela typ danego elementu sterujcego. Waciwo ta moe przybiera
nastpujce wartoci: "text", "password", "checkbox", "radio", "button",
"submit", "reset", "file", "hidden" bd "image". Ta waciwo jest
przeznaczona wycznie do odczytu.
Value Zawarto elementu sterujcego.

HtmlInputFile
Elementy sterujce HtmlInputFile reprezentuj elementy formularzy umoliwiajce przesyanie
plikw na serwer. Waciwoci tych elementw sterujcych przedstawia tabela B.14, a poniszy
przykad skadni ich zapisu:
<input type="file" ... runat="server">

Tabela B.14 Waciwoci i zdarzenia elementw sterujcych HtmlInputFile.


Waciwo Opis
Accept Okrela list typw MIME plikw, ktre mona przesya na serwer.
MaxLength Okrela maksymaln wielko pliku jaki mona przesa na serwer.
PostedFile Umoliwia dostp do przesanego pliku; waciwo ta zwraca obiekt klasy
HttpPostedFile.
Size Okrela szeroko pola tekstowego, w ktrym mona wpisywa ciek dostpu
do pliku, ktry ma zosta przesany na serwer.

HtmlInputHidden
Elementy sterujce tej klasy reprezentuj ukryte pola formularzy. Zdarzenia generowane przez te
elementy sterujce przedstawia tabela B.15, a poniszy przykad skadni ich zapisu:
<input type="hidden" ... runat="server">

Tabela B.15. Waciwoci i zdarzenia elementw sterujcych HtmlInputHidden.


Zdarzenie Opis
ServerChange Zdarzenie zachodzi gdy przesana zawarto tego elementu sterujcego rni si
od jego poprzedniej zawartoci.

HtmlInputImage
Elementy sterujce HtmlInputImage reprezentuj przyciski graficzne uywane w formularzach
HTML. Waciwoci i zdarzenia tych elementw sterujcych przedstawia tabela B.16, a poniszy
przykad skadni ich zapisu:
<input type="image" ... runat="server">

Tabela B.16. Waciwoci i zdarzenia elementw sterujcych HtmlInputImage.


Waciwo Opis
Align Okrela wyrwnanie obrazu wzgldem pozostaych elementw na stronie.
Alt Okrela tekst alternatywny wywietlany na stronie.
Border Okrela grubo ramki wywietlanej wok obrazu.
Src Okrela pooenie pliku w jaki jest zapisany obraz.
Zdarzenie Opis
ServerClick Zachodzi gdy uytkownik kliknie element sterujcy.

HtmlInputRadio
Elementy sterujce HtmlInputRadio reprezentuj przyciski opcji wywietlane na formularzach
HTML. Jedyn waciwo tych elementw sterujcych przedstawia tabela B.17, a poniszy
przykad skadni ich zapisu:
<input type="radio" ... runat="server">

Tabela B.17. Waciwoci i zdarzenia elementw sterujcych HtmlInputRadio.


Zdarzenie Opis
Checked Okrela czy element sterujcy jest zaznaczony.

HtmlInputText
Elementy sterujce HtmlInputText reprezentuj zwyczajne pola tekstowe. Waciwoci tych
elementw sterujcych przedstawia tabela B.18, a poniszy przykad skadni ich zapisu:
<input type="text" ... runat="server">

Tabela B.18. Waciwoci i zdarzenia elementw sterujcych HtmlInputText.


Waciwo Opis
MaxLength Okrela maksymaln dugo acucha znakw jaki mona wpisa w danym
elemencie sterujcym.
Size Okrela szeroko pola wyraon jako ilo znakw jakie bd w nim
jednoczenie widoczne.
Value Zawarto elementu sterujcego.

HtmlSelect
Elementy sterujce HtmlSelect reprezentuj listy lub listy rozwijalne zawierajce opcje, ktre
uytkownik moe wybiera. Waciwoci i zdarzenia tych elementw sterujcych przedstawia
tabela B.19, a poniszy przykad skadni ich zapisu:
<select ... runat="server">

Tabela B.19. Waciwoci i zdarzenia elementw sterujcych HtmlSelect.


Waciwo Opis
DataMember Nazwa tabeli lub widoku jakiego naley uy (waciwo jest
wykorzystywana jeli waciwoci DataSource zosta przypisany jaki
obiekt klasy DataSet).
DataSource rdo danych, jakie zostanie uyte do wypenienia tego elementu
sterujcego.
DataTextField Okrela pole rda danych, ktrego wartoci bd wywietlane jako nazwy
opcji listy.
DataValueField Okrela pole rda danych, ktrego wartoci zostan uyte jako wartoci
poszczeglnych opcji listy.
InnerHtml Kod HTML zapisany pomidzy otwierajcym i zamykajcym znacznikiem
danego elementu sterujcego.
InnerText Tekst zapisany pomidzy otwierajcym i zamykajcym znacznikiem tego
elementu sterujcego.
Items Zwraca wszystkie opcje dostpne na danej licie; waciwo ta zwraca obiekt
klasy ListItemCollection.
Multiple Okrela czy na licie mona jednoczenie zaznaczy wiksz ilo opcji (w
tym celu naley si posuy klawiszami Ctrl lub Shift).
SelectedIndex Indeks aktualnie wybranej opcji listy. Jeli na licie zostao wybranych kilka
opcji, to waciwo ta bdzie zawiera indeks pierwszej z nich.
Size Liczba okrelajca ile opcji bdzie widocznych na licie.
Value Warto aktualnie wybranej opcji.
Zdarzenie Opis
ServerChange Zdarzenie zachodzi gdy wybrany element listy przesany na serwer, nie jest
tym samym elementem, ktry zosta wybrany wczeniej.

HtmlTable, HtmlTableCell oraz HtmlTableRow


Elementy sterujce HtmlTable, HtmlTableCell oraz HtmlTableRow reprezentuj tabele, ich
komrki i wiersze. W tabeli B.20 zostay przedstawione waciwoci, ktrymi dysponuj
wszystkie te elementy sterujce.

Tabela B.20. Waciwoci dostpne w elementach sterujcych HtmlTable, HtmlTableRow


oraz HtmlTableCell.
Waciwo Opis
Align Wyrwnanie elementu sterujcego w stosunku do pozostaych elementw
strony WWW.
BGColor Kolor ta danego elementu sterujcego.
BorderColor Kolor obramowania wywietlanego wok danego elementu sterujcego.
Height Wysoko danego elementu sterujcego.

Waciwoci elementw sterujcych HtmlTable przedstawia tabela B.21, a na poniszym


przykadzie pokazana zostaa skadnia ich zapisu:
<table ... runat="server">

Tabela B.21. Waciwoci elementw sterujcych HtmlTable.


Waciwo Opis
Border Szeroko obramowania wywietlanego wok tabeli oraz pomidzy jej
komrkami.
CellPadding Wielko obszaru pomidzy zawartoci komrki oraz jej krawdziami.
CellSpacing Odlego pomidzy komrkami.
InnerHtml Kod HTML zapisany pomidzy otwierajcym i zamykajcym znacznikiem
danego elementu sterujcego.
InnerText Sam tekst zapisany pomidzy otwierajcym i zamykajcym znacznikiem
danego elementu sterujcego.
Rows Zwraca obiekt klasy HtmlRowCollection reprezentujcy wszystkie wiersze
tabeli.

Tabela B.22 przedstawia waciwoci elementw sterujcych HtmlTableCell, a na poniszym


przykadzie zostaa pokazana skadnia ich zapisu:
<td ... runat="server">

Tabela B.22. Waciwoci i zdarzenia elementw sterujcych HtmlTableCell.


Waciwo Opis
ColSpan Ilo kolumn ktre obejmuje dana komrka.
NoWrap Okrela czy tekst wywietlany wewntrz danej komrki moe by zawijany.
RowSpan Ilo wierszy ktre obejmuje dana komrka.
VAlign Wyrwnanie zawartoci komrki w pionie.
Width Szeroko danej komrki tabeli.

Tabela B.23 przedstawia waciwoci elementw sterujcych HtmlTableRow, a na poniszym


przykadzie pokazana zostaa skadnia ich zapisu:
<tr ... runat="server">

Tabela B.23. Waciwoci i zdarzenia elementw sterujcych HtmlTableRow.


Waciwo Opis
Cells Zwraca obiekt klasy HtmlTableCellCollection reprezentujcy wszystkie
komrki tworzce dany wiersz tabeli.
InnerHtml Kod HTML zapisany pomidzy otwierajcym i zamykajcym znacznikiem
elementu sterujcego.
InnerText Tekst zapisany pomidzy otwierajcym i zamykajcym znacznikiem elementu
sterujcego.
VAlign Okrela pionowe wyrwnanie komrek danego wiersza.

HtmlTextArea
Elementu sterujce HtmlTextArea reprezentuj obszary tekstowe. Tabela B.24 przedstawia
waciwoci i zdarzenia tych elementw sterujcy, a na poniszym przykadzie zostaa pokazana
skadnia ich zapisu:
<textarea ... runat="server">

Tabela B.24. Waciwoci i zdarzenia elementw sterujcych HtmlTextArea.


Waciwo Opis
Cols Ilo kolumn danego elementu sterujcego (wyraona jako ilo znakw).
Name Unikalna nazwa danego elementu sterujcego.
Rows Ilo wierszy ktre bd jednoczenie widoczne w danym elemencie
sterujcym.
Value Zawarto elementu sterujcego.
Zdarzenie Opis
ServerChange Zdarzenie zachodzi gdy zawarto tego elementu sterujcego po przesaniu na
serwer bdzie si rni od jego poprzedniej zawartoci.

Internetowe elementy sterujce


Internetowe elementy sterujce s obiektami przechowywanymi i wykonywanymi na serwerze,
ktre generuj kod HTML umoliwiajcy wywietlenie danego elementu w przegldarce WWW.
W tej czci rozdziau opisane zostay wszystkie dostpne internetowe elementy sterujce.

Wsplne waciwoci wszystkich internetowych


elementw sterujcych
W tabeli B.25 zostay przedstawione waciwoci i metody dostpne we wszystkich internetowych
elementach sterujcych ASP.NET, dziedziczone po klasie
System.Web.UI.WebControls.WebControl.

Tabela C.25. Waciwoci i metody dostpne we wszystkich internetowych elementach


sterujcych.
Waciwo Opis
AccessKey Okrela znak, ktry stanowi skrt klawiaturowy uatwiajcy przejcie
do danego elementu sterujcego (po naciniciu odpowiedniego
klawisza wraz z klawiszem Alt). Moliwo korzystania z tych skrtw
jest dostpna wycznie w Internet Explorerze 4.0 i pniejszych
nastpnych wersjach tej przegldarki.
Attributes Zwraca obiekt klasy AttributeCollection reprezentujcy atrybutu
kadego elementu sterujcego (nie zawieraj one atrybutw
zdefiniowanych jako waciwoci).
BackColor Kolor ta elementu sterujcego.
BorderColor Kolor obramowania elementu sterujcego.
BorderWidth Szeroko obramowania wywietlanego wok elementu sterujcego.
BorderStyle Styl obramowania; waciwo ta moe przybiera nastpujce
wartoci: Dashed, Dotted, Double, Inset, Groove, None, NotSet,
Outset, Ridged oraz Solid.
ControlStyle Styl elementu sterujcego (uywany w przypadku tworzenia wasnych
elementw sterujcych).
ControlStyleCreated Okrela czy style skojarzony z danym elementem sterujcym zosta
utworzony.
CSSClass Nazwa klasy kaskadowych arkuszy stylw, ktr naley przypisa
danemu elementowi sterujcemu.
Enabled Jeli waciwo ta bdzie miaa warto false, to element sterujcy
bdzie dziaa w trybie tylko do odczytu.
Font Atrybut stylu okrelajcy czcionk jak bdzie wywietlany dany
element sterujcy.
ForeColor Kolor danego elementu sterujcego (zazwyczaj jest to kolor tekstu
wywietlanego w danym elemencie).
Height Wysoko elementu sterujcego.
Style Obiekt klasy CSSStyleCollection zawierajcy kolekcj tekstowych
atrybutw ktre zostan wykorzystane jako atrybuty stylu przy
generacji zewntrznego znacznika danego elementu sterujcego.
TabIndex Okrela w jakiej kolejnoci bd uaktywniane poszczeglne elementy
sterujce wywietlona na stronie WWW, przy naciskaniu klawisza Tab.
ToolTip Tekst wywietlany po umieszczeniu wskanika myszy w obszarze
zajmowanym przez element sterujcy.
Width Szeroko elementu sterujcego.
Metody Opis
ApplyStyle Wykorzystuje wszystkie niepuste ustawienia podanego obiektu klasy
Style do okrelenia stylw danego elementu kontrolnego,
modyfikujc jego biece ustawienia.
CopyBaseAttributes Kopiuje waciwoci AccessKey, Enabled, ToolTip, TabIndex
oraz Attributes ze wskazanego elementu sterujcego i zapisuje je w
danym elemencie.
MergeStyle Wykorzystuje wszystkie niepuste ustawienia podanego obiektu klasy
Style do okrelenia stylw danego elementu kontrolnego, bez
modyfikacji jego biecych ustawie.
RenderBeginTag Generuje otwierajcy znacznik elementu HTML stanowicego
wizualny interfejs danego elementu sterujcego i przesya go do
przegldarki.
RenderEndTag Generuje zamykajcy znacznik elementu HTML stanowicego
wizualny interfejs danego elementu sterujcego i przesya go do
przegldarki.

Tabela B.26 przedstawia waciwoci i zdarzenia dostpne dla wszystkich internetowych


elementw sterujcych ASP.NET udostpniajcych moliwoci funkcjonalne listy (s to elementy
sterujce CheckBoxList, DropDownList, ListBox oraz RadioButtonList). Waciwoci te i
zdarzenia s dziedziczone po klasie System.Web.UI.WebControls.ListControl.

Tabela B.26. Waciwoci i zdarzenia wszystkich internetowych elementw sterujcych


dziaajcych jako listy.
Waciwo Opis
AutoPostBack Okrela czy formularz powinien zosta automatycznie przesany
bezporednio po wygenerowaniu zdarzenia dla danego elementu
sterujcego.
DataMember Nazwa tabeli rda danych z ktrej bd pobierane informacje
wykorzystywane przy generowaniu listy (waciwo ta jest
stosowana gdy waciwoci DataSource zostanie przypisany obiekt
DataSet).
DataSource rdo danych, ktre zostanie wykorzystane przy generowaniu
zawartoci listy.
DataTextField Pole rda danych ktrego wartoci zostan uyte jako tekst
poszczeglnych opcji listy.
DataTextFormatString acuch znakw okrelajcy format w jakim bd wywietlane
wartoci pola okrelonego we waciwoci DataTextField.
DataValueField Pole rda danych, ktrego wartoci stan si wartociami
poszczeglnych opcji listy.
Items Obiekt klasy ListItemCollection zawierajcy wszystkie opcje
dostpne na licie.
SelectedIndex Indeks opcji aktualnie wybranej na licie.
SelectedItem Obiekt klasy ListItem reprezentujcy aktualnie wybran opcj listy;
jeli w danej chwili na licie jest zaznaczonych wicej opcji, to ta
waciwo zawiera obiekt reprezentujcy tylko pierwsz z nich.
Zdarzenie Opis
SelectedIndexChanged Zdarzenie zachodzi gdy zmienia si opcja zaznaczona na licie, a
formularz zosta przesany na serwer.

W tabeli B.27 zostay przedstawione waciwoci, metody i zdarzenia dostpne we wszystkich


internetowych elementach sterujcych ASP.NET sucych do generacji list danych (DataList
oraz DataGrid). Te waciwoci, metody i zdarzenia s dziedziczone po klasie
System.Web.UI.WebControls.BaseDataList.

Tabela B.27. Waciwoci, metody i zdarzenia wsplne dla wszystkich elementw sterujcych
generujcych listy danych.
Waciwo Opis
CellPadding Wielko obszaru pomidzy zawartoci komrki danych a jej
krawdziami.
CellSpacing Odlego pomidzy poszczeglnymi komrkami danych.
DataKeyField Pole klucza gwnego w rdle danych.
DataKeys Obiekt klasy DataKeyCollection zawierajcy pola kluczy
wykorzystywanego rda danych.
DataMember Nazwa tabeli rda danych, z ktrej bd pobierane informacje
wywietlane w danym elemencie sterujcym (wykorzystywana gdy
we waciwoci DataSource zostanie zapisany obiekt DataSet).
DataSource rdo danych z ktrego bd pobierane informacje wywietlane w
tym elemencie sterujcym.
GridLines Okrela styl linii wywietlanych pomidzy komrkami danych;
waciwo ta moe przyjmowa wartoci: Both, Horizontal, None
bd Vertical.
HorizontalAlign Okrela wyrwnanie wierszy w stosunku do innych elementw
strony.
Metody Opis
DataBind Wie dane ze rda danych z elementem sterujcym.
Zdarzenie Opis
SelectedIndexChanged Zachodzi gdy na licie zostaa wybrana inna, a formularz zosta
przesany na serwer.

Internetowe elementy sterujce ASP.NET


W tej czci rozdziau zostay opisane wszystkie internetowe elementy sterujce dostpne w
ASP.NET. Skadnia ich zapisu ma nastpujc posta:
<asp:nazwaElementuSterujacego waciwoci runat="server" />

Na przykad, deklaracja elementu sterujcego AdRotator opisanego poniej, moe mie


nastpujc posta:
<asp:AdRotator Target="blank" runat="server" />

AdRotator
Te elementy sterujce wywietlaj reklam losowo wybran z okrelonego zbioru reklam,
zapisanego w formie pliku XML. Waciwoci i zdarzenia tych elementw sterujcych zostay
przedstawione w tabeli B.28.

Tabela B.28. Waciwoci i zdarzenia elementw sterujcych AdRotator.


Waciwo Opis
AdvertisementFile cieka dostpu do pliku XML zawierajcego informacje o reklamach.

KeywordFilter Filtr, ktry ogranicza jakie reklamy mog by wywietlane, na podstawie


kategorii do jakiej nale i kategorii okrelonych w pliku XML
zawierajcym informacje o reklamach.
Target Okrela okno przegldarki w jakim zostanie wywietlona strona docelowa
skojarzona z reklam.
Zdarzenie Opis
AdCreated Zdarzenie zachodzi po utworzeniu elementu sterujcego i przed
wywietleniem go na stronie. W procedurze obsugi tego zdarzenia
wykorzystywany jest argument bdcy obiektem klasy
AdCreateEventArgs. Obiekty tej klasy maj nastpujce waciwoci:

AdProperties Waciwoci aktualnie wybranej reklamy.

AlternateText Tekst alternatywny wywietlany zamiast obrazka.

ImageUrl Adres URL obrazka jaki ma zosta wywietlony na


reklamie.
NavigateUrl Adres URL, pod ktry naley przekierowa
uytkownika.

BoundColumn
Elementy sterujce BoundColumn reprezentuj kolumny elementw DataGrid i s kojarzone z
polami rda danych. Waciwoci i metody elementw sterujcych BoundColumn zostay
przedstawione w tabeli B.29.

Tabela B.29. Waciwoci i metody elementw sterujcych BoundColumn.


Waciwo Opis
DataField Nazwa pola danych zwizanego z dan kolumn.
DataFormatString acuch znakw okrelajcy posta danych wywietlanych w danej
kolumnie.
ReadOnly Okrela czy dane wywietlane w tej kolumnie s przeznaczone wycznie
do odczytu (waciwo ta jest czsto stosowana wraz z elementami
EditCommandColumns).

Metoda Opis
Initialize Inicjalizuje kolumn.
InitializeCell Inicjalizuje komrk danej kolumny.

Button
Elementy sterujce Button powoduj wywietlenie przycisku HTML. Waciwoci i zdarzenia
tych elementw sterujcych zostay przedstawione w tabeli B.30.

Tabela B.30. Waciwoci i zdarzenia elementw sterujcych Button.


Waciwo Opis
CommandArgument Warto przekazywana wraz z wartoci CommandName do zdarzenia
Command.
CommandName Polecenie skojarzone ze zdarzeniem Command.
Text Zawarto elementu sterujcego.
Zdarzenie Opis
Click Zachodzi w przypadku kliknicia przycisku.
Command To samo co zdarzenie Click.

ButtonColumn
Elementy sterujce ButtonColumn reprezentuj kolumn elementu DataGrid zawierajc grup
przyciskw. Waciwoci tych elementw sterujcych zostay przedstawione w tabeli B.31.

Tabela B.31. Waciwoci i zdarzenia elementw sterujcych ButtonColumn.


Waciwo Opis
ButtonType Okrela typ przycisku jaki naley wywietli; waciwo ta moe
przybiera wartoci LinkButton lub PushButton.
CommandName acuch znakw reprezentujcy polecenie jakie naley wykona w
przypadku kliknicia przycisku.
DataTextField Nazwa pola rda danych, ktrego wartoci s wywietlane w tej
kolumnie.
DataTextFormatString Okrela sposb w jaki naley wywietli zawarto pola wskazanego
we waciwoci DataTextField.
Text Tytu wywietlany na przycisku.

Calendar
Elementy sterujce Calendar wywietlaj w przegldarce interaktywny kalendarz dysponujcy
niezwykle bogatymi moliwociami okrelania sposobu prezentacji danych i dziaania.
Waciwoci tych elementw sterujcych i generowane przez nie zdarzenia zostay przedstawione
w tabeli B.32.

Tabela B.32. Waciwoci i zdarzenia elementw sterujcych Calendar.


Waciwo Opis
CellPadding Wielko obszaru pomidzy zawartoci komrki prezentujcej numer
dnia, a jej krawdziami.
CellSpacing Wielko wzajemnej odlegoci pomidzy poszczeglnymi komrkami
prezentujcymi numery dni.
DayHeaderStyle Styl jakim maj by wywietlane nazwy dni tygodnia.
DayNameFormat Format w jakim bd wywietlane nazwy dni tygodnia; waciwo ta
moe przybiera wartoci: FirstLetter, FirstTwoLetters, Full
oraz Short.
DayStyle Styl wywietlania numerw dni.
FirstDayOfWeek Okrela dzie, ktry w kalendarzu bdzie wywietlany jako pierwszy
dzie tygodnia; waciwo ta moe przybiera warto: Default
(warto domylna okrelona przez serwer) oraz dowoln nazw dnia
(od Sunday do Saturday).
NextMonthText Tekst wywietlany na pasku nawigacyjnym kalendarza, umoliwiajcy
przejcie do nastpnego miesica (na przykad "Nastpny" lub ">").
NextPrevFormat Format w jakim bd wywietlane poczenia do nastpnego i
poprzedniego miesica; moe przybiera wartoci: CustomText (jest
to warto domylna, naley j stosowa w przypadkach gdy s take
uywane waciwoci NextMonthText oraz PrevMonthText),
FullMonth lub ShortMonth.
NextPrevStyle Styl w jakim bd wywietlane poczenia do poprzedniego i
nastpnego miesica.
OtherMonthDayStyle Styl w jakim bd wywietlane dni ktre nie nale do biecego
miesica wywietlanego w kalendarzu.
PrevMonthText Tekst wywietlany na pasku nawigacyjnym kalendarza, umoliwiajcy
przejcie do poprzedniego miesica (na przykad "Poprzedni" lub
"<").
SelectedDate Data wybrana w kalendarzu.
SelectedDates Kolekcja obiektw DateTime reprezentujcych daty wybrane w
kalendarzu.
SelectedDayStyle Styl w jakim bd wywietlane wybrane dni.
SelectionMode Okrela w jaki sposb uytkownik bdzie mg zaznacza dni w
kalendarzu (na przykad, pojedynczy dzie, cae tygodnie, itd.); moe
przyjmowa wartoci Day, DayWeek, DayWeekMonth lub None.
SelectMonthText Tekst wywietlany jako poczenie suce do wyboru miesicy.
SelectorStyle Styl okrelajcy posta pocze umoliwiajcych wybr tygodni i
miesicy.
SelectWeekText Tekst wywietlany na poczeniu sucym do wyboru tygodni.
ShowDayHeader Okrela czy w kalendarzu powinne by wywietlane nagwki dni
tygodnia.
ShowGridLines Okrela czy naley wywietla linie oddzielajce numery
poszczeglnych dni wywietlanych w kalendarzu.
ShowNextPrevMonth Okrela czy naley wywietla poczenia do poprzedniego i
nastpnego miesica.
ShowTitle Okrela czy naley wywietla tytu kalendarza.
TitleFormat Okrela format w jakim bdzie wywietlany tytu kalendarza; dostpne
wartoci to Month lub MonthYear.
TitleStyle Styl w jakim bdzie wywietlony tytu kalendarza.
TodayDayStyle Styl w jaki zostanie wywietlona bieca data.
TodaysDate Okrela dzisiejsz dat.
VisibleDate Data okrelajca miesic jaki bdzie wywietlony w kalendarzu (warto
zwrci uwag, i wybrana data oraz data okrelajca wywietlony
miesic nie musz by identyczne).
WeekendDayStyle Styl w jakim bd wywietlane dni wolne.
Zdarzenie Opis
DayRender Zachodzi podczas tworzenia kadej komrki wywietlajcej numer
dnia. Argumentem wywoania procedury obsugi tego zdarzenia jest
obiekt klasy DayRenderEventArgs. Obiekty tej klasy zawieraj dwie
waciwoci:
Cell Obiekt klasy TableCell reprezentujcy komrk
wywietlan w kalendarzu.
Day Obiekt klasy CalendarDay reprezentujcy dzie wywietlany
w kalendarzu.
SelectionChanged Zachodzi gdy uytkownik wybierze w kalendarzu dzie, tydzie lub
miesic.
VisibleMonthChanged Zachodzi gdy uytkownik wywietli w kalendarzu inny miesic.
Argumentem wywoania procedury obsugi tego zdarzenia jest obiekt
klasy MonthChangedEventArgs. Klasa ta definiuje nastpujce
waciwoci:
NewDate Data okrelajca jaki miesic aktualnie bdzie widoczny
w kalendarzu.
PreviousDate Data okrelajca jaki miesic by poprzednio
wywietlany w kalendarzu.

CheckBox
Elementy sterujce CheckBox reprezentuj pola wyboru HTML. Waciwoci tych elementw
kontrolnych oraz generowane przez nie zdarzenia zostay przedstawione w tabeli B.33.

Tabela B.33. Waciwoci i zdarzenia elementw sterujcych CheckBox.


Waciwo Opis
AutoPostBack Okrela czy formularz powinien by przesany niezwocznie po zajciu
zdarzenia CheckedChanged.
Checked Okrela czy dany element sterujcy jest zaznaczony.
Text Tekst wywietlany obok pola wyboru.
TextAlign Wyrwnanie tekstu wywietlanego wraz z polem wyboru.
Zdarzenie Opis
CheckedChanged Zachodzi gdy zmieni si warto waciwoci Checked.
CheckBoxList
Elementy sterujce CheckBoxList wywietlaj w przegldarce list zwizanych ze sob
tematycznie pl wyboru. Waciwoci tych elementw kontrolnych zostay przedstawione w tabeli
B.34.

Tabela B.34. Waciwoci i zdarzenia elementw sterujcych CheckBoxList.


Waciwo Opis
CellPadding Wielko obszaru pomidzy zawartoci i krawdziami komrki zawierajce
elementy sterujce CheckBox.
CellSpacing Odlego pomidzy poszczeglnymi komrkami zawierajcymi elementy
sterujce CheckBox.
RepeatColumns Ilo kolumn w jakim majcy by wywietlane elementy sterujce.
RepeatDirection Okrela czy elementy sterujce CheckBox maj by wywietlane w
poziomie (Horizontal) czy te w pionie (Vertical).
RepeatLayout Okrela ukad listy; waciwo moe przyjmowa warto Table (aby lista
elementw sterujcych CheckBox bya wywietlana przy wykorzystaniu
tabeli) bd Flow (aby bya wywietlana baz uycia tabeli).
TextAlign Okrela wyrwnanie tekstu skojarzonego z kadym z elementw sterujcych
CheckBox.

DataGrid
Elementy sterujce DataGrid wywietlaj zoon tabel zawierajc dane pobierane z podanego
rda. Waciwoci tych elementw kontrolnych oraz generowane przez nie zdarzenia zostay
przedstawione w tabeli B.35.

Tabela B.35. Waciwoci i zdarzenia elementw sterujcych DataGrid.


Waciwo Opis
AllowCustomPaging Okrela czy programista moe okrela sposb podziau na strony
danych wywietlanych w elemencie sterujcym.
AllowPaging Okrela czy element sterujcy ma wywietla dane dzielc je na
strony.
AllowSorting Okrela czy ma by wykorzystywane sortowanie danych.
AlternatingItemStyle Waciwoci stylw ktre bd modyfikowa sposb prezentacji
poszczeglny elementw wywietlanych w elemencie sterujcym
DataGrid.
AutoGenerateColumns Okrela czy element sterujcy DataGrid powinien automatycznie
wygenerowa kolumny zwizane (BoundColumn) na podstawie
informacji zwrconych ze rda danych (w takim przypadku element
DataGrid wykorzysta wszystkie kolumny zwrcone ze rda
danych).
BackImageUrl URL obrazka jaki ma by wywietlony w tle elementu sterujcego.
Columns Kolekcja obiektw reprezentujcych kolumny elementu sterujcego
DataGrid.
CurrentPageIndex Indeks aktualnie wywietlonej strony.
EditItemIndex Indeks elementu ktry ma by edytowany (w tym przypadku kolumna
BoundColumn bdzie umoliwiaa edycj danych, chyba e jawnie
okrelono, e ma by przeznaczona wycznie do odczytu).
EditItemStyle Styl sucy do wywietlania elementw w trybie edycji.
FooterStyle Styl stopki elementu sterujcego DataGrid.
HeaderStyle Styl nagwka elementu sterujcego DataGrid.
Items Kolekcja obiektw DataGridItem reprezentujcych poszczeglne
elementy wywietlone w elemencie sterujcym DataGrid.
ItemStyle Styl poszczeglnych elementw wywietlanych w elemencie
sterujcym DataGrid.
PageCount Ilo stron koniecznych do wywietlenia wszystkich informacji
przechowywanych w elemencie sterujcym DataGrid.
PagerStyle Styl pocze umoliwiajcych poruszanie si pomidzy
poszczeglnymi stronami danych.
PageSize Okrela ilo elementw jakie maj by wywietlane na jednej
stronie.
SelectedIndex Indeks aktualnie wybranego elementu.
SelectedItem Wybrany element.
SelectedItemStyle Styl aktualnie wybranego elementu.
ShowFooter Okrela czy naley wywietla stopk elementu sterujcego.
ShowHeader Okrela czy naley wywietla nagwek elementu sterujcego.
VirtualItemCount Okrela cakowit ilo elementw jakie maj by wywietlane w
elemencie sterujcym DataGrid. Waciwo ta jest stosowana
wycznie w sytuacjach, gdy waciwoci AllowCustomPaging
zostaa przypisana warto true.
Zdarzenie Opis
CancelCommand Zachodzi gdy zostanie kliknity przycisk, ktrego waciwoci
CommandName jest przypisana warto "Cancel". Argumentem
wywoania procedury obsugi tego zdarzenia jest obiekt klasy
DataGridCommandEventArgs. Klasa ta definiuje nastpujce
waciwoci:
CommandArgument Argument danego polecenia.

CommandName Nazwa danego polecenia.

CommandSource Obiekt, ktry spowodowa wygenerowanie


zdarzenia.
DeleteCommand Zachodzi gdy zostanie kliknity przycisk, ktrego waciwoci
CommandName jest przypisana warto "Delete". Argumentem
wywoania procedury obsugi tego zdarzenia jest obiekt klasy
DataGridCommandEventArgs.
EditCommand Zachodzi gdy zostanie kliknity przycisk, ktrego waciwoci
CommandName jest przypisana warto "Edit". Argumentem
wywoania procedury obsugi tego zdarzenia jest obiekt klasy
DataGridCommandEventArgs.
ItemCommand Zachodzi gdy zostanie kliknity przycisk; argumentem wywoania
procedury obsugi tego zdarzenia jest obiekt klasy
DataGridCommandEventArgs.
ItemCreated Zachodzi bezporednio przed utworzeniem elementu w elemencie
sterujcym DataGrid. Argumentem wywoania procedury obsugi
tego zdarzenia jest obiekt klasy DataGridItemEventArgs. Klasa ta
definiujce nastpujc waciwo:
Item Aktualnie wybrany element.
ItemDataBound Zachodzi gdy z elementem nalecym do elementu sterujcego
DataGrid s wizane dane. Argumentem wywoania procedury
obsugi tego zdarzenia jest obiekt klasy DataGridItemEventArgs.
PageIndexChanged Zachodzi w przypadku kliknicia jednego z pocze
umoliwiajcych poruszanie si pomidzy poszczeglnymi stronami
danych. Argumentem wywoania procedury obsugi tego zdarzenia
jest obiekt klasy DataGridPageChangedEventArgs. Klasa ta
definiuje nastpujc waciwoci:
CommandSource Zawiera obiekt ktry spowodowa
wygenerowanie zdarzenia.
NewPageIndex Okrela indeks wybranej, nowej strony.
SortCommand Zachodzi gdy jest sortowana kolumna. Argumentem wywoania
procedury obsugi tego zdarzenia jest obiekt klasy
DataGridSortCommandEventArgs. Klasa ta definiuje nastpujce
waciwoci:
CommandSource Zawiera obiekt, ktry spowodowa
wygenerowanie zdarzenia.
SortExpression Wyraenie suce do sortowania danych
prezentowanych w elemencie sterujcym DataGrid.
UpdateCommand Zachodzi gdy zostanie kliknity przycisk, ktrego waciwoci
CommandName jest przypisana warto "Update". Argumentem
wywoania procedury obsugi tego zdarzenia jest obiekt klasy
DataGridCommandEventArgs.

DataList
Elementy sterujce DataList umoliwiaj wywietlanie zawartoci rda danych przy
wykorzystaniu szablonw. W tabeli B.36 zostay przedstawione pola i waciwoci tych
elementw sterujcych oraz generowane przez nie zdarzenia.

Tabela B.36. Pola, waciwoci oraz zdarzenia elementw sterujcych DataList.


Pole Opis
CancelCommandName Nazwa polecenia Cancel.
DeleteCommandName Nazwa polecenia Delete.
EditCommandName Nazwa polecenia Edit.
SelectCommandName Nazwa polecenia Select.
UpdateCommandName Nazwa polecenia Update.
Waciwo Opis
AlternatingItemStyle Waciwoci stylw suce do modyfikowania sposobu
prezentacji poszczeglnych elementw wywietlanych na licie.
AlternatingItemTemplate Szablon sucy do wywietlania elementw listy, ktrych wygld
bdzie si zmienia.
EditItemIndex Indeks elementu listy ktry ma by edytowany.
EditItemStyle Styl elementw bdcych w trybie edycji.
EditItemTemplate Szablon sucy do wywietlania elementw bdcych w trybie
edycji.
ExtractTemplateRows Okrela czy wiersze szablonu powinne by pobierane.
FooterStyle Styl stopki elementu sterujcego DataList.
FooterTemplate Szablon stopki elementu sterujcego DataList.
GridLines Okrela typ wywietlanych pomidzy poszczeglnymi
elementami listy; waciwo ta moe przyjmowa wartoci
Both, Horizontal, None bd Vertical.
HeaderStyle Styl nagwka elementu sterujcego DataList.
HeaderTemplate Szablon nagwka elementu sterujcego DataList.
Items Kolekcja obiektw klasy DataListItem reprezentujcych
poszczeglne elementy wywietlane na licie.
ItemStyle Styl elementw wywietlanych na licie.
ItemTemplate Szablon elementw wywietlanych na licie.
RepeatColumns Ilo kolumn w jakich bd wywietlane informacje.
RepeatDirection Kierunek w jakim bd wywietlane poszczeglne elementy listy;
waciwo ta moe przyjmowa wartoci Horizontal lub
Vertical.
RepeatLayout Ukad w jakim maj by wywietlane poszczeglne elementy
listy; waciwo ta moe przyjmowa wartoci Table lub Flow.
SelectedIndex Indeks aktualnie wybranego elementu listy.
SelectedItem Wybrany element listy.
SelectedItemStyle Styl wybranego elementu listy.
SelectedItemTemplate Szablon sucy do wywietlania aktualnie wybranego elementu
listy.
SeparatorStyle Styl separatora oddzielajcego poszczeglne elementy listy.
SeparatorTemplate Szablon sucy do wywietlania separatora pomidzy
poszczeglnymi elementami listy.
ShowFooter Okrela czy naley wywietla stopk.
ShowHeader Okrela czy naley wywietla nagwek.
Zdarzenie Opis
CancelCommand Zachodzi gdy zostanie kliknity przycisk, ktrego waciwoci
CommandName jest przypisana warto "Cancel". Argumentem
wywoania procedury obsugi tego zdarzenia jest obiekt klasy
DataListCommandEventArgs. Klasa ta definiuje nastpujce
waciwoci:
CommandArgument Argument danego polecenia.

CommandName Nazwa danego polecenia.

CommandSource Obiekt, ktry spowodowa wygenerowanie


zdarzenia.
Item Wybrany element listy.
DeleteCommand Zachodzi gdy zostanie kliknity przycisk, ktrego waciwoci
CommandName jest przypisana warto "Delete". Argumentem
wywoania procedury obsugi tego zdarzenia jest obiekt klasy
DataListCommandEventArgs.
EditCommand Zachodzi gdy zostanie kliknity przycisk, ktrego waciwoci
CommandName jest przypisana warto "Edit". Argumentem
wywoania procedury obsugi tego zdarzenia jest obiekt klasy
DataListCommandEventArgs.
ItemCommand Zachodzi gdy zostanie kliknity przycisk jakikolwiek przycisk
wywietlony w elemencie sterujcym DataList; argumentem
wywoania procedury obsugi tego zdarzenia jest obiekt klasy
DataListCommandEventArgs.
ItemCreated Zachodzi bezporednio przed utworzeniem elementu w elemencie
sterujcym DataList. Argumentem wywoania procedury
obsugi tego zdarzenia jest obiekt klasy
DataListItemEventArgs. Klasa ta definiujce nastpujc
waciwo:
Item Aktualnie wybrany element.
ItemDataBound Zachodzi gdy z elementem nalecym do elementu sterujcego
DataList s wizane dane. Argumentem wywoania procedury
obsugi tego zdarzenia jest obiekt klasy
DataListItemEventArgs.
UpdateCommand Zachodzi gdy zostanie kliknity przycisk, ktrego waciwoci
CommandName jest przypisana warto "Update". Argumentem
wywoania procedury obsugi tego zdarzenia jest obiekt klasy
DataListCommandEventArgs.

DropDownList
Elementy sterujce DropDownList reprezentuj list rozwijan. Ich waciwoci zostay
przedstawione w tabeli B.37.

Tabela B.37. Waciwoci elementw sterujcych DropDownList.


Waciwo Opis
BorderColor Kolor obramowania otaczajcego list.
BorderStyle Styl obramowania otaczajcego list.
BorderWidth Szeroko obramowania otaczajcego list.
SelectedIndex Indeks aktualnie wybranego elementu listy.

EditCommandColumn
Elementy sterujce EditCommandColumn reprezentuj kolumn wywietlan w elementach
sterujcych DataGrid, zawierajc poczenie umoliwiajce edycj danych. Waciwoci tych
elementw sterujcych zostay przedstawione w tabeli B.38.

Tabela B.38. Waciwoci elementw sterujcych EditCommandColumn.


Waciwo Opis
ButtonType Typ przycisku jaki ma zosta wywietlony; dostpne wartoci tej waciwoci
to LinkButton oraz PushButton.
CancelText Tekst jaki ma zosta wywietlony na przycisku przerywajcym operacj.
EditText Tekst jaki ma zosta wywietlony na przycisku umoliwiajcym edycj
danych.
UpdateText Tekst jaki ma zosta wywietlony na przycisku umoliwiajcym aktualizacj
danych.

HyperLink
Te elementy sterujce reprezentuj poczenia HTML. Naley zwrci uwag, e elementy te nie
generuj adnych zdarze powoduj jedynie przekierowanie. Jeli chcemy aby byy
generowane zdarzenia zwizane z wykonaniem operacji na danym elemencie sterujcym, to
bdziemy musieli posuy si internetowym elementem sterujcym LinkButton. Waciwoci
elementw sterujcych HyperLink zostay przedstawione w tabeli B.39.

Tabela B.39. Waciwoci elementw sterujcych HyperLink.


Waciwo Opis
ImageUrl Adres URL obrazu jaki ma reprezentowa poczenie.
NavigateUrl Docelowy adres URL danego poczenia.
Target Okno przegldarki w ktrym ma by wywietlona strona docelowa
poczenia.
Text Tekst ktry zostanie wywietlony jako poczenie.

HyperLinkColumn
Elementy sterujce HyperLinkColumn reprezentuj kolumny wywietlane w elementach
sterujcych DataGrid i skojarzone ze wskazanym polem rda danych. Wartoci tych pl
zostan wywietlone jako poczenia. Waciwoci i metody elementw sterujcych
HyperLinkColumn zostay przedstawione w tabeli B.40.

Tabela B.40. Waciwoci i metody elementw sterujcych HyperLinkColumn.


Waciwo Opis
DataNavigateUrlField Nazwa pola rda danych, ktrego wartoci bd okrela
docelowy adres URL dla pl danej kolumny.
DataNavigateUrlFormatString Format w jakim bd wywietlane wartoci pola rda
danych zawierajcego adres docelowy pl danej kolumny.
DataTextField Nazwa pola rda danych, ktrego wartoci bd
wywietlane w danej kolumnie jako tekst poczenia.
DataTextFormatString Format w jakim bd wywietlane wartoci pola
zawierajcego tekst poczenia.
NavigateUrl Adres URL pod ktry naley skierowa przegldark w
momencie kliknicia poczenia.
Target Okno przegldarki w ktrym naley wywietli docelow
stron poczenia.
Text Tekst poczenia wywietlany na stronie.
Metoda Opis
Initialize Inicjalizuje dan kolumn.
InitializeCell Inicjalizuje komrk danej kolumny.

Image
Elementy sterujce Image reprezentuj obrazy wywietlane w przegldarce. Waciwoci tych
elementw sterujcych zostay przedstawione w tabeli B.41.

Tabela B.41. Waciwoci elementw sterujcych Image.


Waciwo Opis
AlternateText Tekst alternatywny, wywietlany zamiast obrazu.
Enabled Okrela czy dany element sterujcy jest wczony.
Font Waciwoci czcionki jak bdzie wywietlany tekst alternatywny.
ImageAlign Wyrwnanie danego obrazu na stronie, w stosunku do pozostaych
elementw interfejsu uytkownika.
ImageUrl Adres URL obrazka ktry naley wywietli.

ImageButton
Elementy sterujce ImageButton reprezentuj graficzne przyciski formularzy HTML (czyli
przyciski na ktrych jest wywietlany obraz). Waciwoci tych elementw sterujcych oraz
generowane przez nie zdarzenia zostay przedstawione w tabeli B.42.

Tabela B.42. Waciwoci i zdarzenia elementw sterujcych ImageButton.


Waciwo Opis
CommandArgument Argument dostarczajcy dodatkowych informacji na temat waciwoci
CommandName.
CommandName Nazwa polecenia jakie naley wykona w przypadku kliknicia elementu
sterujcego.
Zdarzenie Opis
Click Zachodzi gdy element sterujcy zostanie kliknity.
Command Zachodzi gdy element sterujcy zostanie kliknity.

Label
Te elementy sterujce wywietlaj zwyczajny tekst w przegldarce. Elementy te posiadaj jedn
jedyn waciwo, ktra zostaa przedstawiona w tabeli B.43.

Tabela B.43. Waciwo elementw sterujcych Label.


Waciwo Opis
Text Tekst wywietlany w przegldarce.
LinkButton
Elementy sterujce LinkButton reprezentuj przycisk formularzy HTML prezentowany w formie
poczenia a nie klasycznego przycisku. Waciwoci elementw sterujcych LinkButton oraz
generowane przez nie zdarzenie zostay opisane w tabeli B.44.

Tabela B.44. Waciwoci i zdarzenia elementw sterujcych LinkButton.


Waciwo Opis
CommandArgument Argument dostarczajcy dodatkowych informacji na temat waciwoci
CommandName.
CommandName Nazwa polecenia jakie naley wykona w przypadku kliknicia przycisku.
Text Tekst poczenia wywietlany na stronie.
Zdarzenie Opis
Click Zachodzi gdy przycisk zostanie kliknity.
Command Zachodzi gdy przycisk zostanie kliknity.

ListBox
Elementy sterujce ListBox reprezentuj rozwijane listy. Ich waciwoci zostay przedstawione
w tabeli B.45.

Tabela B.45. Waciwoci elementw sterujcych ListBox.


Waciwo Opis
BorderColor Kolor obramowania otaczajcego list.
BorderStyle Styl obramowania otaczajcego list.
BorderWidth Szeroko obramowania otaczajcego list.
Rows Ilo wierszy, ktre bd widoczne na licie.
SelectionMode Okrela czy na licie bdzie mona zaznaczy tylko jedn opcje (Single) czy
te dowoln ich ilo (Multiple).

Panel
Te elementy sterujce reprezentuj element kontenerowy sucy do umieszczania innych
elementw sterujcych. Waciwoci elementw sterujcych Panel zostay przedstawione w
tabeli B.46.

Tabela B.46. Waciwoci elementw sterujcych Panel.


Waciwo Opis
BackImageUrl Okrela adres URL obrazu ktry ma by wywietlony w tle elementu
sterujcego.
HorizontalAlign Okrela wyrwnanie zawartoci danego elementu sterujcego w poziomie.

Wrap Okrela czy zawarto elementu sterujcego moe by zawijana.


RadioButton
Elementy sterujce RadioButton reprezentuj przyciski opcji HTML. RadioButton jest klas
potomn klasy CheckBox, a zatem dysponuje wszystkim jej waciwociami i zdarzeniami. Nowa
waciwo, dostpna wycznie w elementach sterujcych RadioButton zostaa przedstawiona
w tabeli B.47.

Tabela B.47. Waciwoci elementw sterujcych RadioButton.


Waciwo Opis
GroupName Nazwa grupy do jakiej naley dany przycisk opcji.

RadioButtonList
Elementy sterujce RadioButtonList wywietlaj w przegldarce list powizanych ze sob
tematycznie przyciskw opcji. Waciwoci tego elementu sterujcego zostay przedstawione w
tabeli B.48.

Tabela B.48. Waciwoci elementw sterujcych RadioButtonList.


Waciwo Opis
CellPadding Wielko obszaru pomidzy elementem sterujcym RadioButton
wywietlonym w komrce a jej krawdziami.
CellSpacing Wzajemna odlego pomidzy poszczeglnymi komrkami zawierajcymi
elementy sterujce RadioButton.
RepeatColumns Liczba kolumn w jakich ma by wywietlana zawarto listy.
RepeatDirection Okrela czy elementy sterujce RadioButton maj by wywietlane w
poziomie (Horizontal) czy te w pionie (Vertical).
RepeatLayout Okrela ukad listy; waciwo moe przyjmowa warto Table (aby lista
elementw sterujcych RadioButton bya wywietlana przy wykorzystaniu
tabeli) bd Flow (aby bya wywietlana baz uycia tabeli).
TextAlign Okrela wyrwnanie tekstu skojarzonego z kadym z elementw sterujcych
RadioButton.

Repeater
Elementy sterujce Repeater wywietlaj informacje z podanego rda danych przy
wykorzystaniu podanego szablonu. Waciwoci tych elementw sterujcych oraz generowane
przez nie zdarzenia zostay przedstawione w tabeli C.49.

Tabela C.49. Waciwoci i zdarzenia elementw sterujcych Repeater.


Waciwo Opis
AlternatingItemTemplate Szablon jaki zostanie wykorzystany do modyfikowania wygldu
zawartoci danego elementu sterujcego.
DataMember Tabela ktra ma zosta uyta przy wizaniu danych (waciwo
ta jest wykorzystywana wycznie jeli waciwoci DataSource
zostanie przypisany obiekt DataSet).
DataSource rdo danych ktrego naley uy przy wizaniu danych z tym
elementem sterujcym.
FooterTemplate Szablon sucy do okrelania postaci stopki.
HeaderTemplate Szablon sucy do okrelania postaci nagwka.
Items Kolekcja obiektw klasy RepeaterItem reprezentujcych
poszczeglne elementy wywietlone w danym elemencie
sterujcym Repeater.
ItemTemplate Szablon sucy do okrelania postaci poszczeglnych elementw
wywietlanych w elemencie sterujcym Repeater.
SeparatorTemplate Szablon okrelajcy posta separatora wywietlanego pomidzy
poszczeglnymi elementami prezentowanymi w danym elemencie
sterujcym Repeater.
Zdarzenie Opis
ItemCommand Zachodzi gdy zostanie kliknity jakikolwiek przycisk
wywietlony w elemencie sterujcym Repeater. Argumentem
wywoania procedury tego zdarzenia jest obiekt klasy
RepeaterCommandEventArgs. Klasa ta definiuje nastpujce
waciwoci:
CommandArgument Argument polecenia.

CommandName Nazwa polecenia.

CommandSource Obiekt, ktry wygenerowa zdarzenie.

Item Obiekt RepeaterItem skojarzony z danym zdarzeniem.


ItemCreated Zachodzi bezporednio przed utworzeniem kadego z elementw
wywietlanych w elemencie sterujcym Repeater. Argumentem
wywoania procedury obsugi tej metody jest obiekt klasy
RepeaterItemEventArgs. Klasa ta definiuje jedn waciwo:

Item Okrela aktualnie wybrany element.


ItemDataBound Zachodzi gdy z elementem wywietlanym w elemencie
sterujcym Repeater s wizane dane. Argumentem wywoania
procedury obsugi tego zdarzenia jest obiekt klasy
RepeaterItemEventArgs.

Table, TableCell oraz TableRow


Elementy sterujce Table, TableCell oraz TableRow reprezentuj tabele HTML, ich komrki
oraz wiersze. Waciwoci elementw sterujcych Table zostay przedstawione w tabeli B.50.

Tabela B.50. Waciwoci elementw sterujcych Table.


Waciwo Opis
BackImageUrl Adres URL obrazu ktry ma zosta wywietlony w tle tabeli.
CellPadding Wielko obszaru pomidzy zawartoci komrek tabeli a ich krawdziami.
CellSpacing Wielko wzajemnych odlegoci pomidzy poszczeglnymi komrkami
tabeli.
GridLines Styl linii wywietlanych pomidzy poszczeglnymi komrkami tabeli;
waciwo ta moe przyjmowa wartoci: Both, Horizontal, None bd
Vertical.
HorizontalAlign Wyrwnanie tabeli w poziomie.

Rows Zwraca obiekt klasy TableRowCollection reprezentujcy wszystkie


wiersze tabeli.

W tabeli B.51 zostay przedstawione waciwoci elementw sterujcych TableCell. Naley


zauway, i dostpne s take elementy sterujce TableHeaderCell. Klasa TableHeaderCell
dziedziczy po klasie TableCell i udostpnia te same waciwoci.

Tabela B.51. Waciwoci elementw sterujcych TableCell.


Waciwo Opis
ColumnSpan Ilo kolumn ktre obejmuj dana komrka tabeli.
HorizontalAlign Wyrwnanie zawartoci komrki w poziomie.

RowSpan Ilo wierszy ktre obejmuje dana komrka tabeli.


Text Tekst wywietlany w danej komrce tabeli.
VerticalAlign Wyrwnanie zawartoci komrki w pionie.
Wrap Okrela czy tekst wywietlany w komrce moe by zawijany.

Tabela B.52 przedstawia waciwoci elementw sterujcych TableRow.


Waciwo Opis
Cells Zwraca obiekt klasy TableCellCollection reprezentujcy wszystkie
komrki tabeli zapisane w danym jej wierszu.
HorizontalAlign Wyrwnanie zawartoci komrek w poziomie.

VerticalAlign Wyrwnanie zawartoci komrek w pionie.

TemplateColumn
Elementy sterujce TemplateColumn reprezentuj kolumny wywietlane w elementach
sterujcych DataGrid. Waciwoci tych elementw sterujcych zostay przedstawione w tabeli
B.53.

Tabela B.53. Waciwoci elementw sterujcych TemplateColumn.


Waciwo Opis
EditItemTemplate Szablon okrelajcy sposb wywietlania elementu znajdujcego si w
trybie edycji.
FooterTemplate Szablon okrelajcy wygld stopki danej kolumny.
HeaderTemplate Szablon okrelajcy wygld nagwka danej kolumny.
ItemTemplate Szablon okrelajcy wyglda zwyczajnych elementw danej kolumny.
TextBox
Elementy sterujce TextBox reprezentuj pola tekstowe HTML. Waciwoci tych elementw
sterujcych oraz generowane przez nie zdarzenia zostay przedstawione w tabeli B.54.

Tabela B.54. Waciwoci i zdarzenia elementw sterujcych TextBox.


Waciwo Opis
AutoPostBack Okrela czy formularz powinien zosta przesany bezporednio po zgoszeniu
zdarzenia TextChanged.
Columns Okrela szeroko pola wyraon jako ilo znakw jakie bd w nim
widoczne.
MaxLength Okrela maksymaln ilo znakw ktre bdzie mona wpisa w danym polu.
ReadOnly Okrela czy zawarto pola bdzie przeznaczona tylko do odczytu.
Rows Ilo wierszy jakie naley wywietla w przypadku gdy dany element
sterujcy jest prezentowany w formie wielowierszowego pola tekstowego.
Text Tekst wywietlany w polu.
TextMode Okrela sposb dziaania elementu sterujcego; waciwo ta moe
przyjmowa nastpujce wartoci: MultiLine, Password oraz SingleLine
(warto domylna).
Wrap Okrela czy w przypadku wielowierszowego pola tekstowego, tekst powinien
by zawijany.
Zdarzenie Opis
TextChanged Zgaszane po przesaniu formularza, gdy okae si e warto waciwoci
Text ulega zmianie.

Elementy sterujce suce do kontroli


poprawnoci danych
W tej czci rozdziau zostay przedstawione szczegowe informacje o waciwociach
wszystkich elementw sterujcych ASP.NET sucych do kontroli poprawnoci danych.
Elementy te su do kontroli poprawnoci informacji podawanych w innych elementach
sterujcych.

Wsplne waciwoci wszystkich elementw


sterujcych sucych do kontroli poprawnoci
danych
W tabeli B.55 zostay przedstawione waciwoci i metody dostpne we wszystkich elementach
sterujcych sucych do kontroli poprawnoci za wyjtkiem elementu sterujcego
ValidationSummary. Waciwoci te i metody dziedziczone s po klasie
System.Web.UI.WebControls.BaseValidator.

Tabela B.55. Waciwoci i metody klasy BaseValidator.


Waciwo Opis
ControlToValidate Okrela element sterujcy zawierajcy informacje ktrych poprawno
naley sprawdzi.
Display Sposb prezentacji danego elementu sterujcego; waciwo ta moe
przyjmowa nastpujce wartoci:
None Komunikat o bdzie nie bdzie wywietlany.

Static Jeli podczas sprawdzenia poprawnoci danych pojawi si


bdy, to komunikat o nich zostanie wywietlony na miejscu elementu
sterujcego, ktrego zawarto bya sprawdzana. W takim przypadku
element sterujcy jest uwzgldniany (zabiera miejsce) w oglnym
ukadzie strony, nawet jeli aktualnie nie jest wywietlany aden
komunikat o bdzie.
Dynamic Komunikaty s wywietlane jeli podczas sprawdzania
poprawnoci danych pojawi si jakie bdy, a jeli aden komunikat
nie jest wywietlany, to element sterujcy nie jest uwzgldniany w
ukadzie strony.
EnableClientScript Okrela czy naley wygenerowa skrypt, ktry bdzie sprawdza
poprawno danych po stronie klienta.
ErrorMessage Komunikat jaki naley wywietli w przypadku podania niepoprawnych
informacji.
ForeColor Kolor jakim naley wywietli komunikat.
IsValid Okrela czy informacje wprowadzone w elemencie sterujcym
okrelonym we waciwoci ControlToValidate s poprawne.
Metoda Opis
Validate Okrela czy sprawdzana zawarto wskazanego elementu sterujcego
jest poprawna czy nie i odpowiednio okrela warto waciwoci
IsValid.

Elementy sterujce suce do kontroli


poprawnoci danych
W tej czci rozdziau zostay podane szczegowe informacje na temat wszystkich elementw
sterujcych sucych do kontroli poprawnoci danych. Aby elementy te dziaay poprawnie, w ich
waciwoci ControlToValidate naley okreli element sterujcy, ktrego zawarto ma by
sprawdzana.

CompareValidator
Ten elementy sterujca porwnuj wartoci podane w sprawdzanym elemencie sterujcym z inn
wartoci bd z wartoci podan w innym elemencie sterujcym. Waciwoci elementw
sterujcych CompareValidator zostay przedstawione w tabeli B.56.

Tabela B.56. Waciwoci elementw sterujcych CompareValidator.


Waciwo Opis
ControlToCompare Identyfikator elementu sterujcego z ktrym maj by porwnywane
wartoci sprawdzanego elementu sterujcego.
Operator Okrela operacj jak naley wykona; waciwo ta moe przyjmowa
nastpujce wartoci: DataTypeCheck, Equal, GreaterThan,
GreaterThanEqual, LessThan, LessThanEqual bd NotEqual.
ValueToCompare Warto staa z jak maj by porwnywane wartoci sprawdzanego
elementu sterujcego.

CustomValidator
Elementy sterujce CustomValidator umoliwiaj realizacj kontroli poprawnoci danych przy
wykorzystaniu procedury wykonywanej po stronie klienta lub na serwerze i napisanej przez
twrc strony ASP.NET. Waciwoci tych elementw sterujcych oraz generowane przez nie
zdarzenia zostay przedstawione w tabeli B.57.

Tabela B.57. Waciwoci i zdarzenia elementw sterujcych CustomValidator.


Waciwo Opis
ClientValidationFunction Funkcja, ktra powinna zosta wykonana po stronie klienta w
celu okrelenia czy informacje podane we wskazanym
elemencie sterujcym s poprawne.
Zdarzenie Opis
ServerValidate Zachodzi po przesaniu formularza na serwer i okrela jaka
metoda powinna zosta wykonana w celu okrelenia czy
informacje podane we wskazanym elemencie sterujcym s
poprawne.

RangeValidator
Elementy sterujce RangeValidator porwnuj warto zapisan w sprawdzanym elemencie
sterujcym z okrelonym zakresem wartoci dopuszczalnych. Waciwoci tych elementw
sterujcych zostay przedstawione w tabeli B.58.

Tabela B.58. Waciwoci elementw sterujcych RangeValidator.


Waciwo Opis
MaximumValue Warto maksymalna jak moe przyj sprawdzany element sterujcy; moe to
by liczba lub acuch znakw.
MinimumValue Warto minimalna jak moe przyj sprawdzany element sterujcy; moe to
by liczba lub acuch znakw.

RegularExpressionValidator
Elementy sterujce RegularExpressionValidator porwnuj zawarto wskazanego
elementu sterujcego z podanym wyraeniem regularnym. Jedyna waciwo tych elementw
sterujcych zostaa przedstawiona w tabeli B.59.

Tabela B.59. Waciwo elementw sterujcych RegularExpressionValidator.


Waciwo Opis
ValidationExpression Wyraenie regularne ktre zostanie uyte do sprawdzenia
poprawnoci wskazanego elementu sterujcego.
RequiredFieldValidator
Elementy sterujce RequiredFieldValidator zapewniaj, e w sprawdzanym elemencie
sterujcym zostan wpisane jakie informacje (innymi sowy, e element ten nie bdzie pusty).
Jedyna waciwo tych elementw sterujcych zostaa przedstawiona w tabeli B.60.

Tabela B.60. Waciwo elementw sterujcych RequiredFieldValidator.


Waciwo Opis
InitialValue Warto pocztkowa sprawdzanego elementu sterujcego.

ValidationSummary
Elementy sterujce ValidationSummary stanowi punkt centralny dla wszystkich innych
elementw sucych do kontroli poprawnoci podawanych informacji i umoliwiaj wywietlanie
wszystkich komunikatw o bdach. Elementw tych mona uywa w poczeniu z
komunikatami o bdach generowanymi przez inne elementy sterujce suce do kontroli
poprawnoci danych. Ich waciwoci zostay przedstawione w tabeli B.61.

Tabela B.61. Waciwoci elementw sterujcych ValidationSummary.


Waciwo Opis
DisplayMode Okrela zachowanie danego elementu sterujcego; waciwo ta moe
przyjmowa nastpujce wartoci: BulletList, List oraz
SingleParagraph.
EnableClientScript Okrela czy naley sprawdza poprawno danych po stronie klienta.

ForeColor Kolor jakim maj by wywietlane komunikaty o bdach.


HeaderText Nagwek wywietlany w tym elemencie sterujcym.
ShowMessageBox Okrela czy komunikaty o bdach maj by wywietlane w okienku
dialogowym.
ShowSummary Okrela czy podsumowanie wynikw kontroli poprawnoci danych ma
by wywietlane na stronie WWW.
Dodatek C
Obiekty ADO.NET:
Waciwoci i metody
ADO.NET skada si z dwch podstawowych czci klasy DataSet wraz z innymi klasami
zwizanymi z ni oraz z zarzdzanych dostawcw danych, ktrzy uatwiaj komunikacj ze
rdami danych. W niniejszym dodatku zostan opisane wszystkie klasy nalece do obu czci
ADO.NET.

Klasa DataSet i klasy z ni zwizane


W tej czci rozdziau zostan podane szczegowe informacje na temat klasy DataSet oraz klas
bezporednio z ni zwizanych, takich jak DataRelation, DataTable i tak dalej.
Klasa DataSet suy do przechowywania danych w pamici i udostpnia spjne moliwoci
programowej obsugi tych danych niezalenie od ich typu. Obiekty tej klasy zawieraj kompletny
zbir danych, wcznie z narzucanymi na nie ograniczeniami, wzajemnymi relacjami, a nawet
wieloma, wykorzystywanymi jednoczenie tabelami. Oglny schemat modelu danych
dostarczanego przez klas DataSet zosta przedstawiony na rysunku C.1.

Rysunek C.1. Model klasy DataSet

Klasy Constraint oraz ConstraintCollection


Obiekty klasy Constraint reprezentuj reguy narzucane na tabel i ograniczajce informacje
jakie mog zosta zmodyfikowane. Waciwoci tej klasy zostay przedstawione w tabeli C.1.

Tabela C.1. Waciwoci klasy Constraint.


Waciwo Opis
ConstraintName Nazwa danego ograniczenia.
Table Waciwo zwraca obiekt DataTable ktrego dotyczy ograniczenie.

W tabeli C.2 zostay przedstawione wszystkie waciwoci, metody oraz zdarzenia klasy
ConstraintCollection.

Waciwo Opis
Item Waciwo zwraca ograniczenie (obiekt klasy Constraint) zapisane w
kolekcji, okrelajc je na podstawie podanej nazwy bd indeksu.
Metoda Opis
Add Dodaje ograniczenie do kolekcji. Metoda ta jest przeciona, wicej
informacji na jej temat mona znale w dokumentacji .NET SDK.
CanRemove Okrela czy ograniczenie podane jako argument wywoania metody moe
(ograniczenie) zosta usunite z obiektu klasy DataTable.
Clear Usuwa z kolekcji wszystkie obiekty Constraint.
Contains (nazwa) Sprawdza czy w kolekcji znajduje si obiekt Constraint o podanej
nazwie.
IndexOf Zwraca indeks podanego ograniczenia. Ta metoda jest przeciona,
wicej informacji na jej temat mona znale w dokumentacji .NET SDK.
Remove Usuwa wskazane ograniczenie z kolekcji. Ta metoda jest przeciona,
wicej informacji na jej temat mona znale w dokumentacji .NET SDK.
RemoveAt Usuwa z kolekcji obiekt Constraint o podanym indeksie.
Zdarzenie Opis
CollectionChanged Zdarzenie to zachodzi gdy w wyniku dodania lub usunicia elementu
zmienia si zawarto kolekcji. Argumentem przekazywanych w
wywoaniu procedury obsugi tego zdarzenia jest obiekt klasy
CollectionChangeEventArgs. Klasa ta udostpnia nastpujce
waciwoci:
Action Waciwo moe zwraca wartoci (Add, Remove, Refresh)
okrelajce wykonan czynno.
Element Zwraca kopi kolekcji, ktra zostaa zmieniona.

Klasy DataColumn oraz DataColumnCollection


Klasa DataColumn reprezentuje kolekcj informacji przechowywanych w obiektach DataTable.
Waciwoci, metody oraz zdarzenia tej klasy zostay przedstawione w tabeli C.3.

Tabela C.3. Waciwoci, metody oraz zdarzenia klasy DataColumn.


Waciwo Opis
AllowDBNull Waciwo okrela czy w tej kolumnie mog by zapisywane wartoci
null.
AutoIncrement Okrela czy wartoci w tej kolumnie s automatycznie inkrementowane
w momencie dodawania nowego wiersza.
AutoIncrementSeed Warto pocztkowa dla automatycznej inkrementacji pl kolumny.
AutoIncrementStep Warto uywana do inkrementacji wartoci pl tej kolumny.
Caption Tytu kolumny.
ColumnMapping Zwraca obiekt klasy MappingType okrelajcy w jaki sposb kolumna
bdzie odwzorowywana w przypadku zapisu danych w formacie XML.
ColumnName Nazwa kolumny.
DataType Typ danych przechowywanych w kolumnie.
DefaultValue Domylna warto zapisywana w polach tej kolumny w czasie tworze
nowych wierszy.
Expression Wyraenie uywane do filtrowania wierszy, obliczania wartoci pl lub
tworzenia kolumn zagregowanych, zapisane w formie acucha znakw.
ExtendedProperties Zwraca obiekt klasy PropertyCollection zawierajcy informacje
podane przez uytkownika.
Namespace Przestrze nazw XML zawierajca elementy wykorzystywane w tej
kolumnie.
Ordinal Pooenie tej kolumny w obiekcie DataColumnCollection.
Prefix Prefiks ktrym poprzedzana jest nazwa kolumny w przypadku
zapisywania danych w formacie XML.
ReadOnly Okrela czy w danej kolumnie mona wprowadza jakiekolwiek
modyfikacje.
Table Zwraca obiekt klasy DataTable do ktrego naley dana kolumna.
Unique Okrela czy wartoci zapisywane w poszczeglnych polach tej kolumny
musz by unikalne.
Metoda Opis
ToString Zwraca obiekt klasy Expression dla danej kolumny (jeli istnieje), a w
przeciwnym przypadku nazw kolumny.
Zdarzenie Opis
PropertyChanged Zdarzenie jest generowane w razie modyfikacji ktrej z waciwoci
kolumny. Argumentem wywoania procedury obsugi tego zdarzenia jest
obiekt klasy PropertyChangedEventArgs, zawierajcy nastpujc
waciwo:
PropertyName Nazwa waciwoci ktra ulega zmianie.

W tabeli C.4 zostay przedstawione waciwoci, metody oraz zdarzenia klasy


DataColumnCollection.

Tabela C.4. Waciwoci, metody i zdarzenia klasy DataColumnCollection.


Waciwo Opis
Item Pobiera z kolekcji obiekt klasy DataColumn okrelony za pomoc
nazwy kolumny lub indeksu.
Metoda Opis
Add Dodaje kolumn do kolekcji. Metoda przeciona, wicej informacji na
jej temat mona znale w dokumentacji .NET SDK.
AddRange Dodaje do kolekcji tablic obiektw DataColumn.
CanRemove Sprawdza czy kolumna okrelona przy uyciu argumentu kolumna moe
(kolumna) zosta usunita z kolekcji.
Clear Usuwa z kolekcji wszystkie obiekty DataColumn.
Contains(nazwa) Okrela czy w kolekcji istnieje obiekt DataColumn reprezentujcy
kolumn o podanej nazwie.
IndexOf Okrela indeks danej kolumny. Metoda przeciona, wicej informacji
na jej temat mona znale w dokumentacji .NET SDK.
Remove Usuwa z kolekcji wskazan kolumn. Metoda przeciona, wicej
informacji na jej temat mona znale w dokumentacji .NET SDK.
RemoveAt Usuwa z kolekcji kolumn o podanym indeksie.
Zdarzenie Opis
CollectionChanged Zdarzenie to zachodzi gdy w wyniku dodania lub usunicia elementu
zmienia si zawarto kolekcji. Argumentem przekazywanych w
wywoaniu procedury obsugi tego zdarzenia, jest obiekt klasy
CollectionChangeEventArgs. Klasa ta udostpnia nastpujce
waciwoci:
Action Waciwo moe zwraca wartoci (Add, Remove,
Refresh) okrelajce wykonan czynno.

Element Zwraca kopi kolekcji, ktra zostaa zmieniona.

Klasy DataRelation oraz DataRelationCollection


Obiekty klasy DataRelation reprezentuj wzajemne relacje wystpujce pomidzy tabelami
przechowywanymi w obiekcie DataSet. Waciwoci i zdarzenia tej klasy zostay przedstawione
w tabeli C.5.

Tabela C.5. Waciwoci i metody klasy DataRelation.


Waciwo Opis
ChildColumns Zwraca tablic obiektw klasy DataColumn reprezentujcych
kolumny podrzdne danej relacji.
ChildKeyConstraint Obiekt klasy ForeignKeyConstraint dla danej relacji.
ChildTable Zwraca obiekt klasy DataTable reprezentujcy tabel podrzdn
danej relacji.
DataSet Zwraca obiekt DataSet do ktrego naley dana relacja.
ExtendedProperties Zwraca obiekt PropertyCollection zawierajcy informacje podane
przez uytkownika.
Nested Okrela czy relacja jest zagniedona.
ParentColumns Zwraca obiekt klasy DataColumn reprezentujcy nadrzdn kolumn
danej relacji.
ParentKeyConstraint Obiekt klasy UniqueConstraint dla danej relacji.

ParentTable Zwraca obiekt klasy DataTable reprezentujcy nadrzdna tabel


danej relacji.
RelationName Nazwa relacji.
Zdarzenie Opis
PropertyChanged Zdarzenie jest generowane w razie modyfikacji ktrej z waciwoci
relacji. Argumentem wywoania procedury obsugi tego zdarzenia jest
obiekt klasy PropertyChangedEventArgs, zawierajcy nastpujc
waciwo:
PropertyName Nazwa waciwoci ktra ulega zmianie.

Tabela C.6 zawiera waciwoci, metody oraz zdarzenia klasy DataRelationCollection.


Tabela C.6. Waciwoci, metody oraz zdarzenia klasy DataRelationCollection.
Waciwo Opis
Item Pobiera z kolekcji obiekt DataRelation na podstawie podanej nazwy
relacji lub jej indeksu.
Metoda Opis
Add Dodaje relacj do kolekcji. Metoda przeciona, wicej informacji na
jej temat mona znale w dokumentacji .NET SDK.
AddRange Dodaje do kolekcji tablic z obiektami DataRelation.
Clear Usuwa z kolekcji wszystkie obiekty DataRelation.
Contains(nazwa) Okrela czy obiekt DataRelation reprezentujcy relacj o podanej
nazwie istnieje w kolekcji.
Remove Usuwa wskazan relacj z kolekcji. Metoda przeciona, wicej
informacji na jej temat mona znale w dokumentacji .NET SDK.
RemoveAt Usuwa z kolekcji relacj (obiekt DataRelation) o podanym indeksie.
Zdarzenie Opis
CollectionChanged Zdarzenie to zachodzi gdy w wyniku dodania lub usunicia elementu
zmienia si zawarto kolekcji. Argumentem przekazywanych w
wywoaniu procedury obsugi tego zdarzenia, jest obiekt klasy
CollectionChangeEventArgs. Klasa ta udostpnia nastpujce
waciwoci:
Action Waciwo moe zwraca wartoci (Add, Remove,
Refresh) okrelajce wykonan czynno.

Element Zwraca kopi kolekcji, ktra zostaa zmieniona.

Klasy DataRow oraz DataRowCollection


Obiekty klasy DataRow reprezentuj wiersze informacji przechowywane w obiektach DataTable
czyli poszczeglne rekordy danych. Waciwoci i metody tej klasy zostay przedstawione w
tabeli C.7.

Tabela C.7. Waciwoci i metody klasy DataRow.


Waciwo Opis
HasErrors Waciwo okrela czy w danych zapisanych w tym wierszu wystpuj
jakie bdy.
Item Zwraca dan przechowywan we wskazanej kolumnie. Metoda
przeciona, wicej informacji na jej temat mona znale w
dokumentacji .NET SDK.
ItemArray Zwraca tablic zawierajc wszystkie dane przechowywane w danym
wierszu.
RowError Opis bdu wystpujcego w danym wierszu.
RowState Waciwo okrela stan wiersza. Moe przyjmowa nastpujce
wartoci: Detached, Unchanged, New, Deleted oraz Modified.
Table Zwraca obiekt klasy DataTable do ktrego naley dany wiersz.
Metoda Opis
AcceptChanges Zatwierdza wszelkie modyfikacje wprowadzone w danym wierszu.
BeginEdit Rozpoczyna operacj edycji danego wiersza.
CancelEdit Przerywa operacj edycji i odrzuca wszelkie wprowadzone modyfikacje.
ClearErrors Usuwa wszystkie bdy wystpujce w danym wierszu.
Delete Usuwa wiersz.
EndEdit Zakacza operacj edycji danego wiersza.
GetChildRows Zwraca tablic obiektw DataRow reprezentujcych wiersze podrzdne w
stosunku do danego wiersza, w przypadku zastosowania podanego
obiektu DataRelation.
GetColumnError Zwraca bd wystpujcy w podanej kolumnie wiersza. Metoda
przeciona, wicej informacji na jej temat mona znale w
dokumentacji .NET SDK.
GetColumnsInError Zwraca tablic obiektw DataColumn reprezentujcych kolumny w
ktrych wystpuj bdy.
GetParentRow Zwraca obiekt DataRow reprezentujcy wiersz nadrzdny w stosunku do
danego. Metoda przeciona, wicej informacji na jej temat mona
znale w dokumentacji .NET SDK.
GetParentRows Zwraca tablic zawierajc wiersze nadrzdne w stosunku do danego, w
przypadku wykorzystania podanego obiektu DataRelation. Metoda
przeciona, wicej informacji na jej temat mona znale w
dokumentacji .NET SDK.
HasVersion Okrela czy istnieje podana wersja danego wiersza.
(wersja)
IsNull Okrela czy podana kolumna wiersza zawiera warto null. Metoda
przeciona, wicej informacji na jej temat mona znale w
dokumentacji .NET SDK.
IsUnspecified Okrela czy warto wskazanej kolumny nie zostaa okrelona. Metoda
przeciona.
RejectChanges Odtwarza wszelkie modyfikacje wprowadzone w wierszu.
SetColumnError Podaje opis bdu dla danej kolumny. Metoda przeciona.
SetParentRow Podaje wiersz nadrzdny dla danego wiersza podrzdnego. Metoda
przeciona.
SetUnspecified Okrela, e warto wskazanej kolumny danego wiersza ma by
nieokrelona. Metoda przeciona.

W tabeli C.8 zostay przedstawione waciwoci i metody klasy DataRowCollection.

Tabela C.8. Waciwoci i metody klasy DataRowCollection.


Waciwo Opis
Item Zwraca z kolekcji obiekt DataRow reprezentujcy wiersz o okrelonej
nazwie lub indeksie.
Metoda Opis
Add Dodaje wiersz do kolekcji. Metoda przeciona.
Clear Usuwa z kolekcji wszystkie obiekty klasy DataRow.
Contains(nazwa) Okrela czy obiekt DataRow o podanej nazwie istnieje w kolekcji.
Find Zwraca okrelony obiekt DataRow. Metoda przeciona.
Remove Usuwa z kolekcji okrelony obiekt DataRow. Metoda przeciona.
RemoveAt Usuwa z kolekcji obiekt DataRow o okrelonym indeksie.

Klasa DataSet
Waciwoci, metody oraz zdarzenia tej klasy zostay opisane w tabeli C.9.

Tabela C.9. Waciwoci, metody oraz zdarzenia klasy DataSet.


Waciwo Opis
CaseSensitive Waciwo okrela czy przy porwnywaniu acuchw znakw
w tym obiekcie DataSet bdzie uwzgldniana wielko liter.
DataSetName Nazwa danego obiektu DataSet.
DefaultViewManager Zwraca obiekt klasy DataViewManager zawierajcy informacje
o zmodyfikowanym sposobie prezentacji danego obiektu
DataSet.
EnforceConstraints Waciwo okrela czy przy aktualizacji danych maj by
wymuszane reguy.
ExtendedProperties Obiekt PropertyCollection zawierajcy informacje
okrelane przez uytkownika.
HasErrors Informuje czy dane zapisane w ktrymkolwiek z wierszy
przechowywanych w danym obiekcie DataSet zawieraj bdy.
Locale Informacje lokalne uywane przy porwnywaniu acuchw
znakw. Waciwo ta zwraca obiekt klasy CultureInfo.
Prefix Synonim XML okrelajcy przestrze nazw danego obiektu
DataSet.
Relations Obiekt klasy DataRelationCollection reprezentujcy
wszystkie relacje wystpujce pomidzy tabelami
przechowywanym w danym obiekcie DataSet.
Site Zwraca interfejs ISite do obiektu klasy DataSet (sucy do
wizania komponentw z obiektami zawierajcymi dane).
Tables Obiekt klasy DataTableCollection reprezentujcy wszystkie
tabele przechowywane w danym obiekcie DataSet.
Xml Dane przechowywane w danym obiekcie DataSet, zapisane w
formacie XML.
XmlSchema Schemat XML wykorzystywany w danym obiekcie DataSet.
Metoda Opis
AcceptChanges Zatwierdza wszelkie modyfikacje wprowadzone w danym
obiekcie DataSet.
BeginInit Rozpoczyna inicjalizacj obiektu DataSet w trakcie dziaania
programu.
Clear Usuwa wszystkie wiersze ze wszystkich tabel zapisanych w
danym obiekcie DataSet.
Clone Tworzy obiekt DataSet stanowicy dokadn kopi danego
obiektu, lecz bez danych.
Copy Tworzy obiekt DataSet stanowicy dokadn kopi danego
obiektu i zawierajcy wszystkie dane.
EndInit Zakacza proces inicjalizacji obiektu DataSet w trakcie
dziaania programu.
GetChanges Tworzy nowy obiekt klasy DataSet zawierajcy wycznie
dane, ktre zostay zmodyfikowane.
HasChanges Okrela czy informacje w danym obiekcie DataSet ulegy
jakimkolwiek zmianom.
InferXmlSchema Tworzy struktur danych na podstawie rda danych XML.
Metoda przeciona, wicej informacji na jej temat mona
znale w dokumentacji .NET SDK.
Marge(DataSet) czy dany obiekt DataSet z obiektem podanym jako argument
wywoania metody.
ReadXmlSchema Tworzy struktur danych na podstawie schematu XML. Metoda
przeciona, wicej informacji na jej temat mona znale w
dokumentacji .NET SDK.
RejectChanges Odtwarza wszelkie zmiany jakie zostay wprowadzone w
obiekcie DataSet.
ResetRelations Przywraca domyln warto waciwoci Relations.
ResetTables Przywraca domyln warto waciwoci Tables.
ShouldSerializeRelations Informuje czy warto waciwoci Relations powinna zosta
zachowana.
ShouldSerializeTables Informuje czy warto waciwoci Tables powinna zosta
zachowana.
WriteXml Zapisuje zawarto obiektu DataSet w formacie XML. Metoda
przeciona, wicej informacji na jej temat mona znale w
dokumentacji .NET SDK.
WriteXmlSchema Zapisuje struktur obiektu DataSet w formacie XML. Metoda
przeciona, wicej informacji na jej temat mona znale w
dokumentacji .NET SDK.
Zdarzenie Opis
MergeFailed Zdarzenie jest generowane gdy zarwno rdowy jak i
docelowy obiekt DataSet bdzie mia t sam warto klucza
gwnego, a jednoczenie waciwo EnforceConstraints
bdzie miaa warto true.
PropertyChanged Zdarzenie jest generowane w razie modyfikacji ktrej z
waciwoci kolumny. Argumentem wywoania procedury
obsugi tego zdarzenia jest obiekt klasy
PropertyChangedEventArgs, zawierajcy nastpujc
waciwo:
PropertyName Nazwa waciwoci ktra ulega zmianie.
Klasy DataTable oraz DataTableCollection
Obiekty klasy DataTable reprezentuj tabele danych, przechowywane w obiektach DataSet;
waciwoci, metody oraz zdarzenia tej klasy zostay przedstawione w tabeli C.10.

Tabela C.10. Waciwoci, metody i zdarzenia klasy DataTable.


Waciwo Opis
CaseSensitive Okrela czy przy porwnywaniu acuchw znakw w danej
tabeli ma by uwzgldniana wielko liter.
ChildRelations Zwraca obiekt klasy DataRelationCollection
zawierajcy relacje podrzdne dla danej tabeli.
Columns Zwraca obiekt kasy DataColumnCollection
reprezentujcy kolumny danej tabeli.
Constraints Zwraca obiekt klasy ConstraintCollection
reprezentujcy wszystkie reguy obowizujce dane
przechowywane w tej tabeli.
DataSet Zwraca obiekt DataSet do ktrego naley dana tabela.
DefaultView Zwraca obiekt DataView reprezentujcy zmodyfikowany
sposb prezentacji danych przechowywanych w danej tabeli.
DisplayExpression Wyraenie acuchowe okrelajce w jaki sposb dana tabela
ma by wywietlana w elementach sterujcych interfejsu
uytkownika.
ExtendedProperties Zwraca obiekt klasy PropertyCollection zawierajcy
informacje podane przez uytkownika.
HasErrors Waciwo informuje czy w ktrymkolwiek z wierszy tej
tabeli wystpuj jakiekolwiek bdy.
Locale Obiekt klasy CultureInfo uywany do okrelania sposobu
porwnywania acuchw znakw.
MinimumCapacity Pocztkowa wielko danego tabeli.
Namespace Przestrze nazw XML zawierajca elementy stosowane w
danej tabeli.
ParentRelations Obiekt klasy DataRelationCollection zawierajcy
nadrzdne relacje dla danej tabeli.
Prefix Prefiks wykorzystywany podczas zapisywania danej tabeli w
formacie XML.
PrimaryKey Tablica obiektw DataColumn reprezentujcych kolumny
speniajce funkcj klucza gwnego tabeli.
Rows Obiekt klasy DataRowCollection reprezentujcy wszystkie
wiersze nalece do danej tabeli.
Site Zwraca interfejs ISite do obiektu DataTable (sucy do
wizania komponentw z obiektami zawierajcymi dane).
TableName Nazwa tabeli.
Metoda Opis
AcceptChanges Zatwierdza wszelkie modyfikacje wprowadzone w danej
tabeli.
BeginInit Rozpoczyna proces inicjalizacji tabeli.
BeginLoadData Rozpoczyna proces pobierania danych i zapisywania ich w
tabeli.
Clear Usuwa wszystkie dane przechowywane w tabeli.
Compute(wyr, filtr) Oblicza warto wyraenia okrelonego jako argument wyr,
w wierszach ktre speniaj kryterium okrelone jako
argument filtr.
EndInit Koczy proces inicjalizacji tabeli.
EndLoadData Koczy proces pobierania danych.
GetErrors Tablica obiektw klasy DataRow, w ktrych wystpuj bdy.
LoadDataRow(wartosci(), Wypenia i aktualizuje obiekt DataRow wartociami
akceptuj) przekazanymi w tablicy wartosci. Drugi argument
wywoania metody okrela czy aktualizacja powinna zosta
zatwierdzona. Jeli nie zostanie odnaleziony aden wiersza,
metoda utworzy nowy.
NewRow Zwraca pusty obiekt DataRow utworzony na bazie tego
samego schematu co caa tabela.
RejectChanges Odtwarza wszelkie modyfikacje wprowadzone w tabeli.
ResetColumns Przywraca domyln warto waciwoci Columns.
ResetConstraints Przywraca domyln warto waciwoci Constraints.
ResetPrimaryKey Przywraca domyln warto waciwoci PrimaryKey.
Select Zwraca tablic obiektw DataRow. Metoda jest przeciona.
ShouldSerializeColumns Okrela czy naley zachowa warto waciwoci Columns.
ShouldSerializeConstraints Okrela czy naley zachowa warto waciwoci
Constraints.
ShouldSerializePrimaryKey Okrela czy naley zachowa warto waciwoci
PrimaryKey.
ToString Zwraca warto waciwoci TableName oraz
DisplayExpression dla danej tabeli.

Zdarzenia Opis
ColumnChanged Zdarzenie jest generowane w razie modyfikacji ktrej z
kolumn. Argumentem wywoania procedury obsugi tego
zdarzenia jest obiekt klasy
DataColumnChangedEventArgs, zawierajcy nastpujce
waciwo:
Column Modyfikowana kolumna.

ProposedValue Warto jaka ma zosta przypisana


danemu polu tabeli.
Row Modyfikowany wiersz tabeli.
ColumnChanging Zdarzenie zachodzi po wprowadzeniu zmian w tabeli.
Procedura obsugi tego zdarzenia wykorzystuje obiekt klasy
DataColumnChangedEventArgs.
PropertyChanged Zdarzenie jest generowane w razie modyfikacji ktrej z
waciwoci tabeli. Argumentem wywoania procedury
obsugi tego zdarzenia jest obiekt klasy
PropertyChangedEventArgs, zawierajcy nastpujc
waciwo:
PropertyName Nazwa waciwoci ktra ulega zmianie.
RowChanged Zdarzenie jest generowane w razie zmiany zawartoci
wiersza. Argumentem wywoania procedury obsugi tego
zdarzenia jest obiekt klasy DataRowChangedEventArgs,
zawierajcy nastpujce waciwo:
Action Okrela czynno jaka zostaa wykonana na
danym obiekcie DataRow.
Row Okrela obiekt DataRow, ktry naley zmieni.
RowChanging Zdarzenie to jest generowane po wprowadzeniu zmian w
danym wierszu. W procedurze obsugi tego zdarzenia
wykorzystywany jest obiekt klasy
DataRowChangedEventArgs.
RowDeleted Zdarzenie to jest generowane po usuniciu wiersza. W
procedurze obsugi tego zdarzenia wykorzystywany jest
obiekt klasy DataRowChangedEventArgs.
RowDeleting Zdarzenie to jest generowane przed usuniciem wiersza. W
procedurze obsugi tego zdarzenia wykorzystywany jest
obiekt klasy DataRowChangedEventArgs.

W Tabeli C.11 zostay przedstawione waciwoci, metody oraz zdarzenia klasy


DataTableCollection.

Tabela C.11. Waciwoci, metody i zdarzenia klasy DataTableCollection.


Waciwo Opis
Item Pobiera obiekt DataTable z kolekcji na podstawie nazwy tabeli lub jej
indeksu.
Metoda Opis
Add Dodaje tabel do kolekcji. Metoda przeciona.
AddRange Dodaje do kolekcji tablic obiektw DataTable.
CanRemove(tabela) Okrela czy z kolekcji mona usun obiekt DataTable
reprezentujcy wskazan tablic.
Clear Usuwa z kolekcji wszystkie obiekty DataTable.
Contains(nazwa) Sprawdza czy obiekt DataTable reprezentujcy tablic o podanej
nazwie istnieje w kolekcji.
IndexOf Zwraca indeks okrelonej tabeli. Metoda przeciona.
Remove Usuwa z kolekcji wskazan tabel. Metoda przeciona.
RemoveAt Usuwa z kolekcji obiekt DataTable o okrelonym indeksie.
Zdarzenia
CollectionChanged Zdarzenie to zachodzi gdy w wyniku dodania lub usunicia elementu
zmienia si zawarto kolekcji. Argumentem przekazywanych w
wywoaniu procedury obsugi tego zdarzenia, jest obiekt klasy
CollectionChangeEventArgs. Klasa ta udostpnia nastpujce
waciwoci:
Action Waciwo moe zwraca wartoci (Add, Remove,
Refresh) okrelajce wykonan czynno.

Element Zwraca kopi kolekcji, ktra zostaa zmieniona.


CollectionChanging Zdarzenie to jest zgaszane przed wprowadzenie zmian w kolekcji. W
procedurze jego obsugi wykorzystywany jest obiekt klasy
CollectionChangeEventArgs.

Klasa DataView
Obiekty tej klasy reprezentuj dostosowane do wasnych potrzeb sposoby prezentacji danych
przechowywanych w obiektach DataSet. Waciwoci, metody oraz zdarzenia dostpne w tej
klasie zostay przedstawione w tabeli C.12.

Tabela C.12. Waciwoci, metody oraz zdarzenia klasy DataView.


Waciwo Opis
AllowDelete Okrela czy w danym widoku mona usuwa dane.
AllowEdit Okrela czy w danym widoku mona edytowa dane.
AllowNew Okrela czy w danym widoku mona dodawa nowe wiersze.
ApplyDefaultSort Okrela czy naley uy domylnego sposobu sortowania.
DataViewManager Obiekt DataView, ktry utworzy dany widok (wskanik do obiektu
DataSetView ktry posiada wykorzystywany obiekt DataSet).
Item(indeks) Zwraca wskazany wiersz tabeli.
RowFilter Wyraenie suce do okrelania ktre wiersze zostan dodane do obiektu
DataView.
RowStateFilter Okrela ktre wersje rekordw bd dodawane do obiektu DataView.
Waciwo ta moe przybiera wartoci None, Unchanged, New,
Deleted, ModifiedCurrent, ModifiedOriginal, OriginalRows
oraz CurrentRows (warto domylna).
Sort Kolumna na podstawie ktrej dane bd sortowane.
Table rdowy obiekt DataTable z ktrego bd pobierane dane.
Metoda Opis
AddNew Dodaje nowy wiersz do obiektu DataView.
BeginInit Rozpoczyna inicjalizacj danego obiektu DataView.
Delete(indeks) Usuwa wiersz o podanym indeksie.
Dispose Niszczy biec kopi obiektu i zwalnia wszystkie zasoby, ktrych ten
obiekt uywa.
EndInit Koczy proces inicjalizacji obiektu.
Find Odnajduje konkretny wiersz w obiekcie DataView. Metoda przeciona.
GetEnumerator Zwraca interfejs IEnumerator ktrego mona uy do pobierania
kolejnych wierszy znajdujcych si w danym obiekcie DataView.
Zdarzenie Opis
ListChanged Zdarzenie zachodzi gdy lista zarzdzana przez obiekt DataView ulegnie
zmianie. Argumentem wywoania procedury obsugi tego zdarzenia jest
obiekt klasy ListChangedEventArgs. Klasa ta zawiera nastpujce
waciwoci:
ListChangedType Okrela typ zmian wprowadzonych w licie.

NewIndex Nowy indeks zmienionego elementu listy.

OldIndex Poprzedni indeks zmienionego elementu listy.


PropertyChanged Zdarzenie jest generowane w razie zmiany wartoci ktrej z waciwoci.
Argumentem wywoania procedury obsugi tego zdarzenia jest obiekt
klasy PropertyChangedEventArgs, zawierajcy nastpujc
waciwo:
PropertyName Nazwa waciwoci ktra ulega zmianie.

Zarzdzani dostawcy danych


Zarzdzani dostawcy danych pozwalaj ADO.NET na interakcj z dowolnymi typami rde
danych zgodnymi z OleDb. Dostawcy ci su do przenoszenia danych z bazy danych do obiektw
DataSet oraz innych skojarzonych z nimi obiektw; mona ich take uywa niezalenie do
modyfikacji danych.
Dostpni s dwaj zarzdzani dostawcy danych OleDb oraz Sql. Pierwszy z nich operuje na
bazach danych zgodnych z OleDb (takich jak Microsoft Access, Oracle, itd.) natomiast drugi suy
wycznie do obsugi baz SQL Server. Niemal bez wyjtkw obiekty w pierwszym dostawcy
odpowiadaj obiektom w drugim. Jedyn rnic jest stosowany prefiks dla pierwszego z
dostawcw jest to OleDb, a dla drugiego Sql. Na przykad, obaj dostawcy udostpniaj klas
suc do zapewniania prostego dostpu do danych, s to odpowiednio klasy OleDbDataReader
oraz SqlDataReader.
Ze wzgldu na due podobiestwo obu dostawcw w niniejszym dodatku zostan opisane
wycznie klasy wykorzystywane do obsugi zarzdzanego dostawcy OleDb. Jeli gdzie
wystpuj rnice pomidzy obydwoma zarzdzanymi dostawcami, zostan one opisane w
stosownej notatce. Oglnie rzecz biorc zarzdzanego dostawcy Sql naley stosowa wycznie
w przypadku wykorzystania baz danych SQL Serwer; wykorzystuje on bowiem bardzo wydajne
mechanizmy komunikacji z serwerem bazy danych, ktre mona stosowa wycznie do wymiany
danych z SQL Serverem. We wszystkich pozostaych przypadkach, naley uywa zarzdzanego
dostawcy OleDb.

Klasa OleDbCommand
Obiekty klasy OleDbCommand reprezentuj polecenia SQL, ktre maj by wykonane przez
rdo danych. Waciwoci i metody tej klasy zostay przedstawione w tabeli C.13.

Tabela C.13. Waciwoci i metody klasy OleDbCommand.


Waciwo Opis
CommandText Polecenie SQL ktre bdzie wykonywane.
CommandTimeout Limit czasu wykonywania polecenia, po jego przekroczeniu realizacja
polecenia zostanie przerwana.
CommandType Okrela sposb interpretacji waciwoci CommandText. Waciwo
ta moe przyjmowa nastpujce wartoci: StoredProcedure,
TableDirect lub Text (warto domylna).
Connection Okrela obiekt OleDbConnection uywany przez dane obiekt.
DesignTimeVisible Okrela czy podczas projektowania programu obiekt ten bdzie
wywietla jaki komponent wizualny; waciwo ta jest przydatna dla
programistw tworzcych komponenty.
Parameters Zwraca obiekt OleDbParameterCollection reprezentujcy
wszystkie parametry uywane w danym poleceniu SQL.
Transaction Obiekt OleDbTransaction uywany przez dany obiekt.
UpdatedRowSource Waciwo okrela ilo wierszy jakie zostay objte wynikami
dziaania polecenia. Zazwyczaj, w przypadku poprawnego wykonania
polecenia waciwo ta przyjmuje warto 1, natomiast w przypadku
wystpienia jakich bdw warto mniejsz od 1.
Metoda Opis
Cancel Przerywa wykonywanie polecenia.
CreateParameter Tworzy obiekt OleDbParameter ktry zostanie wykorzystany w
danym poleceniu.
Dispose Usuwa obiekt polecenia.
ExecuteNonQuery Wykonuje polecenie SQL, ktre nie zwraca adnych danych
wynikowych.
ExecuteReader Zwraca obiekt klasy OleDbDataReader zawierajcy dane uzyskane w
wyniku wykonania polecenia.
ExecuteScalar Wykonuje polecenie i zwraca warto pierwszej kolumny pierwszego
wiersza uzyskanych wynikw.
Prepare Tworzy skompilowan wersj polecenia SQL.
ResetCommandTimeout Przywraca domyln warto waciwoci CommandTimeout.

Klasa OleDbCommandBuilder
Obiekty tej klasy udostpniaj prosty sposb generacji polece SQL, ktre bd wykonywane
przez jakie rdo danych. Waciwoci i metody tej klasy zostay przedstawione w tabeli C.14.

Tabela C.14. Waciwoci i metody klasy OleDbCommandBuilder.


Waciwo Opis
DataAdapter Nazwa obiektu OleDbDataAdapter dla ktrego bd
generowane polecenia.
QuotePrefix Okrela prefiks jakim, w tworzonym poleceniu, naley
poprzedza nazwy obiektw rda danych (na przykad: tbl
w przypadku tabel, sp w przypadku procedur zachowanych i
tak dalej).
QuoteSuffix Okrela kocwk jak naley dodawa do nazw obiektw
rda danych.
Metoda Opis
Dispose Usuwa biecy obiekt polecenia.
GetDeleteCommand Zwraca automatycznie wygenerowane polecenie SQL suce
do usuwania wierszy ze rda danych.
GetInsertCommand Zwraca automatycznie wygenerowane polecenie SQL suce
do wstawiania rekordw do rda danych.
GetUpdateCommand Zwraca automatycznie wygenerowane polecenie SQL suce
do aktualizacji wierszy w rdle danych.
RefreshSchema Pobiera schemat struktury rda danych.
ShouldPersistSourceCommand Okrela czy naley zachowa warto waciwoci
CommandText.

Klasa OleDbConnection
Obiekty tej klasy reprezentuj poczenia ze rdami danych, ich waciwoci, metody oraz
zdarzenia zostay opisane w tabeli C.15.

Tabela C.15. Waciwoci, metody oraz zdarzenia klasy OleDbConnection.


Waciwo Opis
ConnectionString acuch znakw sucy do otworzenia poczenia z baz danych.
ConnectionTimeout Okres czasu jaki naley czeka na otworzenie poczenia z baz danych;
przekroczeniu tego czasu zostanie zgoszony bd.
Database Nazwa bazy danych z ktrej bdziemy korzysta po nawizaniu
poczenia.
DataSource Nazwa bazy danych z jak naley nawiza poczenie.
Provider Nazwa dostawcy bazy danych.
ReleaseObjectPool Wskazuje, e pula obiektw reprezentujcych poczenia ze rdami
danych moe zosta wyczyszczona po zwolnieniu ostatniego dostawcy
danych OleDb.
State Biecy stan poczenia.
Metoda Opis
BeginTransaction Rozpoczyna transakcj bazy danych. Metoda przeciona.
ChangeDatabase Zmienia biec baz danych na inn, okrelon przez argument
(warto) warto.
Close Zamyka poczenie ze rdem danych.
CreateCommand Zwraca obiekt klasy OleDbCommand sucy do wykonywania polece na
danym rdle danych.
Dispose Usuwa dany obiekt.
Open Metoda podejmuje prb otworzenia poczenia z baz danych.
Zdarzenie Opis
InfoMessage Zachodzi gdy dostawca danych przele jaki komunikat. W procedurze
obsugi tego zdarzenia jest stosowany argument bdcy obiektem klasy
OleDbInfoMessageEventArgs. Klasa ta udostpnia nastpujce
waciwoci:
ErrorCode Jest to warto typu HRESULT okrelajca standardowy
kod bdu.
Errors Obiekt klasy OleDbErrorCollection zawierajcy obiekty
reprezentujce wszystkie ostrzeenie przesane przez dostawc.
Message Peny tekst komunikatu o bdzie przesanego przez
dostawc.
Source Nazwa obiektu, ktry wygenerowa bd.
StateChange Zdarzenie zachodzi w momencie zmiany stanu poczenia. W procedurze
obsugi tego zdarzenia wykorzystywany jest argument bdcy obiektem
klasy StateChangeEventArgs. Klasa ta udostpnia dwie waciwoci:
CurrentState Waciwo okrela nowy stan poczenia.

OriginalState Waciwo okrela poprzedni stan poczenia.

Klasa OleDbDataAdapter
Obiekty klasy OleDbDataAdapter reprezentuj zbir polece oraz pocze ze rdami danych,
wykorzystywanymi do wypeniania obiektu DataSet. Waciwoci, metody oraz zdarzenia tej
klasy zostay przedstawione w tabeli C.16.

Tabela C.16. Waciwoci, metody oraz zdarzenia klasy OleDbDataAdapter.


Waciwo Opis
DeleteCommand Zwraca obiekt klasy OleDbCommand zawierajcy polecenie SQL suce
do usuwania danych z obiektu DataSet.
InsertCommand Zwraca obiekt klasy OleDbCommand zawierajcy polecenie SQL suce
do wstawiania danych do obiektu DataSet.
SelectCommand Zwraca obiekt klasy OleDbCommand zawierajcy polecenie SQL suce
do pobierania danych z obiektu DataSet.
UpdateCommand Zwraca obiekt klasy OleDbCommand zawierajcy polecenie SQL suce
do aktualizacji danych przechowywanych w obiekcie DataSet.
Metoda Opis
Dispose Usuwa ten obiekt.
Fill Dodaje lub modyfikuje wiersze przechowywane w obiekcie DataSet, tak
aby odpowiaday one zawartoci rda danych. Metoda przeciona.
FillSchema Dodaje obiekt DataTable do obiektu DataSet i odpowiednio
konfiguruje schemat tabeli. Metoda przeciona.
GetFillParameters Zwraca tablic obiektw IDataParameter uywanych w poleceniach
SELECT.
Update Aktualizuje zawarto rda danych na podstawie informacji zapisanych
w obiekcie DataSet, wykorzystujc do tego waciwoci
DeleteCommand, InsertCommand oraz UpdateCommand. Metoda
przeciona.
Zdarzenie Opis
FillError Zdarzenie zachodzi gdy podczas wykonywania metody Fill zostanie
zgoszony bd. W procedurze obsugi tego zdarzenia wykorzystywany
jest argument bdcy obiektem klasy FillErrorEventArgs. Klasa ta
definiuje nastpujce waciwoci:
Continue Okrela czy operacja powinna by dalej realizowana.

DataTable Okrela obiekt klasy DataTable ktry by aktualizowany


w momencie wystpienia bdu.
Errors Zwraca obiekt klasy Exception reprezentujcy obsugiwany
bd.
Values Zwraca obiekt zawierajcy wartoci znajdujce si w wierszu,
ktry by aktualizowany w momencie wystpienia bdu.
RowUpdated Zdarzenie zachodzi w trakcie wykonywania metody Update, po
wykonaniu polecenia SQL UPDATE. W procedurze obsugi tego zdarzenia
wykorzystywany jest argument bdcy obiektem klasy
OleDbRowUpdatedEventArgs. Klasa ta udostpnia nastpujce
waciwoci:
Command Zwraca obiekt OleDbCommand wykonany w efekcie
wywoania metody Update.
Errors Zwraca obiekt Exception reprezentujcy zgoszone bdy.

RecordsAffected Okrela ilo wierszy jakie zostay


zmodyfikowane w efekcie wykonania polecenia.
Row Zwraca obiekt DataRow wykorzystany w metodzie Update.

StatementType Okrel typ wykonanego polecenia SQL.

Status Obiekt klasy UpdateStatus reprezentujcy status polecenia.

TableMapping Zwraca obiekt klasy DataTableMapping jaki zosta


przesany wraz z poleceniem UPDATE.
RowUpdating Zdarzenie zachodzi podczas wykonywania metody Update, przed
wykonaniem polecenia SQL UPDATE. W procedurze obsugi tego
zdarzenia wykorzystywany jest argument bdcy obiektem klasy
OleDbRowUpdatingEventArgs. Klasa ta udostpnia nastpujce
waciwoci:
Command Zwraca obiekt OleDbCommand jaki ma zosta wykonany
przez metod Update.
Errors Zwraca obiekt Exception reprezentujcy zgoszone bdy.

Row Zwraca obiekt DataRow wykorzystywany w metodzie Update.

StatementType Okrel typ wykonywanego polecenia SQL.

Status Obiekt klasy UpdateStatus reprezentujcy status polecenia.

TableMapping Zwraca obiekt klasy DataTableMapping jaki zosta


przesany wraz z poleceniem UPDATE.

Klasa OleDbDataReader
Klasa OleDbDataReader implementuje prost, jednokierunkow metod pobierania informacji
ze rda danych. Obiekty tej klasy przypominaj obiekty DataSet, lecz kosztem mniejszych
moliwoci funkcjonalnych zapewniaj lepsz efektywno dziaania. Waciwoci oraz metody
definiowane przez t klas zostay opisane w tabeli C.17.

Tabela C.17. Waciwoci i metody klasy OleDbDataReader.


Waciwo Opis
Depth Okrela gboko obiektu czytelnika.
FieldCount Okrela ilo pl dostpnych w biecym rekordzie.
IsClosed Okrela czy obiekt czytelnika zosta zamknity.
Item Zwraca warto wskazanej kolumny w jej oryginalnej postaci.
Metoda przeciona.
RecordsAffected Okrela ilo wierzy objtych wynikami dziaania polecenia.
Zazwyczaj w przypadku poprawnego wykonania polecenia
waciwo ta przyjmuje warto 1, natomiast w razie
wystpienia bdw warto mniejsz od 1.
Metoda Opis
Close Zamyka obiekt OleDbDataReader.
GetBoolean(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu, jako
warto typu Boolean.
GetByte(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu, jako
warto typu Byte.
GetBytes(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu, jako
tablic wartoci typu Byte.
GetChar(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu, jako
warto typu Char.
GetChars(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu, jako
tablic wartoci typu Char.
GetDataTypeName(indeks) Zwraca typ kolumny okrelonej za pomoc indeksu.
GetDataTime(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu, jako
warto typu DateTime.
GetDecimal(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu, jako
warto typu Decimal.
GetDefaultStream(indeks) Zwraca obiekt klasy Stream.

GetDouble(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu, jako


warto typu Double.
GetFieldType(indeks) Zwraca obiekt Type reprezentujcy typ danych wskazanego
obiektu.
GetFloat(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu, jako
warto typu Float.
GetGuid(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu, jako
warto globalnie unikalnego identyfikatora.
GetInt16(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu, jako
16-bitow liczb cakowit.
GetInt32(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu, jako
32-bitow liczb cakowit.
GetInt64(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu, jako
64-bitow liczb cakowit.
GetName(indeks) Zwraca nazw kolumny okrelonej za pomoc indeksu.
GetOrdinal(nazwa) Na podstawie nazwy kolumny, zwraca jej indeks.
GetString(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu, jako
warto typu String.
GetTimeSpan(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu, jako
warto typu TimeSpan.
GetValue(indeks) Zwraca warto kolumny okrelonej za pomoc indeksu w jej
oryginalnym formacie.
GetValues(wartosci()) Zwraca wszystkie atrybuty biecego wiersza i zapisuje je w
tablicy wartosci().
IsDBNull Metoda stosowana do przedstawiania nieistniejcych wartoci.
NextResult W przypadku wykorzystania wynikw wykonania wsadowego
polecenia SQL, metoda ta przesuwa obiekt czytelnika do
nastpnego rekordu.
Read Przesuwa obiekt czytelnika do nastpnego rekordu.

Klasy OleDbError oraz OleDbErrorCollection


Obiekty klasy OleDbError zbieraj informacje dotyczce ostrzee przesyanych ze rde
danych. Waciwoci tej klasy zostay przedstawione w tabeli C.18.

Tabela C.18. Waciwoci klasy OleDbError.


Waciwo Opis
Message Zawiera krtki opis bdu.
NativeError Informacje o bdzie charakterystyczne dla uywanej bazy danych.
Source Zwraca obiekt, ktry wygenerowa bd.
SQLState Zwraca standardowy, picioliterowy kod okrelajcy bd, wygenerowany
przez baz danych.

W tabeli C.19 zostay opisane waciwoci i metody klasy OleDbErrorCollection.


Waciwo Opis
Count Ilo bdw przechowywanych w kolekcji.
Item Pobiera z kolekcji obiekt klasy OleDbError o okrelonym indeksie.
Metoda Opis
CopyTo(tablica(), Kopiuje ca zawarto kolekcji do tablicy tablica(), rozpoczynajc od
indeks) elementu o indeksie okrelonego za pomoc argumentu indeks.

Klasy OleDbParameter oraz


OleDbParameterCollection
Obiekty klasy OleDbParameter reprezentuj wartoci przekazywane do bazy danych wraz z
poleceniem i dostarczajce dodatkowych informacji lub moliwoci. Waciwoci i metody tej
klasy zostay przedstawione w tabeli C.20.

Tabela C.20. Waciwoci i metody klasy OleDbParameter.


Waciwo Opis
DataType Waciwo zwraca obiekt Type okrelajcy typ danego parametru.
DbType Typ danych rda danych.
Direction Okrela w jaki sposb parametr bdzie wykorzystywany. Dostpne
wartoci tej waciwoci to: Input, InputOutput, Output oraz
ReturnValue.
IsNullable Okrela czy parametr moe zawiera warto null.
ParameterName Nazwa parametru.
Precision Maksymalna ilo cyfr ktrych mona uy do zapisania wartoci
parametru.
Scale Maksymalna ilo miejsc dziesitnych ktrych mona uy od zapisania
wartoci parametru.
Size Maksymalna dopuszczalna wielko parametru.
SourceColumn Nazwa kolumny rda danych skojarzonej z obiektem DataSet i sucej
do podawania lub zwracania wartoci parametru.
SourceVersion Okrela wersj rekordu jak naley wykorzysta podczas pobierania
danych.
Value Warto parametru.
Metody Opis
ToString Zwraca warto waciwoci ParameterName.

Tabela C.21 zawiera waciwoci i metody obiektw klasy OleDbParameterCollection.

Tabela C.21. Waciwoci i metody klasy OleDbParameterCollection.


Waciwo Opis
Count Okrela ilo obiektw klasy OleDbParameter przechowywanych w
kolekcji.
Item Pobiera z kolekcji obiekt klasy OleDbParameter na podstawie nazwy
parametru bd jego indeksu.
Metoda Opis
Add Dodaje parametr do kolekcji. Metoda przeciona.
Clear Usuwa z kolekcji wszystkie przechowywane w niej obiekty
OleDbParameter.
Contains(nazwa) Sprawdza czy w kolekcji jest ju dostpny obiekt OleDbParameter
reprezentujcy parametr o podanej nazwie.
CopyTo(tablica(), Kopiuje ca zawarto kolekcji do tablicy tablica(), rozpoczynajc
indeks) od elementu o indeksie okrelonego za pomoc argumentu indeks.
IndexOf Zwraca indeks okrelonego parametru. Metoda przeciona.
Insert(indeks, Wstawia obiekt OleDbParameter przekazany jako argument obiekt
obiekt) do kolekcji, w miejsce okrelone argumentem indeks.
Remove Usuwa okrelony parametr z kolekcji. Metoda przeciona.
RemoveAt Usuwa z kolekcji obiekt OleDbParameter o okrelonym indeksie.

Klasa OleDbTransaction
Obiekty tej klasy reprezentuj transakcje realizowane w rdle danych. Waciwoci i metody tej
klasy zostay przedstawione w tabeli C.22.
Tabela C.22. Waciwoci i metody klasy OleDbTransaction.
Waciwo Opis
IsolationLevel Okrela poziom izolacji dla danej transakcji. Waciwo ta moe
przyjmowa nastpujce wartoci: Chaos, ReadCommitted (warto
domylna), ReadUncommitted, RepeatableRead, Serializable
oraz Unspecified.
Metoda Opis
Begin Rozpoczyna transakcj, wszystkie polecenia i modyfikacje wykonywane
po wywoaniu tej metody bd rejestrowane.
Commit Zatwierdza wszelkie modyfikacje wprowadzone do momentu wywoania
metody Begin.
RollBack Odtwarza i anuluje wszystkie modyfikacje wprowadzone od momentu
wywoania metody Begin.

You might also like