Professional Documents
Culture Documents
Dla Kazdego. R11
Dla Kazdego. R11
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.
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
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.
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).
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.
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.
Wykorzystajmy teraz waciwo NodeType i zmodyfikujmy przykad z listingu 11.3 tak, aby
zwracane byy tylko interesujce nas informacje.
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>")
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")
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.
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
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).
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.
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.
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.
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.
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>
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.
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 += " <b>" & _
27 node.Name & "</b> <" & _
28 node.Value & "><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> <" & _
36 attrnode.Value & "> " & 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.
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.
eleBook.SetAttributeNode(attStyle)
eleBook.SetAttribute("style", "hardcover")
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.
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.
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.
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
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
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.
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.
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"
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"
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.
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.
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!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
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
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.
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
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.
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
DataGrid1.DataSource = objReader
DataGrid1.DataBind()
objReader.Close
objCmd.Connection.Close()
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.
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
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.
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.
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 += "<" & _
19 objIterator.Current.Name & "> " & _
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.
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.
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?
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>
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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
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:
'otwieramy plik
objReader = objFile.OpenText()
'inne czynnoci
'zamykamy strumie
objReader.close
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
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>")
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
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:
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
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.Close
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()
Aby zmieni nazw pliku lub folderu mona go przenie (przy uyciu metody Move) lub
skopiowa (metod Copy) a nastpnie usun (przy uyciu metody Delete).
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.
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.
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
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).
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.
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.
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.
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
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" %>
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.
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.
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.
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:
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.
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;
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).
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)
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.
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.
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.
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)
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)
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)
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.
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.
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.
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.
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.
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.
Na listingu 15.2 przedstawiony zosta kod strony, ktra bdzie korzysta z naszego przykadowego
obiektu biznesowego.
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" %>
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.
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
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.
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.
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.
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.
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 = ""
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:
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:
Listing 15.8. przedstawia stron ASP.NET wykorzystujc nasze nowe obiekty biznesowe
(zarwno User jak i UserDetails).
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:
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)
Przykad przedstawiony na listingu 15.9 demonstruje w jaki sposb mona wywietli ciek
dostpu do pliku przy wykorzystaniu obiektu FileSystemObject.
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
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
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.
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.
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.
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
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">
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.
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.
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.
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.
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)
Waciwoci jakich mona uywa w atrybucie WebMethod zostay opisane w tabeli 16.1.
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.
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.
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.
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.
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.
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.
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.
(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).
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.
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.
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.
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
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.
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.
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
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.
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.
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.
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.
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
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.
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).
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
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.
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)
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.
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.
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,
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.
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:
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.
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.
<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>
<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.
<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>
<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>
<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).
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.
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
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.
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.
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.
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
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"))
lblMessage.Text = ""
try
dim objIterator as XPathNodeIterator = _
objNav.Select(tbQuery.Text)
While objIterator.MoveNext()
lblMessage.Text += "<" & _
objIterator.Current.Name & "> " & _
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>
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.
<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>
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.
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
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.
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.
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.
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
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.
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
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.
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.
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.
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.
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 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.
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.
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.
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" %>
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.
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
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
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.).
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:
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.
Powyszy fragment kodu tworzy obiekt ResourceManager dostpny dla caej aplikacji. Dostp
do niego mona uzyska za pomoc wyraenia Application("RM").
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.
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.
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.
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.
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.
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.
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.
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()
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.
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.
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" %>
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.
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.
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
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!
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.
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.
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.
1
We wczeniejszych wersjach .NET SDK program ten nosi nazw DbgUrt.exe
Rysunek 20.17. Interfejs graficzny programu uruchomieniowego CLR
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.
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.
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.
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.
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>
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.
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.
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).
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.
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.
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.
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.
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.
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
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.
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.
Z drugiej strony, kolejny przykad pokazuje jak udzieli dostpu do pewnego folderu wszystkich
moliwym uytkownikom:
<authorization>
<allow 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.
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.
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.
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.)
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
...
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.
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!"
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
%>
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.
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>
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">
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">
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">
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">
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">
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">
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">
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">
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">
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">
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">
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.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.
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.
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.
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.
ButtonColumn
Elementy sterujce ButtonColumn reprezentuj kolumn elementu DataGrid zawierajc grup
przyciskw. Waciwoci tych elementw sterujcych zostay przedstawione w tabeli B.31.
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.
CheckBox
Elementy sterujce CheckBox reprezentuj pola wyboru HTML. Waciwoci tych elementw
kontrolnych oraz generowane przez nie zdarzenia zostay przedstawione w tabeli B.33.
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.
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.
DropDownList
Elementy sterujce DropDownList reprezentuj list rozwijan. Ich waciwoci zostay
przedstawione w tabeli B.37.
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.
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.
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.
Image
Elementy sterujce Image reprezentuj obrazy wywietlane w przegldarce. Waciwoci tych
elementw sterujcych zostay przedstawione w tabeli B.41.
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.
Label
Te elementy sterujce wywietlaj zwyczajny tekst w przegldarce. Elementy te posiadaj jedn
jedyn waciwo, ktra zostaa przedstawiona w tabeli B.43.
ListBox
Elementy sterujce ListBox reprezentuj rozwijane listy. Ich waciwoci zostay przedstawione
w tabeli B.45.
Panel
Te elementy sterujce reprezentuj element kontenerowy sucy do umieszczania innych
elementw sterujcych. Waciwoci elementw sterujcych Panel zostay przedstawione w
tabeli B.46.
RadioButtonList
Elementy sterujce RadioButtonList wywietlaj w przegldarce list powizanych ze sob
tematycznie przyciskw opcji. Waciwoci tego elementu sterujcego zostay przedstawione w
tabeli B.48.
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.
TemplateColumn
Elementy sterujce TemplateColumn reprezentuj kolumny wywietlane w elementach
sterujcych DataGrid. Waciwoci tych elementw sterujcych zostay przedstawione w tabeli
B.53.
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.
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.
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.
RegularExpressionValidator
Elementy sterujce RegularExpressionValidator porwnuj zawarto wskazanego
elementu sterujcego z podanym wyraeniem regularnym. Jedyna waciwo tych elementw
sterujcych zostaa przedstawiona w tabeli B.59.
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.
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.
Klasa DataSet
Waciwoci, metody oraz zdarzenia tej klasy zostay opisane w tabeli C.9.
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.
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.
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.
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.
Klasa OleDbConnection
Obiekty tej klasy reprezentuj poczenia ze rdami danych, ich waciwoci, metody oraz
zdarzenia zostay opisane w tabeli C.15.
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.
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.
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.