ASp.NET 2.0 a C#

Page 1

E N C Y K L O P E D I E

Z O N E R

P R E S S

ASP.NET 2.O a C# tvorba dynamických stránek

PROFESIONÁLNĚ

© Foto: Jiří Heller

Matthew MacDonald Mario Szpuszta


ASP.NET 2.0 a C# tvorba dynamických stránek PROFESIONÁLNĚ Matthew MacDonald a Mario Szpuszta

Na knize dále spolupracovali K. Scott Allen, James Avery, Russ Basiura, Mike Batongbacal, Marco Bellinaso, Matt Butler, Andreas Eide, Daniel Cazzulino, Michael Clark, Richard Conway, Robert Eisenberg, Brady Gaster, James Greenwood, Kevin Hoffman, Erik Johansson, Angelo Kastroulis, Dan Kent, Sitaraman Lakshminarayanan, Don Lee, Christopher Miller, Matt Milner, Jan Narkiewicz, Matt Odhner, Ryan O‘Keefe, Andrew Reid, Matthew Reynolds, Enrico Sabbadin, Bill Sempf, Doug Seven, Srinivasa Sivakumar, Thiru Thangarathinam, Doug Thews.


Pro ASP.NET 2.0 in C# Matthew MacDonald, Mario Szpuszta. Original English language edition published Apress L.P., 2560 Ninth Street, Suite 219, Berkeley, CA 94710 USA. Copyright © 2005 by Apress L.P. Czech language edition copyright © 2006 by ZONER software, s.r.o. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from Apress L.P. Originální anglické vydání vydal Apress L.P., 2560 Ninth Street, Suite 219, Berkeley, CA 94710 USA. Copyright © 2005 Apress L.P. České vydání vydal ZONER software, s.r.o., copyright © 2006. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována nebo předávána žádnou formou nebo způsobem, elektronicky ani mechanicky, včetně fotokopií, natáčení ani žádnými jinými systémy pro ukládání bez výslovného svolení Apress L.P.

ASP.NET 2.0 a C# – tvorba dynamických stránek PROFESIONÁLNĚ Autor: Matthew MacDonald, Mario Szpuszta Copyright © ZONER software, s.r.o. Vydání první v roce 2006. Všechna práva vyhrazena. Zoner Press Katalogové číslo: ZR515 ZONER software, s.r.o. Nové sady 18, 602 00 Brno Překlad: RNDr. Jan Pokorný, Ing. Petr Kadlec, Erika Lencová Odpovědný redaktor: Miroslav Kučera Šéfredaktor: Ing. Pavel Kristián DTP: Miroslav Kučera © Cover foto: Jiří Heller, HELLER.CZ s.r.o, www.heller.cz © Cover: PYRAMIDE, s.r.o. Informace, které jsou v této knize zveřejněny, mohou byt chráněny jako patent. Jména produktů byla uvedena bez záruky jejich volného použití. Při tvorbě textů a vyobrazení bylo sice postupováno s maximální péčí, ale přesto nelze zcela vyloučit možnost výskytu chyb. Vydavatelé a autoři nepřebírají právní odpovědnost ani žádnou jinou záruku za použití chybných údajů a z toho vyplývajících důsledků. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována ani distribuována žádným způsobem ani prostředkem, ani reprodukována v databázi či na jiném záznamovém prostředku či v jiném systému bez výslovného svolení vydavatele, s výjimkou zveřejnění krátkých částí textu pro potřeby recenzí. Veškeré dotazy týkající se distribuce směřujte na: Zoner Press ZONER software, s.r.o. Nové sady 18, 602 00 Brno tel.: 532 190 883, fax: 543 257 245 e-mail: knihy@zoner.cz http://www.zonerpress.cz

ISBN 80-86815-38-2


3

Obsah Informace o autorech knihy

24

Informace o odborných korektorech

24

Úvod

25

Cesta ASP.NET od 1.0 k 2.0

25

Co naleznete v této knize?

26

Komu je kniha určena?

27

Co potřebujete, abyste mohli s knihou pracovat?

27

Sdělte nám svůj názor

28

Zdrojové soubory

28

Část I – Základy ASP.NET Kapitola 1

Úvod do ASP.NET

Evoluce webového vývoje Vývojový svět před příchodem ASP.NET

31 31 32

Co je špatného na klasickém ASP?

32

ASP.NET 1.0

35

Sedm důležitých faktů o ASP.NET

35

Fakt 1: ASP.NET je integrováno s .NET Frameworkem

35

Fakt 2: ASP.NET se neinterpretuje, ale kompiluje

36

Fakt 3: ASP.NET je vícejazyčné

38

Fakt 4: ASP.NET běží uvnitř společného runtime jazyků

40

Fakt 5: ASP.NET je objektově orientované

41

Fakt 6: ASP.NET podporuje různá zařízení a různé prohlížeče

43

Fakt 7: ASP.NET se snadno rozmisťuje a konfiguruje

44

ASP.NET 2.0 – příběh pokračuje

45

C# verze 2005

46

Visual Studio 2005

46

ASP.NET 2.0

47

Shrnutí

Kapitola 2

52

Visual Studio 2005

Vývojový model .NET

53 55

Kompilátor

55

Integrované vývojové rozhraní Visual Studia

55

Weby ve Visual Studiu Vývoj bez projektu

56 59


4 Migrace projektu Visual Studia .NET Navrhování webové stránky Integrované vývojové rozhraní Visual Studia

59 61 64

Průzkumník řešení

66

Okno dokumentu

68

Toolbox

68

Seznam chyb a seznam úkolů

69

Průzkumník serveru

71

Editor kódu

71

Přidání referencí na assembly

73

IntelliSense a osnova

75

Model vytváření kódu

79

Jak se soubory kódu v pozadí připojují k stránkám

81

Jak se připojují značky ovládacích prvků k proměnným stránky

82

Jak se připojují události ke ovladačům událostí

83

Ladění ve Visual Studiu

84

Ladění po krocích

85

Pokročilé body přerušení

88

Sledování proměnných

89

Makra Visual Studia

90

ASP.NET Development Helper

92

Shrnutí

94

Kapitola 3

Webové formuláře

Zpracování stránky

95 96

HTML formuláře

97

Dynamická rozhraní

99

Model událostí ASP.NET

100

Automatické odesílání zpět na server

101

Stav zobrazení

102

Soulad s XHTML

107

Etapy zpracování webového formuláře

110

Inicializace pracovního rámce stránky

111

Inicializace uživatelského kódu

112

Validace

112

Zpracování událostí

113

Automatické vázání dat

113

Údržba

114

Ukázka toku zpracování stránky

114

Stránka jako kontejner ovládacích prvků

117


5 Zobrazení stromu ovládacích prvků

117

Záhlaví stránky

121

Dynamické vytváření ovládacích prvků

122

Třída Page

124

Objekty Session, Application a Cache

125

Objekt Request

125

Objekt Response

126

Objekt Server

128

Objekt User

130

Objekt Trace

131

Přístup ke kontextu HTTP v jiné třídě

137

Shrnutí

Kapitola 4

138

Serverové ovládací prvky

Typy serverových ovládacích prvků Hierarchie serverového ovládacího prvku Serverové ovládací prvky HTML

139 140 142 143

Třída HtmlControl

144

Třída HtmlContainerControl

145

Třída HtmlInputControl

145

Třídy serverových ovládacích prvků HTML

146

Nastavování atributů stylu a jiných vlastností

147

Programátorské vytváření serverových ovládacích prvků

149

Zpracování událostí na straně serveru

150

Webové ovládací prvky

153

Základní třída WebControl

154

Základní třídy webových ovládacích prvků

155

Jednotky

157

Výčtové hodnoty

158

Barvy

158

Písma

159

Focus

160

Výchozí tlačítko

162

Panely s rolováním

162

Zpracování událostí webových ovládacích prvků

163

Ovládací prvky pro seznamy

166

Ovládací prvky seznamů, z nichž lze vybírat

167

Ovládací prvek BulletedList

170

Ovládací prvky pro ověřování platnosti vstupu Validační ovládací prvky

172 172


6 Proces ověřování platnosti

173

Třída BaseValidator

175

Ovládací prvek RequiredFieldValidator

176

Ovládací prvek RangeValidator

177

Ovládací prvek CompareValidator

177

Ovládací prvek RegularExpressionValidator

178

Ovládací prvek CustomValidator

181

Ovládací prvek ValidationSummary

182

Programátorské využívání validátorů

183

Validační skupiny

185

Bohatě vybavené ovládací prvky ASP.NET

187

Ovládací prvek AdRotator

188

Ovládací prvek Calendar

189

Shrnutí

Kapitola 5

192

Aplikace ASP.NET

193

Anatomie aplikace ASP.NET

194

Doména aplikace

194

Doba života aplikace

195

Aktualizace aplikací

196

Struktura adresáře aplikace

196

Soubor aplikace global.asax

197

Události aplikace

199

Ukázka zpracování událostí aplikace

201

Konfigurace ASP.NET

202

Soubor machine.config

202

Soubor web.config

205

Konfigurační nastavení

207

Programátorské čtení a zápis konfiguračních nastavení

212

Nástroj WAT (Website Administration Tool)

215

Rozšiřování struktury konfiguračního souboru

217

Šifrování konfiguračních sekcí

219

Komponenty .NET

221

Vytvoření komponenty

222

Použití komponenty prostřednictvím adresáře App_Code

223

Použití komponenty prostřednictvím adresáře Bin

224

Rozšiřování kanálu HTTP

227

Ovladače HTTP a moduly HTTP

227

Vytvoření vlastního ovladače HTTP

229

Konfigurace vlastního ovladače HTTP

230


7 Registrace ovladačů HTTP bez konfigurování IIS

231

Vytvoření pokročilejšího ovladače HTTP

232

Vytvoření vlastního modulu HTTP

235

Shrnutí

Kapitola 6

238

Správa stavu

239

Správa stavu ASP.NET

240

Stav zobrazení

243

Ukázka práce se stavem zobrazení

243

Ukládání objektů do stavu zobrazení

245

Zachování členských proměnných

248

Přístup ke stavu zobrazení

248

Ořezání stavu zobrazení pro ovládací prvky seznamů

250

Bezpečnost stavu zobrazení

251

Přenášení informací Dotazovací řetězec

252 253

Odesílání stránky zpět na server přes jinou stránku

254

Odesílání zpět na server přes jinou stránku a ověřování platnosti

258

Vlastní cookies

259

Stav relace

261

Architektura relace

261

Použití stavu relace

263

Konfigurace stavu relace

264

Zabezpečení stavu relace

269

Stav aplikace

270

Statické proměnné aplikace Shrnutí

272 274

Část II – Přístup k datům Kapitola 7

Základy ADO.NET

Architektura ADO.NET

277 278

Poskytovatelé dat ADO.NET

279

Standardizace v ADO.NET

280

SQL Server 2005

281

Základní třídy ADO.NET

282

Třídy připojení

283

Připojovací řetězce

283

Testování připojení

285


8 Fond připojení

286

Statistiky připojení

288

Třídy příkazů a čtenářů dat

289

Základní informace o třídách příkazů

289

Třídy čtenářů dat

290

Metoda ExecuteReader() a čtenář dat

291

Metoda ExecuteScalar()

296

Metoda ExecuteNonQuery()

296

Útoky injektáží SQL

297

Práce s parametrizovanými příkazy

300

Volání uložených procedur

301

Transakce 303 Transakce a aplikace ASP.NET

304

Úrovně izolace

308

Záchytné body

309

Vnořované transakce

310

Kód nedogmatický vzhledem k poskytovatelům Vytvoření továrny na objekty

310 311

Vytváření objektů v továrně

312

Dotaz s nedogmatickým kódem vzhledem k poskytovatelům

313

Shrnutí

Kapitola 8

314

Datové komponenty a sada dat

Budování komponenty pro přístup k datům Balík dat

315 315 317

Uložené procedury

318

Třída databázových utilit

319

Testování komponenty

325

Odpojená data

327

Webové aplikace a sada dat

328

Integrace XML

329

Třídy sady dat

329

Třída DataTable

331

Třída DataRow

331

Třídy datového adaptéru

331

Plnění sady dat

333

Práce s více tabulkami najednou a vztahy

334

Vyhledávání konkrétních řádků

337

Použití sady dat ve vlastní třídě dat

338

Vázání dat

339


9 Třída DataView

339

Řazení pomocí DataView

340

Filtrování dat pomocí DataView

341

Vyspělé filtry založené na relacích

343

Vypočítané sloupce

344

Shrnutí

Kapitola 9

346

Vázání dat

Základy vázání dat

347 348

Jednoduché vázání dat

348

Další typy výrazů

350

Složené vázání dat Ovládací prvky pro zdroje dat Životní cyklus stránky s vázáním dat Ovládací prvek SqlDataSource

354 362 363 364

Výběr záznamů

365

Parametrizované příkazy

368

Zpracování chyb

372

Aktualizace záznamů

372

Nevýhody ovládacího prvku SqlDataSource

377

Ovládací prvek ObjectDataSource

378

Výběr záznamů

378

Aktualizace záznamů

383

Aktualizace pomocí datového objektu

384

Limity ovládacích prvků pro zdroje dat

387

Specifikace problému

387

Přidání dalších prvků

388

Zpracování dodatečných voleb s SqlDataSource

389

Zpracování dodatečných voleb s ObjectDataSource

390

Shrnutí

Kapitola 10

390

Bohatě vybavené ovládací prvky

Ovládací prvek GridView Definice sloupců Formátování GridView Formátování polí vázaných na data

391 392 392 396 396

Styly

398

Formátování pouze některých hodnot

402

Výběr řádků v GridView Využití výběru pro formulář typu hlavní řádek – asociované řádky

404 405


10 Událost SelectedIndexChanged

406

Použití datového sloupce jako tlačítka pro výběr

407

Řazení v GridView

408

Řazení s SqlDataSource

408

Řazení s ObjectDataSource

409

Řazení a výběr

411

Složitější řazení

412

Stránkování GridView

414

Automatické stránkování

414

Vlastní stránkování s ObjectDataSource

415

Přizpůsobení pruhu s ovládacími prvky pro stránkování

419

Šablony GridView

420

Použití vícenásobných šablon

421

Editace šablon ve Visual Studiu

423

Vázání k metodě

423

Zpracování událostí v šabloně

425

Editace se šablonou

426

DetailsView a FormView

432

Ovládací prvek DetailsView

432

Ovládací prvek FormView

434

Pokročilé mřížky

436

Souhrny v GridView

436

Zobrazení rodič/potomek v jediné tabulce

437

Obsluha obrázků z databáze

440

Detekce konfliktů při simultánním zpracování Shrnutí

Kapitola 11

446 450

Ukládání do cache

451

Chápeme cachování v ASP.NET

452

Cachování výstupu

453

Deklarativní cachování výstupu

453

Cachování a dotazovací řetězec

454

Cachování s konkrétními parametry dotazovacího řetězce

455

Vlastní řízení cachování

456

Cachování s třídou HttpCachePolicy

458

Nahrazení po uložení do cache a cachování fragmentů

459

Profily cache

461

Cachování na disk Cachování dat Přidávání položek do kolekce Cache

462 463 464


11 Jednoduchý test cache

466

Priority cache

467

Cachování s ovládacími prvky pro zdroje dat

468

Závislosti cache

471

Závislosti na souboru a položce cache

472

Souhrnné závislosti

473

Zpětné volání při odstranění položky

474

Notifikace SQL do cache

476

Notifikace cache v SQL Serveru 2000 nebo SQL Serveru 7

477

Notifikace cache v SQL Serveru 2005

482

Vlastní závislosti cache

483

Základní vlastní závislost cache

484

Vlastní závislost cache používající fronty zpráv

485

Shrnutí

Kapitola 12

487

XML

489

Kdy je rozumné používat XML?

490

Úvod do XML

490

Výhody XML

491

Správně strukturovaný XML

492

Jmenné prostory XML

493

Schémata XML

494

Zápis a čtení XML programátorsky

496

Zápis souborů XML

496

Čtení souborů XML

500

Ověřování platnosti souborů XML Zobrazování obsahu XML s XSL

513 516

Základní stylový předpis

516

Práce s třídou XslTransform

517

Práce s ovládacím prvkem Xml

518

Vázání dat XML

519

Vázání, které není hierarchické

519

Použití XPath

521

Vnořené mřížky

524

Hierarchické vázání s TreeView

525

Práce s XSLT

527

Vázání k obsahu XML z jiných zdrojů

529

Aktualizace XML prostřednictvím XmlDataSource

530

XML a ADO.NET Konverze sady dat do XML

530 531


12 Přístup k sadě dat prostřednictvím XML Vykonání dotazu XML Shrnutí

Kapitola 13

533 534 536

Soubory a proudy

Práce se systémem souborů

537 538

Třídy Directory a File

538

Třídy DirectoryInfo a FileInfo

541

Třída DriveInfo

544

Práce s atributy souboru nebo adresáře

545

Filtrování souborů pomocí zástupných symbolů

546

Získávání informací o verzi souboru

547

Třída Path

548

Prohlížeč souborů

551

Čtení a zapisování souborů pomocí proudů

555

Textové soubory

557

Binární soubory

558

Nahrávání souborů na server

559

Tvorba souborů bezpečných pro více uživatelů

561

Komprimace

566

Serializace

567

Shrnutí

570

Část III – Budování webů ASP.NET Kapitola 14

Uživatelské ovládací prvky

Základy uživatelského ovládacího prvku

573 574

Vytvoření jednoduchého uživatelského ovládacího prvku

574

Konverze stránky na uživatelský ovládací prvek

576

Přidávání kódu do uživatelského ovládacího prvku

577

Zpracování událostí

577

Přidávání vlastností

579

Práce s vlastními objekty

581

Přidávání událostí

583

Vystavování vnitřku webového ovládacího prvku

587

Dynamické nahráváníuživatelských ovládacích prvků

588

Pracovní rámce portálů

588

Částečné cachování stránky

591


13 Vlastnost VaryByControl

592

Sdílení ovládacích prvků uložených do cache

594

Shrnutí

Kapitola 15

594

Motivy a vzory stránek

Standardizace formátování webu Kaskádové styly (CSS) Motivy

595 595 595 598

Složky motivu a skinové předpisy

599

Jak se aplikuje jednoduchý motiv

600

Zpracování konfliktů souvisejících s motivem

602

Vytvoření více skinových předpisů pro jeden ovládací prvek

603

Skinové předpisy se šablonami a obrázky

604

Použití CSS v motivu

606

Aplikování motivů prostřednictvím konfiguračního souboru

607

Dynamické aplikování motivu

608

Standardizace layoutu webu

610

Co je vzor stránek

610

Jednoduchý vzor stránek

611

Jednoduchá stránka s obsahem

613

"Manýry" vzoru stránek v době návrhu

615

Výchozí obsah

618

Praktičtější ukázka vzoru stránek

618

Vzory stránek a relativní cesty

620

Vzory stránek a formátování

621

Použití vzorů stránek prostřednictvím konfiguračního souboru

621

Pokročilé vzory stránek

622

Specifikace titulku a metaznaček pro stránku s obsahem

622

Interakce s třídou vzoru stránek

623

Dynamické nastavení vzoru stránek

624

Vnořování vzorů stránek

625

Shrnutí

Kapitola 16

626

Navigace po webu

Stránky s více zobrazeními

627 627

Ovládací prvek MultiView

628

Ovládací prvek Wizard

632

Mapa webu

640

Definice mapy webu

641

Vázání k mapě webu

643


14 Navigační cesta

644

Vázání částí mapy webu

646

Navigace řešená programátorsky

649

Vázání jiných ovládacích prvků

651

Přidávání vlastních informací do plánu webu

652

Vytvoření vlastního poskytovatele plánu webu

653

Mapování URL

658

Ovládací prvek TreeView

659

Objekty TreeNode

660

Plnění uzlů na požádání

663

Styly TreeView

664

Ovládací prvek Menu

668

Styly ovládacího prvku Menu

671

Šablony ovládacího prvku Menu

673

Shrnutí

Kapitola 17

674

Zdroje a lokalizace

675

Zdroje v aplikacích .NET

675

Lokalizace webových aplikací

683

Lokalizace a společný runtime jazyků (CLR)

684

Lokální zdroje pro jedinou stránku

687

Sdílení zdrojů mezi stránkami

692

Lokalizace statického textu

694

Směr textu

694

Shrnutí

Kapitola 18

695

Rozmístění webu

Internet Information Services (IIS)

697 697

IIS a zpracování URL

698

Zpracování požadavku s IIS a ASP.NET

701

Model IIS 5.x

702

Model IIS 6.0

705

Instalace IIS

710

Správa a řízení webů

712

Vytvoření virtuálního adresáře

713

Virtuální adresáře a webové aplikace

715

Nastavení složky Správa aplikačních fondů v IIS 6.0

715 720

Vytváření aplikačních fondů

720

Aplikační fondy a webové aplikace

723


15 Vlastní identity aplikačního fondu

724

Jak rozmístit vaše aplikace ASP.NET

727

Ověření instalace ASP.NET

728

Vykonávání ASP.NET bok po boku

730

Konfigurace nastavení HTTP Runtime

731

Modely kompilace

732

Rozmisťování pomocí Visual Studia

734

Třída VirtualPathProvider v ASP.NET 2.0

736

Monitorování zdravotního stavu v ASP.NET 2.0

741

Základní struktura

741

Události a poskytovatelé

741

Shrnutí

745

Část IV – Bezpečnost Kapitola 19

Bezpečnostní model ASP.NET

Co znamená tvorba bezpečného software

749 749

Chápeme potenciální hrozby

750

Zásady bezpečného programování

750

Pochopení strážných

751

Chápeme úrovně bezpečnosti

752

Autentizace

753

Autorizace

754

Důvěrnost a integrita

755

Jak všechno spojit dohromady

755

Bezpečnost IIS

757

Autentizace IIS

757

Autorizace IIS

759

IIS a SSL

760

Bezpečnostní architektura ASP.NET Autentizace

765 767

Autorizace

768

Bezpečnostní kontext

769

API pro členství a role

770

Shrnutí

Kapitola 20

771

Formulářová autentizace

Představení formulářové autentizace Proč používat formulářovou autentizaci?

773 773 774


16 Proč nepoužívat formulářovou autentizaci?

776

Proč neimplementovat vlastní autentizaci pomocí cookie?

777

Třídy formulářové autentizace

778

Implementace formulářové autentizace

779

Konfigurace formulářové autentizace

779

Odmítnutí přístupu anonymním uživatelům

782

Tvorba vlastní přihlašovací stránky

783

Vlastní úložiště přihlašovacích dokladů

789

Trvalé cookies ve formulářové autentizaci

790

Shrnutí

Kapitola 21

791

Členství

793

Úvod do API pro členství ASP.NET

793

Práce s API pro členství

796

Konfigurace formulářové autentizace

797

Vytvoření úložiště dat

798

Konfigurace připojovacího řetězce a poskytovatele členství

802

Vytváření a autentizace uživatelů

806

Práce s ovládacími prvky pro bezpečnost

808

Ovládací prvek Login

809

Ovládací prvek LoginStatus

819

Ovládací prvek LoginView

819

Ovládací prvek PasswordRecovery

820

Ovládací prvek ChangePassword

825

Ovládací prvek CreateUserWizard

826

Použití třídy Membership

831

Získávání uživatelů z úložiště

832

Aktualizace uživatelů v úložišti

834

Vytváření a odstraňování uživatelů

835

Ověřování uživatelů

836

Shrnutí

Kapitola 22

836

Autentizace Windows

Představení autentizace Windows Proč používat autentizaci Windows?

837 837 837

Proč nepoužívat autentizaci Windows?

839

Mechanismy autentizace Windows

839

Implementace autentizace Windows

846

Konfigurace IIS

846

Konfigurace ASP.NET

848


17 Odepření přístupu anonymním uživatelům

848

Přístup k informacím uživatele Windows

848

Impersonalizace

852

Impersonalizace ve Windows 2000

853

Impersonalizace ve Windows XP

854

Impersonalizace a delegování v systému Windows Server 2003

854

Konfigurovatelná impersonalizace

857

Programová impersonalizace

859

Shrnutí

Kapitola 23

862

Autorizace a role

Autorizace URL

863 863

Autorizační pravidla Souborová autorizace Autorizační kontroly v kódu

864 870 871

Použití metody IsInRole()

871

Použití třídy PrincipalPermission

871

Použití služby rolía autorizace založené na rolích

874

Použití ovládacího prvku LoginView s rolemi

880

Programátorský přístup k rolím

881

Použití služby rolí v autentizaci Windows

884

Ochrana jiných zdrojů, než jsou webové stránky

886

Mapování dalších typů souborů

887

Vytvoření vlastního ovladače HTTP

888

Shrnutí

Kapitola 24

890

Profily

Chápeme profily

891 891

Představení profilů

892

Jak profily ukládají data

893

Profily a autentizace

893

Profily a datové komponenty Používání SqlProfileProvider

894 895

Vytvoření tabulek profilu

895

Konfigurace poskytovatele

897

Definování vlastností profilu

898

Použití vlastností profilu

899

Serializace profilu

901

Skupiny profilu

903

Profily a vlastní datové typy

904


18 API pro profily

907

Anonymní profily

909

Tvorba nákupního košíku

912

Třídy nákupního košíku

913

Testovací stránka

915

Několikanásobný výběr

918

Vlastní poskytovatelé profilu

919

Třídy vlastních poskytovatelů profilu

919

Návrh FactoredProfileProvider

921

Naprogramování FactoredProfileProvider

922

Testování FactoredProfileProvider

927

Shrnutí

Kapitola 25

929

Šifrování

931

Šifrování dat – diskrétnost

931

Šifrovací jmenný prostor .NET

932

Úvod do šifrovacích tříd .NET

935

Symetrické šifrovací algoritmy

936

Asymetrické šifrování

937

Abstraktní šifrovací třídy

938

Rozhraní ICryptoTransform

939

Třída CryptoStream

939

Šifrování citlivých dat

940

Správa tajných údajů

940

Používání symetrických algoritmů

942

Používání asymetrických algoritmů

947

Šifrování citlivých dat v databázi

949

Šifrování dotazovacího řetězce

953

Obalení dotazovacího řetězce

953

Vytvoření testovací stránky

956

Shrnutí

Kapitola 26

958

Vlastní poskytovatelé členství

959

Architektura vlastních poskytovatelů

959

Základní kroky nutné provytvoření vlastních poskytovatelů

961

Celkový návrh vlastního poskytovatele

961

Návrh a implementace vlastního úložiště

962

Implementace tříd poskytovatelů

969

Používání tříd vlastních poskytovatelů

989

Shrnutí

991


19

Část V – Pokročilé uživatelské rozhraní Kapitola 27

Vlastní serverové ovládací prvky

Základy vlastních serverových ovládacích prvků

995 996

Vytvoření kostry vlastních ovládacích prvků

997

Použití vlastního ovládacího prvku

999

Vlastní ovládací prvky v Toolboxu

1000

Tvorba webového ovládacího prvku s podporou vlastností stylu

1002

Proces realizace

1005

Práce s různými prohlížeči

1007

HtmlTextWriter

1007

Detekce prohlížeče

1008

Vlastnosti prohlížeče

1010

Přizpůsobivá realizace prvků Stav ovládacích prvků a události

1012 1014

Stav zobrazení

1014

Správa stavu

1016

Data postbacku a události změn

1018

Spouštění postbacku

1020

Rozšíření existujících webových ovládacích prvků

1022

Složené ovládací prvky

1023

Odvozené ovládací prvky

1025

Ovládací prvky šablon Vytvoření ovládacího prvku šablony

1030 1031

Používání upravených šablon

1033

Styly

1037

Shrnutí

Kapitola 28

1040

Podpora v době návrhu

Atributy v době návrhu

1041 1042

Okno Properties

1043

Atributy a dědičnost

1046

Ikona Toolbox

1047

Webové zdroje

1048

Serializace kódu

1050

Typové konvertory

1051

Atributy serializace

1059

Typové editory Designéři ovládacích prvků

1066 1068


20 Základní designér ovládacího prvku Inteligentní značky (Smart Tags)

1069 1072

Seznam akcí

1072

Kolekce DesignerActionItem

1074

Designér ovládacího prvku (Control Designer)

1076

Shrnutí

Kapitola 29

1077

JavaScript

Základy JavaScriptu

1079 1079

Události JavaScriptu

1080

Bloky skriptu

1082

Realizování bloků skriptu

1091

Útoky injektáží skriptu

1092

Funkce pro ověření požadavku

1093

Vypnutí funkce pro ověření požadavku

1094

Zpětné volání klienta

1096

Vytvoření zpětného volání klienta

1096

Pozadí zpětného volání klienta

1101

Vlastní ovládací prvky s JavaScriptem Pop-up okna

1103 1103

Rollover tlačítka

1106

Dynamické panely

1109

Rámce

1113

Navigace v rámcích

1114

Řádkové rámce

1116

Souhrn

Kapitola 30

1117

Dynamická grafika a GDI+

Ovládací prvek ImageMap

1119 1119

Vytváření aktivních oblastí

1120

Ošetření kliknutí do aktivních oblastí

1122

Vlastní aktivní oblasti Kreslení s GDI+

1123 1125

Jednoduché kreslení

1126

Formát a kvalita obrázku

1128

Třída Graphics

1129

Použití GraphicsPath

1131

Pera

1133

Štětce Vložení dynamické grafiky do webové stránky

1135 1137


21 Použití formátu PNG

1138

Předávání informací dynamickým obrázkům

1139

Vlastní ovládací prvky používající GDI+

1142

Vytváření grafů za pomoci GDI+

1147

Shrnutí

1152

Kapitola 31

Portály s webovými částmi

1153

Typické stránky portálu

1153

Základní stránka s webovými částmi

1155

Vytvoření návrhu stránky

1156

WebPartManager a WebPartZones

1157

Přidání webové části na stránku

1159

Přizpůsobení stránky

1162

Vytvoření webových částí

1165

Jednoduché úkoly webových částí

1165

Vývoj pokročilých webových části

1174

Editory webových částí

1183

Připojení webových částí

1189

Webové části a autorizace

1197

Poslední kroky personalizace Shrnutí

1198 1199

Část VI – Webové služby Kapitola 32

Tvorba webových služeb

Přehled webových služeb Historie webových služeb

1203 1204 1205

Distribuované výpočty a webové služby

1206

Problémy spojené s technologiemi distribuovaných komponent

1207

Výhody webových služeb

1208

Vydělávání peněz s webovými službami

1209

Standardy používané webovými službami

1210

Budování základní webové služby Třída webové služby

1213 1213

Požadavky na webovou službu

1214

Vystavení webové služby

1217

Testování webové služby

1221

Používání webové služby Třída proxy

1224 1230


22 Vytvoření klienta ASP.NET

1231

Vytvoření klienta formulářů Windows

1234

Vytvoření ASP klienta s MSXML

1236

Vytvoření ASP klienta pomocí SOAP Toolkit

1237

Vylepšování webové služby

1238

CacheDuration

1239

EnableSession

1242

BufferResponse

1245

TransactionOption

1245

Shrnutí

Kapitola 33

1248

Standardy webové služby a rozšíření

1249

Součinnost WS

1249

SOAP

1251

Kódování SOAP

1252

Verze SOAP

1253

Trasování SOAP zpráv

1254

SOAP obálka

1256

Záhlaví SOAP

1261

WSDL

1265

Zobrazování WSDL pro webovou službu

1265

Základní struktura

1267

Implementace existujícího kontraktu Přizpůsobování zpráv SOAP

1272 1274

Serializace komplexních datových typů

1274

Přizpůsobení XML serializace s atributy

1279

Sdílení typů

1282

Přizpůsobení XML serializace pomocí IXmlSerializable

1284

Vlastní serializace rozsáhlých datových typů

1288

Rozšíření importéru schématu Shrnutí

Kapitola 34

1294 1297

Pokročilé webové služby

Asynchronní volání

1299 1300

Asynchronní delegáti

1300

Jednoduché asynchronní volání

1302

Souběžné asynchronní volání

1304

Interaktivní klienti Windows

1306

Asynchronní služby

1310

Zabezpečení webových služeb

1311


23 Autentizace Windows

1311

Vlastní autentizace založená na lístcích

1314

Sledování identity uživatele

1314

Autentizace uživatele

1316

Autorizace uživatele

1317

Testování systému autentizace SOAP Rozšíření SOAP Vytvoření rozšíření SOAP Vylepšení webových služeb

1317 1319 1321 1329

Instalace WSE

1330

Provádění autentizace s WSE

1331

Shrnutí

1336

Rejstřík

1337


24

Informace o autorech knihy MATTHEW MACDONALD je autor, pedagog a vývojář MCSD. Pravidelně přispívá do časopisů o programování a je autorem více než tuctu knih o programování .NET, např. ASP.NET: The Complete Reference (Osborne McGraw-Hill, 2002), Programming .NET Web Services (O’Reilly, 2002), Beginning ASP.NET in C (Apress, 2004) a Microsoft .NET Distributed Applications (Microsoft Press, 2003). V šerém dávnověku svého života studoval anglickou literaturu a teoretickou fyziku.

MARIO SZPUSZTA pracuje v Developer and Platform Group u společnosti Microsoft v Rakousku. Než začal pracovat pro Microsoft, participoval Mario na několika projektech založených na COM+ a DCOM s jazyky Visual Basic a Visual C++, a také na projektech založených na Java a J2SE. Počínaje první verzí beta 2 .NET Frameworku začal vyvíjet webové aplikace s ASP.NET. V současné době, jakožto horlivý vývojářský misionář Microsoft Austria, řídí workshopy, školení a demonstrační projekty s nezávislými výrobci softwaru v Rakousku, a to na základě technologií webových služeb .NET a Office 2003.

Informace o odborných korektorech ROBERT LAIR je prezident a ředitel Intensity Software (http://www.intensitysoftware.com), která se specializuje na poradenské služby Microsoft .NET. Intensity nabízí kromě poradenských služeb také Kicks for .NET, což je migrační utilita z CICS-do-ASP.NET, která automatizuje migrační proces, přičemž současně udržuje zdrojový kód stávající obchodní logiky. Robert se podílel na vytvoření demonstrační aplikace IBuySpy Store a Portal, a také NetCOBOL for .NET verzi IBuySpy a ukázky QuickStart. Robert jako autor participoval na řadě knih a napsal řadu článků na témata vztahující se k Microsoft .NET. Robertův osobní web je na adrese http://www.robertlair.com a jeho blog na http://www.robertlair.com/blogs/lair. Robert by rád poděkoval své krásné ženě, Debi, a svému čtyřletému synovi, Maxovi, že se smířili se ztrátou rodinného života, který padl za oběť, když revidoval tuto knihu. JASON LEFEBVRE je vicepresident a jeden ze zakládajících partnerů Intensity Software. Každodenně pracuje s Visual Studiem a s Microsoft .NET Frameworken, když připravuje architektury řešení pro klienty poradenských služeb Intensity. Podílel se na vytvoření demonstrační aplikaci IBuySpy Store, a také na překladu NetCOBOL for .NET. Jason participoval jako autor na mnoha knihách a napsal řadu článků na témata vztahující se k Microsoft .NET. Rád by poděkoval novému mazlíčkovi své přítelkyně, Oliverovi, že je tak rozkošný.


25

Úvod U vývojářů není nijak obtížné vzbudit zájem o ASP.NET. Aniž bychom přeháněli, dá se říci, že ASP.NET je nejkompletnější platformou pro webový vývoj, jaká byla kdy dána dohromady. Daleko předčí svého předchůdce, kterým bylo ASP, a které představovalo narychlo sestavenou sadu nástrojů pro vkládání dynamického obsahu do obyčejných webových stránek. ASP.NET je naproti tomu plnohodnotná platforma pro vývoj plnohodnotných a bleskově rychlých webových aplikací. V této knize se dozvíte vše, co potřebujete znát, abyste mistrovsky ovládli ASP.NET 2.0. Jestliže jste už programovali s předchozí verzí ASP.NET, rychle prolétnete základy a hned se začnete dozvídat a nových vzrušujících schopnostech verze 2.0. Jestliže jste ještě nikdy neprogramovali s ASP.NET, zjistíte, že kniha vám poskytne správně dávkovanou okružní jízdu, která vás seznámí nejenom se všemi základními věcmi, ale zároveň vám umožní nahlédnout do zákulisí, takže zjistíte, jak ve skutečnosti fungují vnitřnosti ASP.NET. Kniha od vás požaduje jediné. Že dobře rozumíte jazyku C# a základům .NET. Jste-li příležitostným vývojářem v Javě nebo C++, ale s C# teprve začínáte, možná bude lepší, abyste si nejprve přečetli nějakou knihu věnovanou základům .NET – zkuste třeba knihu C# and the .NET 2.0 Platform, Third Edition (Apress, 2005), což je vyčerpávající úvod, nebo knihu A Programmer’s Introduction to C# 2.0, Third Edition (Apress, 2005).

Cesta ASP.NET od 1.0 k 2.0 Jak už nepochybně víte, ASP.NET je technologie nové generace od společnosti Microsoft pro vytváření webových aplikací na straně serveru. Je založená na Microsoft .NET Frameworku, což je rámec provázaných technologií, v nichž je téměř vše revoluční – od přístupu k databázím až k distribuovaným aplikacím. ASP. NET je jednou z nejdůležitějších komponent .NET Frameworku – je to část, která umožňuje vyvíjet vysoce výkonné webové aplikace a webové služby. ASP.NET 1.0 způsobilo revoluci ve světě webového programování. Stalo se populárním tak prudce, že jeho licenci si obstaraly prostřednictvím licenčního programu Go-Live společnosti Microsoft tisíce komerčních webových serverů ještě v době, kdy byl ještě ve fázi beta. Finální verze ASP.NET 1.0 byla vydána na počátku roku 2002. ASP.NET 1.1 nebylo až tak ambiciózní. Pro architekty společnosti Microsoft představovalo příležitost, aby se mohli na chvíli zastavit a nabrat kolektivní dech. ASP.NET 1.1 se nesoustředilo na nové schopnosti (žádné v něm nebyly), ale spíše na vyladění výkonu, na dopracování záležitostí týkajících se bezpečnosti, a na opravy drobnějších závad. Nové schopnosti byly tiše strčeny do šuplíků a uschovány pro další hlavní milník, kterým se mělo stát ASP.NET 2.0. ASP.NET 1.1 byl vydáno ke konci roku 2003, a učinilo z ASP.NET solidní platformu pro webový vývoj, jednu z voleb pro profesionální webové vývojáře. Až za dva další dlouhé roky se konečně na obzoru objevilo ASP.NET 2.0. Na rozdíl od vydání ASP.NET 1.0, ASP.NET 2.0 nereprezentuje začátek nové éry webového vývoje. A skutečně – téměř veškerá podkladová architektura, o kterou se opíralo ASP.NET 1.0, zůstala v ASP.NET 2.0 stejná. Rozdíl spočívá v tom, že ASP. NET 2.0 přidává k existující technologii další vrstvy vysokoúrovňových schopností. Po úspěchu ASP.NET 1.0 společnost Microsoft nasměrovala všechny své vývojáře, čas a prostředky na plánování a přípravu ASP.NET 2.0. Když Microsoft zjistil, že není potřeba přepisovat engine ASP.NET, členové týmu ASP.NET dostali větší volnost, a mohli se věnovat inovacím v podobě nových ovládacích prvků, mohli vytvářet dokonalejší řešení správy dat, vybudovat bezpečnostní rámec založený na rolích, a dokonce mohli vyrobit celou soupravu nástrojů pro vytváření webových portálů. Stručně řečeno – ASP.NET 2.0 dává vývojářům šanci si v klidu nabírat z plné mísy nových dobrot, které byly navrženy pro jejich oblíbenou platformu. V této knize se dozvíte o tom, jak se všechny tyto schopnosti používají, přizpůsobují a rozšiřují.


26

Co naleznete v této knize? Podívejte se na stručný přehled toho, co vás čeká v této knize:

Část I – Základy ASP.NET. Začíná se kapitolou 1, kde se z všeobecného hlediska podíváte na platformu ASP.NET, na .NET Framework, a na změny ve výbavě ASP.NET 2.0. V kapitole 2 rozšíříte své dovednosti tím, že se naučíte zacházet s Visual Studiem 2005. V kapitolách 3, 4, 5 a 6 se dozvíte o klíčových částech infrastruktury ASP.NET, kam patří model webové stránky, konfigurace aplikace, správa stavu a ukládání do cache. Až zvládnete tyto nepostradatelné pojmy, sestoupíte poněkud níž a podíváte se, jak ASP.NET zpracovává požadavky, a jak spravuje dobu života webových aplikací. Také se dozvíte, jak se dá architektura ASP.NET rozšiřovat.

Část II – Přístup k datům. Tato část se zabývá jednou z klíčových oblastí každého vývoje softwaru – přístupem k datům a manipulací s nimi. V kapitolách 7 a 8 probereme, jak se aplikují základní prvky ADO.NET ve webových aplikacích, a dozvíte se, jak navrhovat komponenty pro přístup k datům. V kapitolách 9 a 10 se dozvíte o sadě nových datových ovládacích prvků ASP.NET, které umožňují formátovat a prezentovat data, aniž byste museli vytvářet dlouhé pasáže kódu. V kapitole 11 přejdeme k vyspělým strategiím cachování dat, jimiž si zajistíte bleskurychlý výkon. A konečně – v kapitolách 12 a 13 se přesuneme k databázím. Ukážeme vám, jak pracovat s obsahem v podobě XML, a jak zpracovávat běžný přístup k souborům.

Část III – Budování webů ASP.NET. V této části se dozvíte o podstatných technikách a schopnostech pro správu skupin webových stránek. V kapitole 14 začneme s jednoduchými uživatelskými ovládacími prvky, s jejichž pomocí budeme schopni využívat části uživatelského rozhraní. V kapitole 15 se podíváte na dvě nové inovace ASP.NET – motivy (pro automatizaci vzhledu ovládacích prvků) a vzory stránek (pro opětovné využití jedné šablony layoutu ve více stránkách).V kapitole 16 vám ukážeme, jak se v ASP.NET 2.0 používá nový navigační model ASP.NET 2.0, který slouží k tomu, abyste vašim návštěvníkům umožnili pohodlně přecházet z jedné stránky na jinou. V kapitole 17 společně prozkoumáme lokalizaci, v kapitole 18 si popíšeme rozmisťování aplikací, také webový server IIS.

Část IV – Bezpečnost. V této části se podíváte na bohatou výbavu schopností ASP.NET, které se týkají bezpečnosti. V kapitole 19 začnete vysokoúrovňovým přehledem bezpečnostních pojmů a dozvíte se o výhodách a nevýhodách formulářové autentizace (kapitola 20), a o novém API pro členství (kapitola 21), které s formulářovou autentizací spolupracuje. V kapitole 22 se budete potýkat s autentizací Windows. V kapitole 23 se dozvíte o tom, jak uplatnit na autentizované uživatele restrikce pomocí sofistikovaných autorizačních pravidel, a zjistíte, jak se pracuje s bezpečností založenou na rolích. V kapitole 24 prozkoumáte API pro profily, což je nové, předem vybudované, řešení pro ukládání informací specifických pro jednotlivé uživatele. V kapitole 25 pokročíte ještě dál. Dozvíte se, jak s pomocí šifrování ochránit nejenom data, která ukládáte do databáze, ale také údaje, které odesíláte v URL adrese. V kapitole 26 vám ukážeme, jak se můžete zapojit do bezpečnostního modelu ASP. NET tím, že si vytvoříte vlastního poskytovatele členství.

Část V – Pokročilé uživatelské rozhraní. Zde vám ukážeme, jak se dají pomocí vyspělých technik rozšiřovat webové stránky. V kapitolách 27 a 28 se budete potýkat s vlastními ovládacími prvky. V kapitolách 29 a 30 si obohatíte své dovednosti o JavaScript (pro vytvoření více dynamických stránek), a GDI+ (pro ruční tvorbu obrázků). V kapitole 31 prozkoumáte pracovní rámec pro webové části, s jejichž pomocí se vytvářejí webové portály.

Část VI – Webové služby. Webové služby se využívají v oblasti, která se zabývá sdílením funkcionality mezi různými aplikacemi, síťovými prostředími a počítačovými platformami. V kapitole


27 32 začnete úplně na začátku – uvidíte, jak se vytvářejí základní webové služby a jak se používají ve webových aplikacích ASP.NET, v aplikacích .NET Windows, a dokonce ve zděděných aplikacích klasického ASP. V kapitole 33 nahlédnete do nitra standardů, které to všechno umožňují, a uvidíte, jak fungují. V kapitole 34 se dozvíte, jak se prostřednictvím vyspělých technik asynchronně volají webové služby, jak se implementují bezpečné služby, a pomocí soupravy nástrojů WSE (Web Services Enhancements) začnete pracovat s nejnovějšími standardy webových služeb.

Komu je kniha určena? Kniha je zamýšlena jako prvotní zdroj informací pro profesionální vývojáře, kteří mají slušné znalosti o webovém vývoji na straně serveru. Kniha neposkytuje vyčerpávající pohled na každou ingredienci nacházející se uvnitř .NET Frameworku – taková kniha by musela mít více než dvojnásobný počet stran. Proto se kniha raději zaměřuje na to, aby poskytla neobšírný, inteligentní úvod do ASP.NET pro profesionální programátory, kteří se nemíní zdržovat se základy. Průběžně se budete soustřeďovat na různá zákoutí .NET Frameworku, která potřebujete znát, abyste mohli budovat profesionální webové aplikace, mezi něž které patří přístup k datům a XML. S těmito schopnostmi budete schopni vytvářet weby nové generace, a to s nejlepšími nástroji, jaké jsou dnes k dispozici. Kniha je také velmi praktická. Nedozvíte se pouze o schopnostech ASP.NET, dozvíte se také o technikách ze skutečného světa, s jejichž pomocí budete moci převést svůj web na vyšší kvalitativní úroveň. Pozdější kapitoly knihy jsou zasvěcené břitkým tématům, jako jsou vlastní ovládací prvky, dynamická tvorba grafiky, pokročilá bezpečnost, či vysoký výkon při přístupu k datům. Tohle všechno je potřebné pro vývoj profesionálních webových aplikací. Abyste mohli z této knihy vytěžit co nejvíc, měli byste se dobře vyznat v syntaxi jazyka C# a v pojmech objektově orientovaného programování. Nemusíte mít zkušenosti s předchozí verzí ASP.NET, protože veškeré potřebné základy se v knize probírají. Jste-li ostříleným vývojářem Java nebo C++, ale bez zkušeností s .NET, zvažte, zdali byste neměli tuto knihu doplnit nějakým úvodem do .NET, jako je například kniha A Programmer’s Introduction to C# 2.0, Third Edition (Apress, 2005).

Co potřebujete, abyste mohli s knihou pracovat? Hlavním požadavkem pro práci s touto knihou je nějaký počítač s nainstalovaným Visual Studiem 2005. Přestože se teoreticky dá kód vytvářet ručně, je to nesmírně pracné, a navíc je tu vysoká pravděpodobnost vzniku chyb, takže se tento přístup nikdy nepoužívá v profesionálních kruzích. POZNÁMKA Je možné používat okleštěnou verzi Visual Studia s označením Web Developer 2005 Express Edition, ale u některých příkladů se dostanete do značných těžkostí. Nejdůležitějším omezením je to, že s Visual Studio Web Developer 2005 Express Edition nemůžete vytvářet knihovny tříd, které jsou podstatnou součástí moderního designu orientovaného na komponenty.

Abyste mohli provozovat stránky ASP.NET, potřebujete Windows 2000 Professional, Windows XP Professional, Windows 2000 Server, nebo Windows Server 2003. Musíte také nainstalovat IIS (Internet Information Services), hostitelský software pro weby, který je součástí operačního systému Windows, a který potřebujete, pokud chcete vytvářet webové služby nebo testovat vaše webové aplikace. Do knihy je také začleněno několik příkladů, které pracují s ukázkovou databází SQL Serveru, aby bylo možné demonstrovat kód pro přístup k datům, techniky týkající se bezpečnosti, a webové služby. Používáte-li jiné


28 relační databázové enginy, budete moci aplikovat stejné pojmy – ovšem s tím, že budete muset modifikovat zdrojový kód ukázek. Kniha byla vytvořena s poslední verzí beta 2. Protože ASP.NET v době vydání této knihy dokončovalo svůj vývojový beta cyklus, je možné, že ve finálním vydání dojde k nějakým změnám. Tyto změny mohou zahrnovat nové schopnosti nebo drobné syntaktické odlišnosti (přejmenování nějaké vlastnosti či metody). Protože vám chceme pomoci vyhnout se případným zmatkům, odkazujeme vás na adresu http://www.zonerpress. cz/download/asp_net_2.zip, odkud si můžete moci stáhnout kód ukázek připravený pro finální verzi.

Sdělte nám svůj názor Jako čtenáři této knihy se stáváte těmi nejdůležitějšími kritiky a komentátory. Vážíme si vašeho názoru a chtěli bychom vědět, co děláme správně, co bychom mohli dělat lépe, ve kterých oblastech bychom měli publikovat a také vaše další podnětné myšlenky, o které jste ochotni se s námi podělit. Jako odborný redaktor Zoner Press vítám vaše názory. Můžete mi psát – poslat e-mail nebo dopis – a sdělit mi, co se vám v této knize líbilo nebo nelíbilo, stejně tak, co bychom měli udělat, aby naše další knihy byly lepší. Pokud mi napíšete, nezapomeňte prosím připojit název knihy, ISBN, jméno autora, vaše jméno, telefon, fax nebo e-mail. Pozorně zhodnotím vaše názory a poskytnu je autorovi a redaktorům, kteří pracovali na této knize. Prosím, vězte, že nemohu pomoci s technickými problémy, které se týkají obsahu knihy, a že díky velkému množství e-mailů, které dostávám, nemohu zaručit odpověď na každou zprávu. E-mail: miroslav.kucera@zoner.com nebo knihy@zoner.cz. Adresa: Zoner Press, ZONER software, s.r.o, Miroslav Kučera, Nové sady 18, 602 00 Brno.

Zdrojové soubory Zdrojové soubory k této knize je možné stáhnout na adrese http://www.zonerpress.cz/download/ asp_net_2.zip (1,92 MB). Zdrojové soubory jsou rozděleny do samostatných adresářů podle kapitol. Než začnete se zdrojovým kódem pracovat, přečtěte si doprovodný soubor readme.txt, který obsahuje informace o tom, co je potřeba mít na zřeteli.


KAPITOLA 1 Úvod do ASP.NET Když ve společnosti Microsoft vytvářeli .NET, nesnili pouze o budoucnosti – na srdci jim také ležely různé neduhy a omezení současné generace technologií webového vývoje. Než začneme pracovat s ASP.NET 2.0, neuškodí, když se trochu poohlédneme zpět, a budeme se chvilku těmto problémům věnovat. Pak lépe pochopíte, jaké nabízí .NET možnosti. V této kapitole probereme historickou cestu, kterou urazil webový výzkum, a která nás dovede až k ASP.NET. Prolétneme tryskem okolo nejvýznamnějších rysů .NET a zběžně se seznámíme s klíčovými změnami, které přicházejí s ASP.NET 2.0. Jestliže s ASP.NET začínáte, pomůže vám tato kapitola, abyste se rychle dostali do obrazu. Jste-li však příležitostným vývojářem v .NET, máte dvě možnosti. Tou první je, že si kapitolu přečtete, abyste bryskně získali přehled o tom, jak to s ním vypadá dnes. Druhá možnost je taková, že rovnou přejdete k oddílu "ASP.NET 2.0 – příběh pokračuje", abyste se seznámili s tím, co má ve svém arzenálu ASP.NET 2.0.

Evoluce webového vývoje První přenos dat přes HTTP (Hypertext Transfer Protocol) uskutečnil Tim Berners-Lee už před více než deseti lety. Od té doby prodělalo HTTP exponenciální růst popularity, prolomilo hranice malé skupiny vizionářů počítačové vědy, a pronikl jak do soukromého sektoru, tak i do byznysu. Dnes je to téměř slovo patřící do běžného hovorového jazyka. Když bylo HTTP zřízeno poprvé, bylo pro vývojáře nelehkou výzvou navrhovat aplikace, které se uměly vyhledat a vzájemně spolu komunikovat. Aby mohli vývojáři takové výzvě úspěšně čelit, byly pro ně vytvořeny různé standardy, jako HTML (Hypertext Markup Language) nebo XML (Extensible Markup Language). HTML definovalo prostý jazyk, s jehož pomocí je možné popsat, jak zobrazit komplikované dokumenty na prakticky jakékoliv počítačové platformě. XML zase vytvořilo sadu pravidel pro vytváření formátů dat neutrálních vzhledem k platformám, s jejíž pomocí si pak mohou rozličné aplikace vyměňovat informace. Standardy garantovaly, že web mohl od té doby využívat kdokoliv, odkudkoliv, a s jakýmkoliv typem počítačového systému. Souběžně s tím výrobci softwaru čelili svým vlastním výzvám. Potřebovali vyvinout nejenom takové jazyky a programovací nástroje, které by uměly komunikovat s webem, ale také celý pracovní rámec, které by vývojářům umožnil navrhovat nejenom architekturu aplikací, ale také je vyvíjet a rozšiřovat – a to, pokud možno, co nejsnadnějším způsobem. Přední výrobci softwaru, IBM, Sun Microsystems či Microsoft, spěchali, aby vzniklou potřebu uspokojili hromadou nových produktů.


32

Kapitola 1 – Úvod do ASP.NET

ASP.NET 1.0 otevřel novou kapitolu ve stále probíhajícím závodě ve zbrojení. Společnost Microsoft s technologií .NET vytvořila integrovanou skupinu komponent, která kombinuje budování částí pro web (značkovací jazyky a HTTP) s osvědčenou metodologií orientovanou na objekty.

Vývojový svět před příchodem ASP.NET Starší technologie určené pro webové aplikace založené na serveru se spoléhaly na skriptovací jazyky, nebo na proprietární konvence značkování. Většina modelů pro webový vývoj poskytovala jen nemotorné háky, s jejichž pomocí jste mohli spouštět aplikace nebo nechat běžet komponenty na serveru. Neposkytovaly moderní a integrovaný pracovní rámec (framework) pro webové programování. Obecně se dá říci, že většina pracovních rámců pro webový vývoj, které byly vytvořeny před ASP.NET, spadá do jedné ze dvou kategorií:

• •

Skripty, které interpretuje nějaký zdroj na serveru. Oddělené, malinkaté aplikace, které se vykonávají voláním na straně serveru.

Klasické ASP (Active Server Pages, verze ASP, která je předchůdcem ASP.NET) a ColdFusion patří do první kategorie. Vy, jakožto vývojář, máte za úkol vytvořit soubor se skriptem, který obsahuje vložený kód. Soubor skriptu prozkoumá jiná komponenta, která střídá zpracování běžného HTML kódu a vykonávání vašeho vloženého kódu. Jestliže jste už někdy vytvářeli aplikace ASP, bezpochyby je vám známo, že skriptované aplikace se vykonávají mnohem menší rychlostí, než aplikace zkompilované. Skriptované platformy mimo to podporují vznik dodatečných problémů – chybí například možnost řídit nastavení bezpečnosti nebo se neefektivně využívají systémové zdroje. Druhý přístup, který ve značné míře využívá Perl přes CGI (Common Gateway Interface), přináší zase úplně odlišnou sadu problémů. V těchto pracovních rámcích spouští webový server oddělenou aplikaci, která má za úkol zpracovat požadavek klienta. Aplikace vykonává svůj kód a dynamicky vytváří HTML, který se má poté odeslat zpět klientovi. Přestože se aplikace tohoto druhu vykonávají rychleji než jejich skriptované protějšky, vykazují tendenci spotřebovávat mnohem více paměti. Klíčovým problémem je to, že webový server musí vytvořit oddělenou instanci aplikace pro každý požadavek klienta. Takový model způsobuje, že aplikace jsou mnohem méně škálovatelné (scalable) v prostředích s velkým počtem simultánních uživatelů – zejména tehdy, pokud neprogramujete velmi pečlivě. Tento druh aplikací se dost obtížně píše, dost obtížně ladí, a navíc není snadné je integrovat s jinými komponentami. ASP.NET znamená mnohem víc než prostou evoluci jednoho či druhého typu aplikace. Boří stávající trend a přichází s kompletně novým vývojovým modelem. Hlavní rozdíl je v tom, že ASP.NET je do hloubky integrováno se svým podkladovým pracovním rámcem. ASP.NET není nějaké rozšíření či modifikace .NET Frameworku s elastickými háky napojenými do funkcionality, kterou poskytuje. Je to zcela jinak. ASP.NET je částí .NET Frameworku, kterou spravuje runtime .NET. Technologie ASP.NET v podstatě odstraňuje dělící čáru mezi vývojem aplikací a webovým vývojem, protože rozšiřuje nástroje a technologie, které si výhradně používali vývojáři desktopových aplikací, do světa webového vývoje.

Co je špatného na klasickém ASP? Jestliže jste doposud programovali s klasickým ASP, možná se divíte, proč bylo Microsoftem v ASP.NET změněno úplně všechno. Naučit se úplně nový pracovní rámec, to rozhodně není dětská slavnost, zvláště tehdy, když .NET přichází s hromadou nových pojmů a nabízí některé části, jejichž zvládnutí může být dosti zapeklitou záležitostí.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

33

Všeobecně se dá říci, že klasické ASP je solidním nástrojem pro vývoj webových aplikací s využitím technologií Microsoftu. Ovšem, podobně jako je tomu u většiny vývojových modelů, ASP sice některé problémy řeší, nicméně také přináší několik nových problémů. V následujících částech si tyto problémy stručně popíšeme.

Kód, co se táhne jako špagety Pokud jste někdy vytvářeli aplikace s ASP, pravděpodobně jste se setkali s dlouhými stránkami, které obsahují směs skriptu realizovaného na straně serveru a HTML. Podívejte se na ukázku. Kód v ní uvedený naplňuje rozevírací seznam (ovládací HTML prvek) výsledky získanými databázovým dotazem: <% Set dbConn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.Recordset") dbConn.Open connectionString %> <select name="cboAuthors"> <% rs.Open "SELECT * FROM Authors", dbConn, 3, 3 Do While Not rs.EOF %> <option value="<%=rs("au_id")%>"><%=rs("au_lname") & ", " & _ rs("au_fname")%></option> <% rs.MoveNext Loop %> </select>

V této ukázce je zapotřebí celých 16 řádků kódu na to, aby se vygeneroval jediný ovládací HTML prvek. To není zrovna působivé. Horší ale je, že takový styl psaní kódu má negativní dopad na výkon aplikace, protože se dohromady míchá HTML a skript. Až bude tuhle stránku zpracovávat ISAPI (Internet Server Application Programming Interface) ASP, což je rozšíření, které běží na webovém serveru, bude se muset skriptovací engine několikrát zapínat a vypínat, a přitom se jedná o zpracování jednoho jediného požadavku. Zvyšuje se tím doba nutná na zpracování celé stránky a její odeslání klientovi. Dále, webové stránky, které jsou napsané pomocí tohoto stylu, mohou snadno a rychle nabobtnat do nezvladatelných délek. A přidáte-li do celé skládačky ještě vaše vlastní komponenty COM, které budete potřebovat na zprovoznění funkcionalit, které ASP poskytnout neumí, stane se noční můra ohledně údržby takových stránek ještě tíživější. Závěr je jasný. Bez ohledu na to, jaký přístup zvolíte, kód ASP vykazuje tendenci, že se postupně stane odpudivým, nadměrně dlouhým, a neuvěřitelně obtížně laditelným – pokud ovšem dokážete nějaké ladění ASP ve vašem prostředí vůbec zprovoznit. V ASP.NET takové problémy neexistují. Webové stránky se píší s ohledem na tradiční objektově orientované pojmy, a obsahují takové ovládací prvky, že s nimi pracujete velmi obdobným způsobem jako v případě desktopových aplikací. To znamená, že nemusíte dělat směs z HTML značek a přímého (inline) kódu. Pokud přijmete při vytváření stránek ASP.NET přístup, kdy se používá kód v pozadí (code-behind), bude kód opravdu oddělen od prezentace, což zjednoduší údržbu kódu a umožní oddělit design webové stránky od obtížné práce spojené s vytvořením kódu pro webové stránky.


34

Kapitola 1 – Úvod do ASP.NET

Skriptovací jazyky V době, kdy bylo vytvořeno, vypadalo ASP jako perfektní řešení pro desktopové vývojáře, kteří se přesouvali do světa webu. Místo toho, aby se museli učit nějaký úplně nový jazyk, nebo novou metodologii, jim ASP umožnilo, aby použili jim důvěrně známé jazyky, jako VBScript, na programovací platformě založené na serveru. Protože se už tehdy jako podkladová kostra používal populární programovací model COM (Component Object Model), skriptovací jazyky fungovaly i jako pohodlný dopravní prostředek pro přístup ke komponentám a prostředkům serveru. Ale i když bylo ASP snadno pochopitelné pro vývojáře, kteří dovedně ovládali skriptovací jazyky, jako je VBScript, tahle důvěrná známost nebyla získána zadarmo. Protože ASP bylo založeno na starších technologiích, které byly původně navrženy pro použití u klientů, nemohly stejně dobře fungovat v novém prostředí webového vývoje. Výkon nebyl jediným problémem. Každý objekt nebo proměnná, které byly použity v klasickém skriptu ASP, se vytvářely jako datový typ variant. Většina programátorů Visual Basicu velmi dobře ví, že datové typy variant jsou velmi vágně typované. Požadují větší množství paměti a jsou pozdě vázány (late-bound) – výsledkem je nižší výkon. Kompilátor a vývojové nástroje navíc nemohly tyto datové typy identifikovat v době generování designu. To způsobilo, že bylo téměř nemožné vytvořit opravdu integrované vývojové prostředí (IDE, integrated development environment), které by poskytlo programátorům ASP cokoliv podobného, jako jsou třeba vyspělé ladicí prostředky, IntelliSense, nebo kontroly chyb, což jsou věci běžné ve Visual Basicu a Visual C++. Bez ladicích nástrojů na odpovídající úrovni se programátoři ASP dostávali do těžkých stresů, když měli napravovat chyby, které vznikaly v jejich skriptech. ASP.NET všechny takové problémy obchází velkým obloukem. Pro začátek stačí říct, že se stránky a webové služby ASP.NET vykonávají uvnitř CLR (common language runtime), takže mohou být napsány v jakémkoliv jazyku, pro který existuje kompilátor, který funguje v souladu s požadavky CLR. Už nejste omezeni pouze na VBScript nebo JavaScript – můžete používat i moderní objektově orientované jazyky, jako jsou Visual Basic a C#. Je také důležité připomenout, že stránky ASP.NET se neinterpretují, ale kompilují do tzv. assembly, což je termín .NET pro jakoukoliv jednotku zkompilovaného kódu). Jedná se o jeden z nejvýznamnějších zobecňujících příspěvků do webového vývojového modelu Microsoftu. To, co se skutečně děje za scénou, je opravdu revoluční. I když třeba vytvoříte svůj kód v Poznámkovém bloku a zkopírujete ho přímo do nějakého virtuálního adresáře na webovém serveru, aplikace se dynamicky zkompiluje, jakmile k ní přistoupí nějaký klient, a její kopie se uloží do cache pro potřeby budoucích požadavků. Jestliže se po ukončení kompilačního procesu kterýkoliv ze souborů změní, aplikace se automaticky překompiluje, jakmile ji bude nějaký klient vyžadovat.

Smrt COM Přestože Microsoft hlásá věčnou podporu pro COM, což je technologie, která tvoří základ operačního systému Windows a téměř každé aplikace, která pod ním běží, je zřejmé, že .NET je pro moderní vývoj počátkem nové cesty. Budoucí verze operačního systému Windows (včetně nepolapitelného Longhornu) budou do jádra operačního systému stále více integrovat .NET Framework, což z něho učiní prvotřídní jazyk pro veškerý vývoj aplikací. A tak, jak budou aplikace COM postupně ztrácet na popularitě a převádět se do .NET, klasické ASP se časem stane pouhou vzpomínkou na minulost. Přestože .NET zahrnuje robustní podporu součinnosti s COM, faktem zůstává, že pro klasické aplikace ASP už není ve světě .NET místo.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

35

ASP.NET 1.0 Vývojáři Microsoftu popsali ASP.NET jako svou šanci "odeslat příkaz pro zformátování systému", a začít ze zcela novým a modernějším vývojovým modelem. Tradiční pojmy týkající se vytváření webových aplikací však ve světě .NET stále platí. Každá webová aplikace se skládá z webových stránek. Můžete zpracovávat bohatě vybavené HTML, používat JavaScript, vytvářet komponenty, do nichž zapouzdříte programovací logiku, nebo přizpůsobovat a vylaďovat své aplikace za pomoci různých konfiguračních voleb. V pozadí však ASP.NET pracuje zcela odlišně než tradiční skriptovací technologie, mezi které patří klasické ASP nebo PHP. ASP.NET je také mnohem více ambicióznější než JSP (JavaServer Pages). ASP.NET se v porovnání s dřívějšími vývojovými platformami odlišuje v těchto věcech:

ASP.NET nabízí úplný, objektově orientovaný programovací model, který obsahuje architekturu řízenou událostmi, založenou na ovládacích prvcích, což podporuje zapouzdřování kódu a jeho opětovné využívání.

ASP.NET dává možnost psát kód v kterémkoliv z podporovaných jazyků.NET (mezi ně patří Visual Basic, C#, J# a mnoho dalších jazyků, které mají kompilátory od jiných výrobců).

ASP.NET slouží také jako platforma pro budování webových služeb, což jsou opětovně využitelné jednotky kódu, které mohou volat jiné aplikace přes platformy a hranice dané počítači. Webová služba se dá použít prakticky na cokoliv – od zpřístupnění desktopové aplikace na webu až třeba po sdílení dat s klientem Javy běžícím pod Unixem.

ASP.NET je vše podřízeno vysokému výkonu. Stránky ASP.NET a komponenty se kompilují na požádání, a tudíž se neinterpretují pokaždé, když se použijí. ASP.NET také obsahuje vyladěný model pro přístup k datům a flexibilní ukládání dat do cache, aby bylo možné ještě více zvyšovat výkon v případě potřeby.

Tohle je pouze několik ze základních rysů, mezi které dále patří rozšířená správa stavu (state management), praktické vázání dat, dynamická tvorba grafiky nebo robustní model bezpečnosti. S jednotlivými zdokonaleními se podrobně seznámíte v knize a zjistíte, jak do celého obrázku zapadá ASP.NET 2.0.

Sedm důležitých faktů o ASP.NET Jestliže s ASP.NET začínáte (nebo si prostě chcete osvěžit nějaké základy), budou pro vás následující oddíly zajímavé. Uvádí se v nich sedm nejdůležitějších faktů o .NET.

Fakt 1: ASP.NET je integrováno s .NET Frameworkem .NET Framework je rozčleněn do kolekce funkčních částí, zahrnující více než 7000 typů (termín .NET pro třídy, struktury, rozhraní a další klíčové programovací ingredience). Než se můžete pustit do programování jakéhokoliv druhu aplikace .NET, je potřeba, abyste měli základní informace o těchto částech – a abyste chápali, proč jsou věci uspořádány tak, jak uspořádány jsou. Obrovská kolekce funkcionality, kterou poskytuje .NET Framework, je zorganizována tak, že klasičtí programátoři Windows to budou považovat za šťastný krok vpřed. Každá z těch tisíců tříd v .NET Frameworku je seskupena do logického, hierarchického kontejneru, který se nazývá jako jmenný prostor (namespace). Různé jmenné prostory poskytují různé schopnosti. Když se to vezme všechno dohromady, tak jmenné prostory .NET nabízejí funkcionalitu téměř jakéhokoliv aspektu distribuovaného vývoje, od front zpráv (message queuing) až po otázky bezpečnosti. Této obrovské skupině nástrojů se říká knihovna tříd (class library).


36

Kapitola 1 – Úvod do ASP.NET

Je zajímavé, že třídy .NET Frameworku používáte v ASP.NET stejně, jako v jakémkoliv jiném druhu aplikace .NET (mezi které patří různé aplikace Windows, služby Windows, utility pro příkazový řádek atd.). Jinak řečeno – .NET dává webovým vývojářům stejné nástroje, jaké dává vývojářům bohatě vybavených klientských aplikací. Jestliže jste už něco s ASP.NET 1.x naprogramovali, zjistíte, že stejná sada tříd je k dispozici i v ASP.NET 2.0. Rozdíl je v tom, že ASP.NET 2.0 přidává do připraveného koktejlu ještě další třídy; mnohé z nich jsou ve zcela nových jmenných prostorech, které jsou určené pro speciální činnosti, kam například patří konfigurace, monitorování zdravotního stavu (health monitoring) nebo personalizace. TIP Jedním z nejlepších zdrojů, v němž se dozvíte o všech nových zákoutích .NET Frameworku, je jeho referenční příručka knihovny tříd (.NET Framework class library reference), která je součástí referenční knihovny MSDN Help. Máte-li nainstalované Visual Studio 2005, dostanete se do knihovny MSDN Help tak, že zvolíte Start > Programy > Microsoft Visual Studio 2005 > Microsoft Visual Studio 2005 Documentation (přesný text prvků menu závisí na vaší konkrétní verzi Visual Studia). Jakmile jednou nápovědu načtete, referenční informace o třídách naleznete uspořádané podle jmenných prostorů pod uzlem .NET Development > .NET Framework SDK > Class Library Reference.

Fakt 2: ASP.NET se neinterpretuje, ale kompiluje Jedním z hlavních důvodů degradace výkonu ve skriptech ASP je to, že se v kódu webových stránek ASP používají interpretované skriptovací jazyky. To znamená, že když se aplikace vykonává, musí skriptovací hostitel na serveru interpretovat kód a přeložit jej do strojového kódu nižší úrovně, pěkně řádek po řádku. Tento proces je, jak každý ví, velmi pomalý. POZNÁMKA V tomto případě je reputace o něco horší než skutečnost. Interpretovaný kód je nepochybně pomalejší než zkompilovaný kód, ale rozdíl ve výkonu není až tak signifikantní, aby to způsobovalo, že byste s ASP nemohli vytvářet profesionální weby. Stejná omezení, která v tomto ohledu ovlivňují ASP, ovlivňují i aplikace Javy, protože Java je také interpretovaný jazyk, který se nikdy nekompiluje. Je to jeden z dramatických rozdílů mezi Javou a jazyky, které budete používat při práci s ASP.NET.

Aplikace ASP.NET se kompilují vždy – a skutečně, je nemožné spouštět kód C# nebo VB.NET, aniž by se předtím nejprve nezkompiloval. Aplikace ASP.NET procházejí dvěma kompilačními etapami. V první etapě se kód C#, který jste napsali, zkompiluje do přechodného jazyka, který se nazývá jako Microsoft Intermediate Language (MSIL), nebo prostě jen IL. Tento první krok je fundamentální příčinou toho, že v .NET je možné používat různé programovací jazyky. Všechny jazyky .NET (včetně C#, Visual Basicu, a mnoha dalších) se totiž zkompilují do virtuálně identického kódu IL. První kompilační krok může nastat automaticky, když se stránka poprvé požaduje, nebo se může vykonat předem (to je proces, kterému se říká předběžná kompilace, precompiling). Zkompilovanému souboru s kódem IL se říká assembly. Druhá úroveň kompilace nastává těsně předtím, než se stránka skutečně vykoná. V tomto okamžiku se kód IL zkompiluje do nativního nízkoúrovňového strojového kódu. Tato etapa se nazývá jako kompilace just-in-time (JIT) a probíhá stejně pro všechny aplikace .NET (včetně například aplikací Windows). Oba kroky kompilačního procesu vidíte na obrázku 1-1.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

37

Kompilace .NET je rozdělena do dvou kroků proto, aby se vývojářům mohlo nabídnout co největší pohodlí a co nejlepší přenositelnost. Předtím, než může kompilátor vytvořit nízkoúrovňový strojový kód, potřebuje znát typ operačního systému a hardwarovou platformu, kde bude aplikace běžet (například 32bitový nebo 64bitový operační systém Windows). Když máte dvě kompilační etapy, můžete vytvořit zkompilovanou assembly s kódem .NET, kterou je možné distribuovat na více než jednu platformu.

Kód ve VB.NET

Kompilátor VB .NET

Kód v C#

Kód v jiném jazyku .NET

Kompilátor C#

Adekvátní kompilátor

Kód v C#

Spoleèný runtime jazyk (Common Language Runtime)

Kompilátor JIT (Just-in-time)

Nativní strojový kód

Vykonání kódu

Obrázek 1-1. Kompilace webové stránky ASP.NET.

POZNÁMKA Brzy přijde den, kdy tento model možná pomůže profesionálním programátorům v rozšiřování aplikací na operační systémy, které nejsou od Microsoftu, jako je třeba Linux. Tento ambiciózní cíl sice doposud nebyl uskutečněn, ale pokud byste si rádi vyzkoušeli první verzi .NET pro platformu Linux (s vývojovou implementací ASP.NET), navštivte http://www.go-mono.com a stáhněte si nejnovější verzi tohoto softwaru pocházejícího od komunity open-source.

Kompilace JIT by samozřejmě nebyla tak užitečná, kdyby se musela provádět pokaždé, když nějaký uživatel požádá o zobrazení nějaké webové stránky. Aplikace ASP.NET se naštěstí nemusejí kompilovat pokaždé, když vznikne nějaký požadavek na webovou stránku či webovou službu. Kód IL se vytvoří pouze jednou, a pak už se generuje jen tehdy, když dojde k modifikaci zdroje. Obdobně se uchovávají i kopie souborů s nativním


Kapitola 1 – Úvod do ASP.NET

38

strojovým kódem, a sice v systémovém adresáři, jehož cesta typicky vypadá jako c:\[WinDir]\Microsoft.NET\ Framework\[Verze]\Temporary ASP.NET Files, kde [WinDir] zastupuje adresář Windows a [Verze] zastupuje číslo aktuálně nainstalované verze .NET Frameworku. POZNÁMKA Přestože jsou počítačové testy výkonnosti hodně kontroverzní, zajímavé porovnání Javy a ASP.NET najdete na http://gotdotnet.com/team/compare. Mějte ale na paměti, že skutečné nesnáze omezující výkon se obvykle vztahují ke konkrétním "úzkým hrdlům" systému, jakými jsou například rychlost přístupu na disk, využívání CPU, rychlost síťového připojení atd. V mnoha testech výkonnosti vykazuje ASP.NET lepší výsledky než jiná řešení, protože podporuje ty schopnosti platforem, které mají vliv na výkon, například ukládání dat do cache. Není to následek nárůstu rychlosti způsobeného tím, že je kód zkompilovaný.

Přestože v ASP.NET 2.0 zůstává kompilační model v podstatě stejný, jedna důležitá změna tu je. Vývojářský nástroj (Visual Studio) už kód nekompiluje. Webové stránky a služby se kompilují až tehdy, když je poprvé spustíte, což má pozitivní dopad na proces ladění. Abyste se vyhnuli zbytečné zátěži s první kompilací, když rozmisťujete finální aplikaci (a zabránili jiným lidem šťourat se ve vašem kódu), můžete využít novou schopnost předběžné kompilace (precompilation), která se blíže vysvětluje v kapitole 18.

Fakt 3: ASP.NET je vícejazyčné I když při vývoji svých aplikací patrně dáváte přednost jednomu z jazyků před ostatními, tahle volba neurčuje, co budete všechno schopni udělat ve vašich webových aplikacích. Je to proto, že ať už použijete kterýkoliv jazyk, kód se vždy zkompiluje do IL. IL je odrazovým můstkem každé řízené aplikace. (Řízená aplikace, managed application, je jakákoliv aplikace, která byla napsána pro .NET a vykonává se uvnitř řízeného prostředí CLR.) V jistém smyslu je jazykem .NET právě IL. Je to jediný jazyk, kterému CLR rozumí. Abyste IL snadněji pochopili, ukažme si jednoduchý příklad. Podívejme se na jednu funkci, která byla napsaná v jazyku C#: namespace HelloWorld { public class TestClass { private static void Main(string[] args) { Console.WriteLine("Hello World"); } } }

Kód předvádí nejjednodušší aplikaci, jakou lze v .NET napsat – je to jednoduchá utilita pro příkazový řádek, která zobrazí v okně konzole jedinou, předem stanovenou, zprávu. Nyní se podívejme na tento kód z jiné perspektivy. Tady máte odpovídající kód IL: .method public static void Main() cil managed { .entrypoint


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

39

.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 ) // Code size 14 (0xe) .maxstack 8 IL_0000: nop IL_0001:

ldstr "Hello World"

IL_0006:

call void [mscorlib]System.Console::WriteLine(string)

IL_000b: nop IL_000c: nop IL_000d: ret } // konec metody Module1::Main

K IL kódu jakékoliv zkompilované aplikace .NET se dostanete velmi snadno. Spustíte prostě Disassembler IL, který se nainstaluje společně s Visual Studiem a .NET SDK (Software Development Kit). Soubor ildasm.exe hledejte v adresáři, který mívá obvykle cestu c:\Program Files\Visual Studio 2005\SDK\ v2.0\Bin. Jakmile tento program načtete, zvolte File > Open a k prohlížení si vyberte libovolný soubor DLL nebo EXE, který byl vytvořen s .NET. Pokud chcete zjistit, co se v IL kódu děje, a pokud budete trpěliví, dokážete s trochou logiky takový kód IL snadno dešifrovat. Skutečnost, že se dá IL snadno rozkrýt, může sice vyvolávat otázky, jak moc je vlastně soukromý a jak lze nad ním získat plnou kontrolu, nicméně těmito záležitostmi se obvykle vývojáři ASP. NET vůbec nezabývají. A to proto, že veškerý kód ASP.NET se ukládá i vykonává na serveru. Protože soubor se zkompilovaným kódem klient nikdy neobdrží, nemá žádnou možnost, jak ho dekompilovat. Jestliže vás ale tahle záležitost přece jenom trápí, použijte nějakou "zatemňující" utilitu, neboli obfuscator, který kód "zamlží", takže bude obtížnější mu porozumět. (Můžete například přejmenovat všechny proměnné tak, aby měly nesmyslné, o ničem nevypovídající, názvy jako třeba f__a__234.). Visual Studio obsahuje zredukovanou verzi jednoho obfuscatoru, který se jmenuje Dotfuscator. Následující výpis obsahuje kód téže utility pro příkazový řádek, tentokrát ve Visual Basicu: Namespace HelloWorld Public Class TestClass Private Shared Sub Main(Ars() As String) Console.WriteLine("Hello World") End Sub End Class End Namespace

Pokud byste zkompilovali tuto aplikaci a podívali se na kód IL, zjistili byste, že všechny jeho řádky jsou identické s kódem IL, který se vygeneroval z verze v jazyku C#. Přestože jednotlivé kompilátory mohou tu a tam vnášet své vlastní optimalizace, všeobecným pravidlem je, že žádný z jazyků .NET nepodává lepší výsledky než jiný jazyk .NET, protože všechny sdílejí společnou infrastrukturu. Tato infrastruktura je definována ve specifikaci společného jazyka (CLS, Common Language Specification), kterou popisujeme v rámečku "Specifikace společného jazyka" dále v textu. Je důležité připomenout, že IL byl nedávno přijat jako standard ANSI (American National Standards Institute). Toto přijetí by mohlo urychlit přijetí ostatních pracovních rámců společného jazyka (common language frameworks). Jako ukázka jednoho z takových projektů může posloužit projekt Mono, který je k dispozici na adrese http://www.go-mono.com.


40

Kapitola 1 – Úvod do ASP.NET

SPECIFIKACE SPOLEČNÉHO JAZYKA CLS definuje standardní vlastnosti, které musejí obsahovat všechny objekty, aby spolu mohly v nějakém homogenním prostředí vzájemně komunikovat. Aby mohl CLR takovou komunikaci umožnit, očekává, že všechny objekty budou ctít konkrétní sadu pravidel. Touto sadou pravidel je CLS. Definuje mnoho norem, které musejí jazyky dodržovat, jako klíčová slova, typy, přetěžování metod (overloading) atd. Každý kompilátor generující kód IL, který se má vykonat v CLR, musí ctít všechna pravidla vyžadovaná uvnitř CLS. CLS dává vývojářům, dodavatelům a výrobcům softwaru možnost pracovat uvnitř společné sady specifikací stanovených pro jazyky, kompilátory a datové typy. Postupem času se bude vynořovat víc a víc jazyků a kompilátorů, které budou v souladu s požadavky CLS, několik takových už je dnes k dispozici. Vezmeme-li v potaz stanovená kritéria, může být dost složité vytvořit kompilátor jazyka, který by generoval kód tak, aby byl plně v souladu s požadavky CLR. Nicméně, kompilátory mohou existovat pro prakticky jakýkoliv jazyk, a je zde šance, že nějaký vyhovující kompilátor bude k dispozici pro každý z jazyků, o jehož použití byť jenom vzdáleně uvažujete. Představte si – programátoři sálových počítačů, kteří kdysi nedali dopustit na COBOL, protože jej považovali za výkvět všech jazyků, mohou nyní své znalosti uplatnit při vytváření webových aplikací.

Fakt 4: ASP.NET běží uvnitř společného runtime jazyků Patrně nejdůležitějším aspektem ASP.NET, který je potřeba si zapamatovat, je to, že běží uvnitř runtime enginy CLR. Na .NET Framework se v celku – tj. se všemi svými jmennými prostory, aplikacemi a třídami – odkazuje jako na řízený (managed) kód. I když vyčerpávající rozbor CLR přesahuje téma této kapitoly, uveďme si alespoň několik výhod, které z toho plynou:

Automatická správa paměti a svoz odpadků (garbage collection). Vždy, když aplikace vytvoří instanci nějakého objektu, CLR alokuje pro objekt prostor na řízeném heapu (managed heap). Vy tuto paměť ovšem nikdy nemusíte uvolňovat ručně. Jakmile se vaše reference na objekt dostane mimo obor (nebo aplikace končí), stane se objekt dostupným pro svoz odpadků (garbage collection). Uvnitř CLR pravidelně jezdí (běží) "popelářský vůz" (garbage collector) a automaticky požaduje nepoužívanou paměť objektů, k nimž už nelze přistupovat. Tento model vás zbavuje nutnosti zabývat se složitostmi nízkoúrovňového zacházení s pamětí ve stylu C++ a od podivností spojených s počítáním referencí na COM.

Typová bezpečnost. Když kompilujete nějakou aplikaci, .NET přidá do assembly informaci, specifikující některé podrobnosti o ní, například dostupné třídy, jejich členy, jejich datové typy atd. Výsledkem je, že assembly zkompilovaného kódu budou plně soběstačné. Jiní lidé je budou moci používat, aniž by se požadovaly nějaké podpůrné soubory, nehledě na to, že kompilátor umí ověřit, zdali bude každé volání při běhu platné. Tato dodatečná vrstva bezpečnosti také zamezuje vzniku různých nízkoúrovňových chyb, jako je nechvalně proslulé přetečení bufferu.

Rozšiřitelná metadata. Informace o třídách a členech jsou pouze jedním z typů metadat, která .NET ukládá do zkompilované assembly. Metadata popisují kód a umožňují poskytnout dodatečné informace pro runtime nebo pro jiné služby. Metadata mohou například sdělit debuggeru, jak má trasovat kód, nebo mohou sdělit Visual Studiu, jak má zobrazit nějaký váš prvek v režimu designu. Pomocí metadat můžete také zapnout další služby runtime (jako jsou webové metody nebo služby COM+).


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

41

Strukturované zpracování chyb. Jestliže jste někdy napsali jakýkoliv, pro lidi alespoň trochu užitečný kód ve Visual Basicu nebo VBScriptu, téměř jistě jsou vám důvěrně známé omezené prostředky, které tyto jazyky nabízejí pro zpracování chyb. Pomocí strukturovaného zpracování výjimek můžete svůj kód, jímž budete reagovat na chyby, uspořádat logicky, stručně a výstižně. Můžete vytvářet oddělené bloky, v nichž budete zpracovávat různé druhy chyb. Ovladače (handlers) výjimek můžete vnořovat do hloubky, přes více vrstev.

Multithreading. CLR poskytuje fond vláken (pool of threads), který mohou využívat různé třídy. Můžete například volat metody, číst soubory, nebo komunikovat s webovými službami asynchronně, aniž byste museli explicitně vytvářet nové vlákna.

Vysokoúrovňový pohled na CLR a .NET Framework můžete vidět na obrázku 1-2.

Obrázek 1-2. CLR a .NET Framework.

Fakt 5: ASP.NET je objektově orientované ASP poskytuje poměrně chabý objektový model. Poskytuje pouze malou sadu objektů a v podstatě tvoří pouze tenkou vrstvu nad zdrojovými detaily HTTP a HTML. Oproti tomu je ASP.NET opravdu objektově orientované. Nejenom, že kód má úplný přístup ke všem objektům v .NET Frameworku, můžete také těžit z veškerých konvencí objektově orientovaného prostředí (OOP). Můžete například vytvářet opětovně využi-


42

Kapitola 1 – Úvod do ASP.NET

telné třídy, standardizovat kód s rozhraním, nebo začlenit nějakou užitečnou funkcionalitu do zkompilované komponenty určené k šíření. Jednu z nejhezčích ukázek objektově orientovaného myšlení v ASP.NET naleznete u serverových ovládacích prvků (server-based controls). Serverové ovládací prvky jsou ideálním vzorem pro zapouzdření. Vývojáři mohou s objekty ovládacích prvků programátorsky manipulovat pomocí kódu, např. pro přizpůsobení jejich vzhledu, mohou jim poskytovat data, která zobrazují nebo mohou reagovat na různé události. Nízkoúrovňové detaily HTML jsou ukryty v pozadí. Místo toho, aby byl vývojář nucen ručně vytvářet zdrojový kód HTML, jednotlivé objekty ovládacích prvků se do HTML převedou samy, při realizování stránky. ASP.NET tedy nabízí serverové ovládací prvky jako způsob abstrakce nízkoúrovňových detailů pro programování HTML a HTTP. Podívejte se na krátkou ukázku založenou na standardním textovém poli v HTML: <input type="text" id="myText" runat="server" />

Pouhým přidáním atributu runat="server" se z původní statické části HTML stává plnohodnotný a funkční ovládací prvek na straně serveru, s nímž můžete manipulovat ve svém zdrojovém kódu. Můžete pracovat s událostmi, které generuje, nastavovat atributy nebo vázat ovládací prvek na zdroj dat. Například text, který se má v tomto prvku objevit při prvním načtení stránky, můžete nastavit tímto jednoduchým kódem: void Page_Load(object sender, EventArgs e) { myText.Value = "Hello World!"; }

Kód po formální stránce nastavuje vlastnost Value objektu HtmlInputText. Výsledkem je, že přiřazený řetězec textu se zobrazí v textovém poli na HTML stránce, která se realizovala a odeslala klientovi.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

43

OVLÁDACÍ PRVKY HTML VERSUS WEBOVÉ OVLÁDACÍ PRVKY Když se ASP.NET vytvářet, existovaly dva možné způsoby vývoje. Někteří vývojáři ASP.NET se nejvíce zajímali o ty serverové ovládací prvky, které by exaktně odpovídaly již existující sadě ovládacích prvků HTML. Tento přístup umožňuje vytvářet rozhraní webových stránek ASP.NET v editorech určených pro editaci HTML, a umožňuje rychlou migraci existujících ASP stránek. Jiná skupina vývojářů ASP.NET však rozpoznala příslib něčeho nového – bohatě vybavených serverových ovládacích prvků, jejichž náplní nebude pouhá emulace jednotlivých HTML značek. Takové ovládací prvky by pak mohly realizovat svá rozhraní z desítek odlišných prvků HTML, ale přitom programátorovi stále poskytovat jednoduché rozhraní založené na objektech. Pomocí tohoto modelu by pak vývojáři mohli pracovat s programovatelnými nabídkami, s kalendáři, s různými seznamy dat nebo s validátory. Po zralé úvaze se společnost Microsoft rozhodla, že poskytne oba modely. Právě jste viděli ukázku serverového ovládacího prvku HTML, který se mapuje přímo na základní sadu HTML značek. Kromě nich však existují webové ovládací prvky ASP.NET, které poskytují mnohem vyšší úroveň abstrakce a více funkcionality. Ve většině případů se serverové ovládací prvky HTML používají pro zpětnou kompatibilitu nebo tehdy, když je nutná rychlá migrace; v nových projektech se používají webové ovládací prvky. Značky webových ovládacích prvků ASP.NET vždy začínají prefixem asp:, za kterým následuje název třídy. Například následující fragment vytvoří textové pole a zaškrtávací políčko: <asp:TextBox id="myASPText" Text="Textové pole ASP.NET, nazdar!" runat="server" /> <asp:CheckBox id="myASPCheck" Text="Moje zaškrtávací políčko" runat="server" />

Opět si připomeňme, že s oběma ovládacími prvky je možné komunikovat s např. využitím tohoto kódu: myASPText.Text = "Nový text"; myASPCheck.Text = "Zaškrtni mně!";

Všimněte si, že vlastnost Value, se kterou jste se setkali u ovládacího prvku HTML, byla nahrazena vlastností Text. Vlastnost HtmlInputText.Value tak byla původně pojmenována proto, aby to souhlasilo s odpovídajícím atributem value u značky <input> v HTML. Webové ovládací prvky však nekladou takový důraz na vztahy k syntaxi HTML, takže byl zvolen lépe výstižnější název vlastnosti, tedy Text. Rodina webových ovládacích prvků ASP.NET zahrnuje nejenom složitě se generující prvky (mezi ně patří Calendar a TreeView), ale také poměrně přímočaré prvky, jako textové pole, popisek nebo tlačítko (TextBox, Label, Button), které se poměrně úzce mapují na existující značky v HTML. V naposled zmíněném případu poskytují obě varianty, jak serverový ovládací prvek HTML, tak i webový ovládací prvek ASP.NET, obdobnou funkcionalitu, i když u webových ovládacích prvků je tendence vystavovat standardizovanější a bezproblémovější rozhraní. To znamená, že webové ovládací prvky se dají snadno zvládnout, nehledě na to, že to znamená, že na ně mohou plynule a zcela přirozeně přejít vývojáři Windows, kteří se přesídlují do světa webu, protože mnohé názvy vlastností jsou obdobné (v porovnání s odpovídajícími ovládacími prvky Windows).

Fakt 6: ASP.NET podporuje různá zařízení a různé prohlížeče Jednou z největších výzev, které čelí weboví vývojáři, je značná různorodost prohlížečů, které je potřeba podporovat. Všelijaké prohlížeče a jejich verze a jejich konfigurace se liší v tom, jak podporují HTML. Weboví vývojáři musejí zvolit, zda je potřeba obsah realizovat podle HTML 3.2, nebo podle HTML 4.0, nebo nějak


44

Kapitola 1 – Úvod do ASP.NET

úplně jinak, třeba podle XHTML 1.0, nebo dokonce podle WML (Wireless Markup Language), které je určeno pro mobilní zařízení. Tento problém, který vznik díky různým firmám vyrábějící prohlížeče, sužuje vývojáře už od chvíle, kdy World Wide Web Consortium schválilo první verzi HTML. A život se vám zkomplikuje ještě víc, pokud využívat nějaké rozšíření HTML, jako je JavaScript, abyste mohli vytvářet dynamičtější stránky nebo nabídnout možnost ověřit platnost vstupních dat. ASP.NET se vypořádává s tímto problémem pozoruhodně inteligentně. Přestože můžete pomocí ASP.NET stránky získat informace o prohlížeči klienta a o jeho schopnostech, ASP.NET vybízí vývojáře, aby tyto věci ignorovali a využívali bohatě vybavenou skupinu webových ovládacích prvků. Ty realizují svůj kód HTML přizpůsobivě – berou totiž v úvahu schopnosti klienta. Jako vhodný příklad z ASP.NET zde mohou posloužit ovládací prvky pro ověřování platnosti vstupních dat (tzv. validátory), které pro rozšíření svých schopností používají JavaScript a DHTML (Dynamic HTML), za předpokladu, že je klient podporuje. To umožňuje těmto validačním ovládacím prvkům dynamicky zobrazovat chybové zprávy, aniž by uživatel musel stránku odesílat zpět na server k dalšímu zpracování. Jsou to sice schopnosti volitelné, ale dobře demonstrují, jak mohou inteligentní ovládací prvky vytěžit maximum z nejmodernějších prohlížečů, a přitom neponechat stranou ostatní klienty. A úplně nejlepší je to, že pro podporu obou druhů prohlížečů, jak těch moderních, tak i těch "méně moderních", nemusíte napsat ani řádek kódu navíc. POZNÁMKA Bohužel – ASP.NET 2.0 stále ještě nestihlo do tohoto pěkného obrazu integrovat ovládací prvky pro mobilní zařízení. To znamená, že chcete-li vytvářet webové stránky pro různá chytrá zařízení (smart devices), jako jsou mobilní telefony nebo PDA, budete potřebovat sice podobný, nicméně oddělený toolkit. Tvůrci ASP.NET původně plánovali sjednocení obou modelů, aby bylo možné standardní sadu serverových ovládacích prvků vygenerovat pomocí jiných, méně obsáhlejších, standardů, jako třeba WML nebo HDML (Handheld Device Markup Language). Ovšem už brzy, ve fázi beta, byla tato schopnost ASP.NET 2.0 kompletně smetena ze stolu.

Fakt 7: ASP.NET se snadno rozmisťuje a konfiguruje Jednou z věcí, ze kterých vývojáře během vývojového cyklu nejvíce bolí hlava, je rozmístění dokončené aplikace do rutinního provozu na ostrý server. Nejenom, že je nutné přenést soubory webových stránek, databáze a komponenty, ale musí se také zaregistrovat komponenty a opětovně vytvořit hromadu konfiguračních nastavení. ASP.NET celý tento proces značně zjednodušuje. Každá instalace .NET Frameworku poskytuje stejné jádro tříd. Z toho plyne, že se aplikace ASP.NET rozmisťují relativně snadno. Ve většině případů stačí pouze zkopírovat všechny soubory do nějakého virtuálního adresáře na ostrém serveru (pomocí nějakého FTP programu nebo pomocí příkazového řádku). Pokud má hostitelský stroj .NET Framework, nejsou potřeba žádné registrační kroky, které by mohly být časově velmi náročné. Distribuce komponent, které využívá vaše aplikace, je stejně snadná. Když rozmisťujete svou aplikaci, není nutné udělat nic víc, než zkopírovat všechny komponenty. Protože jsou všechny informace o komponentě uloženy přímo v metadatech souboru assembly, není potřeba spouštět nějaký registrační program nebo modifikovat registr Windows. Pokud umístíte své komponenty na správné místo (do podadresáře Bin adresáře webové aplikace), bude je engine ASP.NET detekovat automaticky a učiní je dostupnými pro kód vaší webové stránky. Zkuste udělat to samé s klasickou komponentou COM! Konfigurace je další výzvou, se kterou je nutné se při rozmisťování aplikací vypořádat, zejména tehdy, když potřebujete přenášet informace týkající se bezpečnosti, jako jsou účty uživatelů či oprávnění přidělená uživatelům. ASP.NET tuto fázi rozmisťovacího procesu usnadňuje tím, že minimalizuje závislost na nastavení v IIS


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

45

(Internet Information Services). Většina nastavení ASP.NET se tak ukládá v souboru web.config, který existuje právě pro tento účel. Soubor web.config se umístí do téhož adresáře, kde máte své webové stránky. Obsahuje hierarchická seskupení nastavení aplikace, která jsou uložená ve formátu XML. Takový soubor se dá snadno přečíst a k jeho editaci nepotřebujete nic více, než pouhý textový editor, například Poznámkový blok. Když nějaké modifikujete nějaké nastavení aplikace, ASP.NET si toho všimne, a hladce restartuje aplikaci v nové doméně aplikace (doménu existující aplikace pak nechá v provozu tak dlouho, dokud se neukončí zpracování všech doposud nevyřešených požadavků). Soubor web.config není nikdy uzamčen, takže jej můžete aktualizovat skutečně kdykoliv.

ASP.NET 2.0 – příběh pokračuje Když Microsoft vydal ASP.NET 1.0, ani on přesně neodhadl, s jakým nadšením bude tato nová technologie přijata. ASP.NET se rychle stalo standardem pro vývoj webových aplikací s technologiemi Microsoftu a velmi zdatným konkurentem pro všechny ostatní platformy webového vývoje. POZNÁMKA Statistiky o tom, jak to, či ono přijala veřejnost, jsou vždy problematické, ale vysoce uznávaná internetová analytická firma Netcraft (http://www.netcraft.com) došla k závěru, že používání ASP.NET roste každým rokem o dvojnásobek, a že nyní běží na více webových serverech než JSP. Její průzkum sice nezahrnoval relativními velikost zkoumaných webů, ale ASP.NET pohání významné množství webů firem uvedených v žebříčku časopisu Fortune.

Důkazem dobrého návrhu ASP.NET 1.0 a 1.1 je to, že pouze velmi málo změn v ASP.NET 2.0 jsou opravami existujících schopností. ASP.NET 2.0 si ponechává stejné osvědčené základy, a zaměřuje se na přidávání nových funkcionalit. Jinak řečeno – ASP.NET 2.0 obsahuje více nových schopností, různých parádiček a nástrojů, což zvyšuje produktivitu vývojáře. Cílem, jak prohlásil tým ASP.NET, je zredukovat počet řádků kódu, které musíte napsat, až o 70 procent. POZNÁMKA Ve skutečném světě se v případě profesionálních webových aplikací určitě nedocílí sedmdesátiprocentní redukce kódu. Patrně však budete překvapeni, až naleznete nové schopnosti, které budete moci implementovat do svých aplikací s využitím velmi malého množství úprav. A na rozdíl od mnohých nedopečených parádiček si nebudete muset nechat zajít chuť na tyto věci, protože se vám nebude chtít začít budovat svou aplikaci znovu od samého začátku. Ne. Opravdu budete schopni zapojit své vlastní moduly přímo do existujícího pracovního rámce, takže konečným výsledkem bude úspora času, zdokonalená flexibilita a opětovná využitelnost.

Oficiálně je ASP.NET 2.0 zpětně kompatibilní s ASP.NET 1.0. V realitě ovšem stoprocentní zpětná kompatibilita nikdy neexistuje, protože opravy některých chyb a možných nekonzistencí v jazyku mohou změnit způsob práce již existujícího kódu. Microsoft udržuje seznam takových rušivých změn (většina z nich je velmi bezvýznamných) na http://www.gotdotnet.com/team/changeinfo/Backwards1.1to2.0. Je velmi nepravděpodobné, že byste se dostali do nějakých potíží, až budete přenášet nějaký projekt z ASP.NET 1.x do ASP.NET 2.0. Mnohem pravděpodobnější je, že narazíte na případy, kdy starý způsob řešení nějakého problému bude stále fungovat, nicméně ASP.NET 2.0 bude přinášet mnohem lepší přístup. Pak bude jenom na vás, zdali ponecháte stávající stav, nebo jestli se pokusíte svou webovou aplikaci upravit tak, aby mohla těžit z výhod plynoucích z nových schopností.


46

Kapitola 1 – Úvod do ASP.NET

Samozřejmě – ASP.NET 2.0 se neomezuje pouze na přidávání nových schopností. Přispívá také k vyššímu výkonu a zjednodušuje konfiguraci s novým nástrojem, který je pojmenován jako WAT (Website Administration Tool). V následujících částech se seznámíte s některými nejdůležitějšími změnami obsaženými v různých částech .NET Frameworku.

C# verze 2005 C# obsahuje ve verzi 2005 několik nových schopností. Některé z nich jsou dost exotické, a budou předmětem obdivu jen u opravdových příznivců tohoto jazyka, jiné jsou ale užitečné všeobecněji. Mezi nové schopnosti patří:

Parciální třídy (partial classes). Parciální třídy umožňují rozdělit třídu C# do dvou nebo více souborů zdrojového kódu. Tato schopnost je určena primárně k tomu, aby se skryly zapeklité detaily, které nemusí mít člověk pořád na očích. Visual Studio využívá parciální třídy v některých typech projektů – pro odklizení automaticky generovaného kódu z dohledu.

Generičnost (generics). Umožňuje vytvářet třídy, které jsou dostatečně flexibilní na to, aby uměly pracovat s různými typy tříd, a současně podporovaly kontrolu silného typování. Pomocí této schopnosti můžete například napsat kód pro třídu kolekce, do které se bude moci ukládat jakýkoliv typ objektu. Když pak vytvoříte instanci této kolekce, "uzamknete ji" na třídu, kterou jste si zvolili, takže se do ní budou moci ukládat pouze data jediného typu. Důležitým faktem uvedeného příkladu je to, že třídu uzamknete až v okamžiku jejího použití, nikoliv v okamžiku, kdy vytváříte její kód.

Anonymní metody. Anonymní metody umožňují definovat blok kódu "za pochodu", uvnitř jiné metody. Pomocí této techniky se dají rychle zavěšovat ovladače událostí (event handler).

Iterátory. Iterátory umožňují snadno vytvářet třídy, které podporují vypočítávání (enumeration), což znamená, že můžete projít v cyklu hodnoty, které obsahují, pomocí příkazu foreach.

Parciální třídy uvidíte v akci v kapitole 2, generické třídy s kolekcemi později. Anonymní metody a iterátory patří mezi speciality, a této v knize se nepopisují (o obou těchto schopnostech C# se však můžete dozvědět více v článku, který je na adrese http://www.ondotnet.com/pub/a/dotnet/2004/04/05/csharpwhidbeypt1.html).

Visual Studio 2005 Pro vytváření webových aplikací s ASP .NET 1.x společnost Microsoft poskytovala dva oddělené nástroje – plnohodnotné Visual Studio .NET a volně dostupný program Web Matrix. Profesionální vývojáři vesměs favorizují Visual Studio .NET, nicméně Web Matrix nabízel několik inovačních schopností navíc. Protože Web Matrix obsahoval svůj vlastní, ovšem poněkud "očesaný" webový server, mohli programátoři vytvářet a testovat webové aplikace, aniž by se museli na svém počítači starat o konfiguraci virtuálních adresářů s využitím IIS. Pro .NET 2.0 už není Web Matrix dostupný, nicméně Visual Studio získalo některé z jeho nejlepších schopností, včetně integrovaného webového serveru, což umožňuje okamžitě, bez předběžných příprav, začít pracovat s testovacím webem. Další vítanou změnou ve Visual Studiu 2005 je podpora různých způsobů programování. Zatímco Visual Studio .NET 2003 nabízelo pouze jeden způsob, Visual Studio 2005 podporuje různé způsoby programování, takže je to opravdu flexibilní a všestranně využitelný designérský nástroj. Můžete si například zvolit, zdali HTML značky a kód pro zpracování událostí dáte do jediného nebo do více souborů, aniž byste přitom narušili možnost plně využívat Visual Studio a těžit z jeho dodatečných schopností, jakou je třeba IntelliSense.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

47

(O právě popsaném rozdílu se dozvíte více v kapitole 2.) V jednom projektu můžete rovněž používat více než jeden programovací jazyk. Můžete tak například směšovat webové stránky obsahující kód C# s webovými stránkami s Visual Basicem atd.

ASP.NET 2.0 V této knize většinou nerozlišujeme mezi schopnostmi, které jsou nové v ASP.NET 2.0, a mezi těmi, které už existují od ASP.NET 1.0. Hlavní rozdíly však uvádíme v několika následujících částech.

Vzory stránek Potřebujete implementovat jednotný vzhled na více stránkách? Se vzory stránek (master pages) můžete nadefinovat šablonu, a bez dalšího úsilí ji opětovně využívat. Například pomocí šablony můžete zajistit, aby měla každá webová stránka v aplikaci stejné záhlaví, stejné zápatí a obsahovala stejné navigační ovládací prvky. Ve vzorech stránek se definují konkrétní regiony, které je možné editovat; říká se jim obsahové regiony (content regions). Každá stránka, která používá nějaký vzor stránek, získává zcela automaticky svůj layout a své pevné prvky a dodává obsah pro tyto regiony. Na obrázku 1-3 vidíte ukázku webové stránky s obsahovým regionem v režimu designu Visual Studia. Vzorová stránka, resp. šablona stránky, dodá záhlaví a formátování stránky. Obsahová stránka (content page) pak vloží do konkrétního regionu dodatečný kód HTML a webové ovládací prvky.

Obrázek 1-3. Webová stránka s regionem pro obsah v režimu designu. V souvislosti se vzory stránek zde musím připomenout, že ASP.NET obsahuje také novou schopnost, která se nazývá jako motivy (themes). Motivy umožňují nadefinovat standardizovanou sadu charakteristik vzhledu webových ovládacích prvků. Jakmile nadefinujete tyto formátovací předvolby, můžete je použít pro celý svůj web, takže všechny webové stránky budou mít jednotný vzhled. Je poměrně zajímavé, že jak vzor stránek, tak i motiv můžete nastavovat při běhu aplikace. To znamená, že můžete napsat kód, jehož prostřednictvím můžete používat různé motivy a různé vzory podle toho, o jakého uživatele se jedná, nebo podle toho, jaké jsou jeho preference. Vzory stránek a motivy lze proto využívat


48

Kapitola 1 – Úvod do ASP.NET

nejenom pro standardizaci celkového vzhledu webu, ale také pro přizpůsobení vzhledu webu jednotlivým uživatelům. Vzory stránek a motivy se podrobněji probírají v kapitole 15.

Ovládací prvky pro zdroje dat Už jste unaveni z neustálého načítání, formátování a zobrazování svých dat? S novým modelem ovládacích prvků pro zdroje dat můžete ve stránce deklarativně definovat, jak má stránka komunikovat se zdrojem dat. Nemusíte tak opakovaně vytvářet stejný kód pro přístup k datovým objektům. Nejlepší ale na tom je, že vás tahle schopnost nijak nenutí, abyste se vzdali dobrého návrhu založeného na komponentách – vlastní datovou komponentu můžete využít právě tak snadno, jako když se vážete přímo na databázi. Podívejte se, jak funguje nový model vázání dat v té nejjednodušší situaci. Nejprve ve Visual Studiu přetáhněte a upusťte na stránku ovládací prvek GridView, nebo jej napište ručně tímto způsobem: <asp:GridView id="MyDataGrid" runat="server"/>

Poté je potřeba přidat zdroj dat, který načte řádky z databáze, o které máte zájem, a který je učiní dostupnými pro GridView. V našem jednoduchém příkladu se pomocí SqlDataSource napojíme přímo na databázi SQL serveru. V profesionální aplikaci se obvykle používá ObjectDataSource, aby se prošlo skrze oddělenou vrstvu vlastních komponent. Pro vytvoření značky SqlDataSource potřebujeme znát několik detailů, jako např. dotaz, pomocí kterého se získají požadované záznamy z databáze, a připojovací řetězec, který se použije pro připojení k databázi. Celý proces můžete absolvovat buď v průvodci Visual Studia, nebo napsat celý kód ručně. Ať už to uděláte jakkoliv, nakonec skončíte s něčím takovým, jako je tohle (za předpokladu, že databáze SQL serveru, ke které se chcete připojit, je na aktuálním počítači a podporuje autentizaci Windows): <asp:SqlDataSource ID="CustomersList" Runat="server" SelectCommand="SELECT CompanyName, ContactName, ContactTitle, City FROM Customers" ConnectionString= "Data Source=127.0.0.1;Integrated Security=SSPI;Initial Catalog=Northwind"> </asp:SqlDataSource>

Uvedený zdroj dat definuje jak připojení k databázi pojmenované jako Northwind, tak i operaci specifikovanou dotazem SELECT, který načte všechny záznamy z tabulky Customers. A nakonec je potřeba svázat tento zdroj dat s GridView. Uděláme to tak, že nastavíme vlastnost DataSourceID objektu GridView na název SqlDataSource (v našem případě je to CustomersList). To se dá udělat ručně, nebo v okně Properties. Každopádně skončíte se značkou GridView v této podobě: <asp:GridView id="MyDataGrid" DataSourceID="CustomersList" runat="server"/>

Aniž byste museli psát nějaký další kód nebo přidávat k ovládacímu prvku GridView nějaké speciální formátování (a že existuje spousta nastavení právě pro tohle), získáte ničím nepřikrášlovanou tabulku z obrázku 1-4. Tento základní vzhled tabulky pak můžete dále vylepšovat – např. definovat hodnoty pro styl písma, barvu pozadí, styl záhlaví a mnoho dalších věcí. Můžete také zapnout schopnosti pro řazení podle zvoleného sloupce, stránkování (tabulka se rozčlení do několika stránek), výběr či editování.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

49

Obrázek 1-4. Jednoduchá tabulka zobrazující získaná data. Kromě GridView ASP.NET 2.0 dále nabízí nové ovládací prvky pro zobrazování dat, mezi které patří DetailsView a FormView. Oba mohou fungovat i jako prohlížeč záznamů – mohou v daném okamžiku zobrazovat podrobné informace pouze o jediném záznamu. Také podporují editaci. Novým schopnostem práce s daty se podstatně více věnuje druhá část knihy.

Personalizace Většina webových aplikací pracuje s daty, která jsou specifická pro daného uživatele. Pokud například vytváříte web internetového obchodu, bude asi potřeba, abyste ukládali a podle potřeby načítali poštovní adresu aktuálního uživatele, jeho preference ohledně prohlíženého obsahu webu, obsah nákupního košíku atd. ASP.NET 1.x umožňovalo na krátkou dobu ukládat tyto informace do stavu relace (session state). Rozhodnutí, zdali tyto informace ukládat do nějaké databáze pro případné budoucí využití, pak bylo pouze na vás. ASP.NET 2.0 se s tímto omezením vypořádává pomocí personalizace, což je API určené pro zacházení s informacemi specifickými pro jednotlivé uživatele, které jsou uložené v databázi. Myšlenka personalizace je založena na tom, že ASP.NET vytvoří objekt profilu, v němž pak můžete kdykoliv přistupovat k informacím specifickým pro daného uživatele. ASP.NET se pak v zákulisí postará o tu nudnou práci spojenou s načítáním dat profilu v okamžiku, kdy jsou zapotřebí, a také s uložením dat profilu při jejich aktualizaci. Většina seriózních vývojářů rychle zjistí, že výchozí implementace personalizace, která je určena pro všechny možné případy, nevyhovuje jejich konkrétním potřebám. Třeba v případě, když potřebujete používat existující databázové tabulky, ukládat zašifrované informace, nebo přizpůsobit styl ukládání objemově velkých dat do cache, protože potřebujete zvýšit výkon? Zajímavé je, že personalizaci si můžete přizpůsobit, aby lépe vyhovovala vašim potřebám tím, že si vytvoříte vlastního poskytovatele personalizace. Pak budete moci lépe využívat pohodlí personalizačních schopností, a současně mít kontrolu nad nízkoúrovňovými detaily. Nevýhodou takového postupu je to, že něco z toho budete muset naprogramovat sami (zapomeňte na slibovanou redukci kódu o 70 procent). Získáte však větší flexibilitu a jednotný model profilů. Personalizace se podrobněji probírá v kapitole 24.


50

Kapitola 1 – Úvod do ASP.NET

TIP Mnoho ze schopností ASP.NET 2.0 pracuje prostřednictvím abstrakce, která se nazývá jako model poskytovatele (provider model). Elegance modelu poskytovatele spočívá v tom, že při budování kódu stránek můžete používat jednoduché poskytovatele. Jestliže se vaše požadavky změní, nebudete muset měnit ani jedinou stránku – místo toho postačí, když si vytvoříte vlastního poskytovatele. Model poskytovatele je natolik užitečný, že podobný vzor uspořádání byl použit pro obdobná, ručně vyrobená, řešení v prvním vydání této knihy (ještě předtím, než se na scéně objevilo ASP.NET 2.0).

Bezpečnost a členství Jednou z nejužitečnějších schopností v ASP.NET 1.x byla formulářová autentizace, což byl systém založený na cookies, který byl určený pro sledování uživatelů, kteří prokázali svou totožnost. Přestože formulářová autentizace fungovala perfektně, jednalo-li se o bezpečnost webu, bylo na vývojáři, aby sám napsal kód, na jehož základě uživatelé prokazovali svou totožnost na přihlašovací stránce. Formulářová autentizace navíc neposkytovala žádnou funkcionalitu pro autorizaci uživatele (tedy možnost zkontrolovat, zdali má aktuální uživatel přiřazenou nějakou sadu oprávnění), což znamenalo, že pokud vývojáři tyto funkcionality potřebovali, museli si je vytvořit úplně sami od začátku. ASP.NET 2.0 se vypořádává s oběma těmito nedostatky tím, že rozšiřuje formulářovou autentizaci o nové schopnosti. ASP.NET předně obsahuje automatickou podporu sledování přihlašovacích dokladů uživatele (credentials), bezpečným způsobem ukládá hesla, a provádí autentizaci uživatelů na přihlašovací stránce. Tuto funkcionalitu si můžete přizpůsobit podle vašich existujících databázových tabulek, nebo můžete jednoduše ASP.NET sdělit, kde máte umístěný databázový server, a nechat vše na něm. A kromě toho, ASP.NET obsahuje i několik nových ovládacích prvků určených pro správu bezpečnosti, které umožňují uživatelům provést novou registraci, přihlášení nebo získat zapomenuté heslo. Ovládací prvky můžete nechat, ať pracují po svém, nebo je můžete nakonfigurovat tak, aby zcela vyhovovaly vašim specifickým požadavkům. A konečně – ASP.NET přidává podporu pro autorizaci pomocí API pro členství (membership API). Členství umožňuje používat autorizaci založenou na rolích. Své uživatele zařadíte do různých skupin (jako Host, Administrátor, či Prodejce), a předtím, než uživateli povolíte nějakou konkrétní akci, otestujete, zdali je členem skupiny oprávněné provádět danou akci. Nejlepší na tom je, že členství je zapojeno přímo do bezpečnostní infrastruktury založené na formulářích. Více se dozvíte ve čtvrté části knihy.

Bohatě vybavené ovládací prvky Věřte nebo ne, ASP.NET představuje více než 40 nových ovládacích prvků. Mnohé z nich podporují nové funkcionality, jako jsou prvky zasvěcené bezpečnosti, nebo ovládací prvky webových částí (web parts), které jsou určeny pro portály. Také zjistíte, že je po ruce šikovný průvodce a ovládací prvek MultiView, takže můžete vytvářet stránky s několika různými zobrazeními. Ale pravděpodobně nejvíce užitečným novým ovládacím prvkem je nový TreeView a prvek Menu založený na JavaScriptu. TreeView umožňuje používat hierarchické (stromové) zobrazení dat se značnými možnostmi pro přizpůsobení. Několik variant TreeView s různým grafickým ztvárněním uzlů je možné vidět na obrázku 1-5.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

51

Obrázek 1-5. Několik variant prvku TreeView. Nový ovládací prvek Menu rovněž slouží k zobrazování hierarchické struktury dat, ale je založen na JavaScriptu. Když hýbete kurzorem myši, objevují se dynamicky příslušné podnabídky, které se zobrazují na aktuální webové stránce (viz obrázek 1-6).

Obrázek 1-6. Dynamický ovládací prvek Menu.


52

Kapitola 1 – Úvod do ASP.NET

TreeView i Menu se dají využít nejenom pro prezentaci jakýchkoliv dat, ale i pro zobrazení navigačního stromu, takže uživatelé mohou na vašem webu pohodlně přecházet z jedné stránky na jinou. A aby byla navigace ještě snadnější, ASP.NET přidává volitelný model pro vytvoření mapy webu (site map). Jakmile vytvoříte nějakou mapu webu, můžete ji bezproblémově využít v navigaci. Nejlepší na to je, že od tohoto okamžiku můžete měnit strukturu webu, přidávat nové stránky, aniž byste byli nuceni modifikovat cokoliv jiného, než jediný soubor s mapou webu. Navigační ovládací prvky uvidíte v akci v kapitole 16.

Webové části Jednou z běžných webových aplikací je portál, který zobrazuje na jediné webové stránce různé informace pomocí oddělených panelů. Přestože bylo možné web ve stylu portálu vytvářet už v ASP.NET 1.x, museli jste to dělat ručně. V ASP.NET 2.0 je k dispozici nová schopnost nazvaná jako webové části (web parts), která dramaticky ulehčuje život vývojáře pomocí předem vytvořeného pracovního rámce pro portál. A tato schopnost je opravdu užitečná – nabízí plovoucí layout webu, velké množství konfigurovatelných zobrazení či podporu funkcionality "táhni a pusť" (drag-and-drop). Pokud se chystáte na vytvoření nějakého webového portálu s těmito schopnostmi, můžeme v tomto případě říci, že ASP.NET 2.0 splní svůj slib ohledně oněch slibovaných 70 procent úspor v kódu. Více se o této užitečné schopnosti dozvíte v kapitole 31.

Administrace Pokud jste chtěli v ASP.NET 1.x změnit nastavení nějaké aplikace, bylo potřeba ručně editovat příslušný konfigurační soubor. I když to nebyl nijak obtížný úkol, ASP.NET 2.0 ho usnadňuje pomocí webového administračního nástroje, který existuje pouze pro tento účel, a který funguje prostřednictvím webového rozhraní. Nástroj se jmenuje WAT, a je užitečný zejména tehdy, když využíváte schopnosti pro personalizaci a členství. Je to z toho důvodu, že WAT poskytuje pohodlné (i když poněkud zdlouhavé) rozhraní, v němž se dají nadefinovat data specifická pro konkrétního uživatele, přidávat nové uživatele, přiřazovat uživatele k rolím a mnoho dalších věcí. Na WAT se blíže podíváme v kapitole 5.

Shrnutí Doposud jen kloužeme po povrchu schopností a parádiček, které poskytuje ASP.NET a .NET Framework. V této kapitole jste se zběžně seznámili s hlavními pojmy, které musíte pochopit, chcete-li se stát kompetentními programátory v ASP.NET. Také jste získali úvodní představu o nových schopnostech, které nabízí ASP. NET 2.0. O jednotlivých inovacích a dalších revolučních změnách v ASP.NET 2.0 a .NET Frameworku se postupně dozvíte v dalších kapitolách knihy.


KAPITOLA 5 Aplikace ASP.NET V tradičním desktopovém programování se aplikací rozumí spustitelný soubor a podpůrné soubory, které se k němu vztahují. Například typická aplikace Windows se skládá z hlavního spustitelného souboru (EXE), podpůrných komponent (typicky DLL) a dalších zdrojů, jakou jsou databáze a konfigurační soubory. Aplikace ASP.NET používají dost odlišný model. Na té nejzákladnější úrovni je aplikace ASP.NET kombinací souborů, stránek, ovladačů (handlers), modulů a spustitelného kódu, který se dá vyvolat z nějakého virtuálního adresáře (a z jeho podadresářů) na nějakém webovém serveru. V této kapitole se dozvíte, proč taková odlišnost existuje, a podíváte se poněkud blíže na to, jak se aplikace ASP.NET konfiguruje a rozmisťuje. Také se dozvíte, jak se s aplikací ASP.NET používají komponenty a ovladače HTTP.

ZMĚNY VE WEBOVÉ APLIKACI V .NET 2.0 Model webové aplikace zůstal v ASP.NET 2.0 v podstatě stejný. Nejvýznamnější změnou je zdokonalení konfiguračního modelu, který se nyní honosí programovatelným API a grafickým rozhraním webové stránky. Změny, s nimiž se seznámíte, jsou uvedeny v následujícím výčtu. Uvádíme je v pořadí, v jakém se v kapitole probírají:

Struktura adresářů aplikace. ASP.NET 1.x měl jeden speciální adresář webové aplikace – adresář Bin, ve kterém sídlily zkompilované assembly. ASP.NET 2.0 jich přidává několik navíc: pro zdrojový kód, lokalizovatelné zdroje, definice prohlížeče, motivy a další.

Konfigurační API. Nyní můžete pomocí šikovné sady tříd číst a zapisovat téměř jakékoliv informace konfiguračního souboru.

WAT. Nový nástroj pro administraci webu (Website Administration Tool) prezentuje pomocí nového konfiguračního API snadno zvládnutelné rozhraní v podobě webové stránky, v němž se dá nakonfigurovat webová aplikace.

Sekce konfigurace lze zašifrovat. Konfigurační soubory často obsahují citlivá data. Nyní je můžete ochránit tím, že jakoukoliv sekci je možné zašifrovat.

Jste-li příležitostným vývojářem ASP.NET 1.x, můžete číst tuto kapitolu tak, že se soustředíte hlavně na právě zmíněné novinky.


194

Kapitola 5 – Aplikace ASP.NET

Anatomie aplikace ASP.NET Rozdíl mezi aplikací ASP.NET a bohatě vybavenou klientskou aplikací se vám hodně objasní, když se podíváme na model vykonávání aplikace ASP.NET. Na rozdíl od aplikace Windows, konečný uživatel nikdy přímo nespouští aplikaci ASP.NET. Uživatel spustí nějaký prohlížeč, například Internet Explorer, a požaduje přes HTTP nějakou konkrétní URL (jako je http://www.mujweb.com/mojestranka.aspx). Požadavek dorazí na nějaký webový server. Když aplikaci ladíte ve Visual Studiu, používáte výhradně místní testovací server. Když aplikaci rozmístíte, používáte webový server IIS, což se popisuje v kapitole 18. Webový server nezná žádný pojem separátní aplikace – předá prostě požadavek zpracovatelskému procesu (worker process) ASP.NET. Zpracovatelský proces ASP.NET však pečlivě odděluje vykonávání kódu do domén aplikace založených na virtuálním adresáři. Webové stránky a webové služby, jejichž hostitelem je týž virtuální adresář (nebo některý z jeho podadresářů) se vykonávají v téže doméně. Webové stránky a webové služby, které jsou v různých virtuálních adresářích, se vykonávají v separátních doménách. POZNÁMKA Virtuální adresář je prostě adresář, který je vystavený prostřednictvím nějakého webového serveru. To, jak se vytvářejí virtuální adresáře, se dozvíte v kapitole 18. Používáte-li testovací server Visual Studia, s adresářem webového projektu se zachází jako s virtuálním adresářem. Jedinou výjimkou je, že testovací server výhradně podporuje místní připojení (tedy požadavky iniciované z aktuálního počítače).

Doména aplikace Doména aplikace je ekvivalent .NET pro proces – je to jistá hranice vynucená CLR, která zajišťuje, že jedna aplikace nemůže ovlivnit jinou aplikaci (nebo vidět její data nacházející se v paměti). Přímé důsledky modelu domény aplikace jsou následující:

Všechny webové stránky a webové služby v jedné webové aplikaci sdílejí stejné paměťové zdroje, jako jsou globální data aplikace, data relace jednotlivých uživatelů a data uložená do cache. Tyto informace nejsou přímo dostupné jiným ASP.NET nebo ASP aplikacím.

Všechny webové stránky a webové služby v jedné webové aplikaci sdílejí stejné jádro konfiguračních nastavení. Některá konfigurační nastavení však můžete přizpůsobovat v jednotlivých podadresářích téhož virtuálního adresáře. Například pro webovou aplikaci můžete nastavit pouze jediný mechanismus autentizace (ověřování totožnosti uživatelů), bez ohledu na to, kolik podadresářů má. Můžete ovšem v každém adresáři nastavit jiná pravidla autorizace, abyste mohli lépe specifikovat, kdo má mít přístup těm či oněm skupinám stránek a kdo ne.

Všechny webové aplikace vyvolávají v různých etapách globální události aplikace (když se úplně poprvé vytvoří doména aplikace, když se zničí atd.), k nimž můžete připojovat ovladače událostí. Ty budou na události aplikace reagovat pomocí kódu uvedeného v globálním souboru .asax, který bude uložen ve virtuálním adresáři aplikace.

Jinak řečeno – virtuální adresář je základní seskupující struktura, která odděluje aplikaci ASP.NET. Legitimní ASP.NET aplikace může mít klidně pouze jedinou webovou stránku (soubor .aspx), nebo webovou službu (soubor .asmx). Obecně však může aplikace ASP.NET obsahovat všechny následující ingredience:

• •

Webové stránky (soubory .aspx). Základní stavební bloky jakékoliv aplikace ASP.NET. Webové služby (soubory .asmx). Umožňují sdílet užitečné funkce s aplikacemi na jiných počítačích a jiných platformách.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

195

Soubory kódu v pozadí (code-behind files). V závislosti na tom, jaký model kódu používáte, můžete také mít oddělené soubory se zdrojovým kódem. Jsou-li napsány v jazyku C#, budou mít příponu .cs.

Konfigurační soubor (web.config). Obsahuje spoustu nastavení na úrovně aplikace. Pomocí těchto nastavení se konfiguruje všechno možné – např. věci týkající se bezpečnosti, ladění, či správy stavu (state management).

Global.asax. Obsahuje ovladače událostí, jež reagují na globální události aplikace (jako třeba událost, když aplikace startuje úplně poprvé).

Další komponenty. Jedná se o zkompilované assembly obsahující separátní komponenty, které jste vyvinuli sami, nebo se jedná komponenty s užitečnou funkcionalitou od jiných výrobců. Komponenty umožňují oddělovat obchodní logiku od logiky přístupu k datům a vytvářet vlastní ovládací prvky.

Virtuální adresář může dále obsahovat značné množství dalších zdrojů, které bude webová aplikace ASP. NET používat. Patří mezi ně stylové předpisy (stylesheets), obrázky, soubory XML atd. Kromě toho se dá model ASP.NET rozšiřovat tím, že vyvinete specializované komponenty známé jako ovladače HTTP a moduly HTTP, které se mohou zapojit do vaší aplikace a participovat na zpracování webových požadavků ASP.NET. POZNÁMKA V jednom virtuálním adresáři je možné mít i typy souborů, které vlastní odlišná rozšíření ISAPI. Může se například stát, že tam budete mít směsici souborů .aspx a .asp. Složitějším příkladem je to, pokud mapujete soubory .aspx webových stránek na verzi 1.1 ASP.NET a soubory .asmx webových služeb na verzi 2.0. V těchto situacích bude jeden virtuální adresář odpovídat více než jedné aplikaci. Aplikace pak jsou přístupné prostřednictvím jediného virtuálního webového adresáře. Každou aplikaci však bude zprostředkovávat jiné rozšíření ISAPI.

Doba života aplikace ASP.NET používá techniku tzv. lenivé inicializace (lazy initialization) při vytváření domén aplikace. Tím je řečeno to, že doména aplikace pro webovou aplikaci vytvoří až tehdy, když úplně poprvé dorazí požadavek na nějakou stránku nebo službu z této aplikace. Doména aplikace může být "shozena" z nejrůznějších příčin, včetně té, že byl "shozen" samotný webový server. Běžněji se ale aplikace samy restartují v nových doménách aplikace kvůli tomu, že reagují na nějakou chybovou podmínku nebo na nějakou změnu v konfiguraci. Například podle toho, jaká jsou nastavení v konfiguračním souboru machine.config (tedy na úrovni stroje), může být aplikace ASP.NET pravidelně recyklována, když se narazí na jisté limity. Tento model byl navržen proto, aby byly aplikace stále v dobrém zdravotním stavu, a aby se daly detekovat takové charakteristiky, které mohou indikovat vznik nějakých potíží. V závislosti na tom, jaká máte v souboru machine.config nastavení, se mohou domény aplikace recyklovat podle toho, jak dlouho se provozují, podle počtu požadavků ve frontě, nebo podle množství používané paměti (více to popisujeme v kapitole 18). Když změníte aplikaci, ASP.NET automaticky recykluje její domény aplikace. Například jste nějak modifikovali soubor web.config. Jiným příkladem může být to, že nahradíte nějaký existující soubor webové stránky nebo DLL soubor assembly nějakým jiným souborem. V obou případech ASP.NET vytvoří novou doménu aplikace pro potřeby zpracování všech budoucích požadavků, přičemž zachová existující doménu aplikace


196

Kapitola 5 – Aplikace ASP.NET

na tak dlouho, dokud se nedokončí zpracování všech dosud nevyřízených požadavků (včetně požadavků zařazených do fronty). TIP Doménu webové aplikace je možné programátorským způsobem ukončit pomocí statické metody HttpRuntime.UnloadAppDomain(). (Aplikace se pak automaticky nastartuje při příštím požadavku.) Tato technika se sice používá pouze výjimečně, nicméně se může hodit, pokud na tomtéž serveru hostujete značný počet webových aplikací, ze kterých se některé aplikace používají pouze ojediněle. V takovém případě může být zátěž spočívající v tom, že stále udržujete všechny domény aplikace v provozu, příliš velká, takže se vyplatí, když málo frekventované domény aplikace ukončíte, abyste zvýšili rychlost obsluhy následujících požadavků.

Aktualizace aplikací Jednou z nejpozoruhodnějších schopností modelu vykonávání ASP.NET je to, že můžete webovou aplikaci aktualizovat (update), aniž byste museli restartovat webový server, nebo se starat o to, zdali tím nějak neuškodíte již existujícím klientům. To znamená, že ve virtuálním adresáři můžete přidávat, nahrazovat nebo odstraňovat soubory kdykoliv, kdy to potřebujete. ASP.NET pak přejde k nové doméně aplikace stejným způsobem, jako když modifikujete její konfigurační soubor web.config. Mít možnost kdykoliv aktualizovat jakoukoliv část aplikace, aniž by se tím přerušily existující požadavky, je velmi mocná schopnost. Je však důležité, abyste porozuměli architektuře, která to umožňuje. Mnozí vývojáři dělají tu chybu, když předpokládají, že je to schopnost CLR, která umožňuje, aby ASP.NET mohlo hladce přejít k nové doméně aplikace. Realitou je ale, že CLR vždy uzamyká soubory assembly při jejich vykonávání. Aby se ASP.NET s touto situací vypořádalo, ve skutečnosti nepoužívá soubory z virtuálního adresáře. Během procesu kompilace používá jinou techniku, která se nazývá jako stínová kopie (shadow copy). S její pomocí si ASP.NET vytvoří kopie vašich souborů, které jsou umístěny v adresáři c:\[WinDir]\Microsoft.NET\[Verze]\Temporary ASP.NET Files. Zpracovatelský proces ASP.NET pak assembly načítá z tohoto adresáře, což znamená, že uzamčené jsou tyto assembly. Druhou částí příběhu je to, že ASP.NET je schopno detekovat změnu originálních souborů. Tento detail je dosti přímočarý – spoléhá se při něm na schopnost operačního systému Windows sledovat adresáře a soubory a okamžitě odesílat informace o změnách. ASP.NET si udržuje aktivní seznam všech assembly načtených uvnitř konkrétní domény aplikace, a pomocí monitorovacího kódu dává pozor na změny, na které se následně reaguje. POZNÁMKA ASP.NET může používat soubory uložené v GAC, což je úschovna na úrovni počítače pro komponenty, které obsahují věci pro běžnou denní potřebu, jako jsou assembly pro celou knihovnu tříd .NET Frameworku. Do GAC můžete dávat i své vlastní assembly, ale webové aplikace se obvykle budou snadněji rozmisťovat a udržovat, když je tam dávat nebudete.

Struktura adresáře aplikace Každá webová aplikace by měla mít dobře a pečlivě naplánovanou strukturu adresářů. Nezávisle na tom, jako strukturu adresáře si navrhnete vy sami, ASP.NET specifikuje několik adresářů, které mají speciální význam. ASP.NET 1.x používálo pouze jediný takový adresář – adresář Bin. ASP.NET 2.0 kromě něj používá několik dalších, ty jsou popsány v tabulce 5-1.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

197

Tabulka 5-1. Speciální adresáře ASP.NET. Adresář

Popis

Bin

Obsahuje všechny předem zkomplikované assembly .NET (obvykle DLL), které používá webová aplikace ASP.NET. Do těchto assembly patří předem zkompilované třídy webových stránek a webových služeb, a také jiné assembly, na které se tyto třídy odkazují.

App_Code

Obsahuje soubory zdrojového kódu, které se pro potřeby vaší aplikace dynamicky kompilují. Tyto soubory kódu jsou obvykle separátní komponenty, jako například nějaká přihlašovací komponenta nebo nějaká knihovna pro přístup k datům. Zkompilovaný kód se nikdy neobjeví v adresáři Bin, protože jej ASP.NET umisťuje do dočasných adresářů, které používá pro dynamickou kompilaci.

App_GlobalResources

Do tohoto adresáře se ukládají globální zdroje, k nimž mají přístup všechny stránky webové aplikace. O zdrojích a lokalizacích se více dozvíte v kapitole 17.

App_LocalResources

Slouží stejnému účelu jako App_GlobalResources, s tím rozdílem, že zdroje budou dostupné pouze té stránce, pro kterou jsou určeny. O zdrojích a lokalizacích se více dozvíte v kapitole 17.

App_WebReferences

Do tohoto adresáře se ukládají odkazy na webové služby, které webová aplikace používá. Patří sem i soubory WSDL a dokumenty DISCO. Webové služby se probírají v šesté části knihy.

App_Data

Adresář vyhrazený pro úložiště dat, včetně databázových souborů SQL serveru 2005 Express a souborů XML. Soubory s daty si pochopitelně můžete ukládat i do jiných adresářů.

App_Browsers

Obsahuje definice prohlížečů uložené v XML souborech. Tyto soubory XML definují schopnosti webových prohlížečů pro různé akce. Přestože to ASP.NET dělá globálně (vzhledem k celému počítači), adresář App_Browsers umožňuje nakonfigurovat toto chování pro různé webové aplikace. Další informace o tom, jak ASP. NET rozlišuje jednotlivé prohlížeče, jsou uvedeny v kapitole 27.

App_Themes

Do tohot adresáře se ukládají motivy, které používá webová aplikace. Motivy se probírají v kapitole 15.

Soubor aplikace global.asax Soubor global.asax umožňuje vytvářet ovladače událostí, kteří reagují na globální události. Uživatelé nikdy nežádají o soubor global.asax přímo. Děje se to jinak. Soubor global.asax vykonává svůj kód automaticky (jako reakci na jisté události aplikace). Soubor global.asax poskytuje podobnou službu, jakou poskytoval soubor global.asa v klasických aplikacích ASP. Kód se do souboru global.asax píše podobně, jako když píšete kód do nějakého webového formuláře. Rozdíl je v tom, že global.asax neobsahuje žádné značky HTML nebo ASP.NET. Obsahuje metody s konkrétními předdefinovanými názvy. Například následující soubor global.asax reaguje na událost Application.EndRequest, ke které dojde těsně předtím, než se stránka odešle uživateli: <script language="C#" runat="server">


198

Kapitola 5 – Aplikace ASP.NET

protected void Application_OnEndRequest() { Response.Write("<hr />Tato stránka byla obsloužena v " + DateTime.Now.ToString()); } </script>

Přestože to není v souboru global.asax vyjádřeno, každý soubor global.asax definuje metody pro jedinou třídu – třídu aplikace. Třída Application je odvozená z HttpApplication, což znamená, že kód má přístup ke všem jejím veřejným a chráněným členům. V uvedené ukázce se používá objekt Response, který je poskytován jako zabudovaná vlastnost třídy HttpApplication. Ovladač události v ukázce zapíše zápatí stránky, v němž uvede datum a čas, kdy byla stránka vytvořena. Protože reaguje na událost Application.EndRequest, vykoná se pokaždé, když se stránka požaduje, poté, co se dokončí zpracování veškerého kódu zpracovávajícího události v této stránce. Stejně jako u webových formulářů, i zde můžete rozdělit obsah souboru global.asax do dvou souborů. V jednom bude deklarace souboru, druhý bude obsahovat kód. Protože však pro soubory global.asax není k dispozici žádný designérský povrch (design surface), toto rozdělení se nevyžaduje. Visual Studio vám nenabídne volbu vytvořit soubor global.asax s oddělenou třídou kódu v pozadí. Soubor global.asax file sice není povinný, ale webová aplikace nesmí mít více než jeden soubor global.asax, který musí sídlit v kořenovém adresáři aplikace, nikoliv v nějakém podadresáři. Chcete-li do projektu přidat soubor global.asax, vyberte Website > Add New Item, a zvolte šablonu Global Application Class. Když Visual Studio přidává soubor global.asax, vloží do něj prázdné ovladače nejčastěji používaných událostí aplikace. Vy pak pouze přidáte do patřičných metod kód, který má vykonávat. Stojí za zmínku, že ovladače událostí aplikace se nepřiřazují stejným způsobem jako běžné ovladače událostí ovládacích prvků. Obvyklý způsob, jakým se rozpoznává ovladač události aplikace, je ten, že se použije dohodnutý název metody. Vytvoříte-li například chráněnou metodu s názvem Application_OnEndRequest(), ASP.NET ji bude volat automaticky, jakmile dojde k události Application.EndRequest. ASP.NET vytváří fond objektů aplikace v okamžiku, když se poprvé načte doména vaší aplikace, přičemž jeden z objektů aplikace pak použije k obsluze požadavků. Velikost fondu závisí na systému a počtu dostupných vláken, obvykle ale bývá v rozsahu od 1 do 100 instancí. Každý požadavek získá výhradní přístup k jednomu z těchto objektů aplikace. Když daný požadavek skončí, bude objekt opětovně využit. V průběhu různých etap zpracování aplikace ASP.NET volá odpovídající metody, které pak spustí váš kód. Samozřejmě, má-li metoda špatný název, vaše implementace nebude zavolána – kód se bude prostě ignorovat. POZNÁMKA Globální třída aplikace, kterou používá soubor global.asax, by měla být vždy bezstavová (stateless). To z toho důvodu, protože jakmile se objekty aplikace stanou dostupnými, opětovně se používají pro různé požadavky. Nastavíte-li v jednom požadavku hodnotu nějaké členské proměnné, mohla by se objevit i v jiném požadavku. Neexistuje však žádný způsob, jak specifikovat, jak se to má stát, nebo který z požadavků má získat tu či onu instanci objektu aplikace. Abyste se vyhnuli případným zádrhelům, nepoužívejte členské proměnné, pokud nejsou statické (více to probereme v kapitole 6).


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

199

Události aplikace V souboru global.asax se zpracovávají dva druhy událostí:

• •

Události, k nimž dochází vždy, pro každý požadavek. Vztahují se k požadavku a k odpovědi na něj. Události, k nimž dochází pouze za určitých podmínek.

Sled událostí aplikace je následující: 1.

Application_BeginRequest(). Zavolá se při startu každého požadavku, včetně požadavků na soubory, které nejsou webovými formuláři, jako třeba webové služby.

2.

Application_AuthenticateRequest(). Zavolá se těsně předtím, než se provede autentizace. Je to přesně ten bod, kde můžete vskočit do zpracování s vaší vlastní autentizační logikou.

3.

Application_AuthorizeRequest(). Zavolá se poté, co byl uživatel autentizován (tedy identifikován; byla ověřena jeho totožnost), a kdy je třeba určit jeho oprávnění. Pomocí této metody můžete přiřazovat speciální oprávnění.

4.

Application_ResolveRequestCache(). Běžně se používá v součinnosti s ukládáním výstupu do cache (output caching). Když se výstup ukládá do cache (popisujeme to v kapitole 11), je realizovaný HTML kód webového formuláře opětovně využíván, aniž by bylo nutné vykonávat nějaký váš kód. Přesto se tento ovladač spustí.

5.

V tomto okamžiku se požadavek podá patřičnému ovladači. Například u požadavku na nějaký webový formulář je to okamžik, kdy se stránka zkompiluje (pokud je to nutné) a vytvoří se její instance.

6.

Application_AcquireRequestState(). Zavolá se těsně předtím, než se pro klienta získají informace specifické pro relaci a naplní se jimi kolekce Session.

7.

Application_PreRequestHandlerExecute(). Zavolá se předtím, než patřičný ovladač HTTP vykoná požadavek.

8.

V tomto okamžiku patřičný ovladač vykoná požadavek. Pokud se například jedná o požadavek na webový formulář, vykoná se kód stránky pro zpracování událostí, a stránka se realizuje do HTML.

9.

Application_PostRequestHandlerExecute(). Zavolá se ihned poté, co se požadavek zpracoval.

10. Application_ReleaseRequestState(). Zavolá se, když je potřeba serializovat informace specifické pro relaci (session) z kolekce Session, aby byly dostupné pro příští požadavek. 11. Application_UpdateRequestCache(). Zavolá se těsně předtím, než se informace předají do cache pro výstup. Pokud například pro nějakou webovou stránku zapnete ukládání výstupu do cache (output caching), ASP.NET v tomto okamžiku vloží realizovanou HTML stránku do cache. 12. Application_EndRequest(). Zavolá se na konci požadavku – těsně předtím, než se uvolní a znovu vyžádají objekty. Toto je vhodná chvíle pro čistící (cleanup) kód. Proces zpracování jediného požadavku vidíte na obrázku 5-1.


200

Kapitola 5 – Aplikace ASP.NET

Obrázek 5-1. Události aplikace. Některé z událostí se neodpalují při každém požadavku:

Application_Start(). Zavolá se, když aplikace startuje poprvé a když se vytvořila doména aplikace. Tento ovladač události je šikovným místem pro inicializační kód týkající se celé aplikace. Například byste zde mohli načíst a uložit do cache taková data, která se v průběhu doby života aplikace nebudou měnit, jako třeba stromy navigace, statické katalogy výrobků atd.

Session_Start(). Zavolá se pokaždé, když začne nějaká nová relace. Často se používá pro inicializaci informací specifických pro daného uživatele. Relace a správa stavu se probírají v šesté kapitole.

• •

Application_Error(). Zavolá se, jakmile dojde v aplikaci k nějaké nezpracované výjimce.

Application_End(). Zavolá se těsně předtím, než aplikace skončí. Konec aplikace může nastat třeba proto, že se restartovalo IIS, nebo proto, že se aplikace přenáší do nové domény aplikace, jako reakce na aktualizaci souborů, nebo také z toho důvodu, že se jedná o proces recyklace nastavení.

Application_Disposed(). Zavolá se za nějakou chvíli poté, co byla aplikace ukončena a svoz odpadků .NET (garbage collector) se chystá vyžádat si tu část paměti, kterou zabírala aplikace. Zde už je pozdě na důležité údržbové akce, nicméně tuto událost můžete použít jako opatření poslední záchrany při nějakém selhání, pro ověření, zdali byly uvolněny kritické zdroje.

Session_End(). Zavolá se pokaždé, když končí relace uživatele. Relace končí, když ji explicitně uvolní váš kód, nebo když vyprší platnost relace, kdy po stanovenou dobu nedorazily žádné další požadavky (obvykle je to 20 minut). Metoda se obvykle používá pro údržbové práce na datech, kterých se to týká.

Pomocí událostí aplikace se běžně provádějí inicializace, údržbové akce, přihlašování uživatelů, profilování nebo řešení různých problémů. Nemyslete si ale, že vaše aplikace budou muset používat globální události aplikace. Mnohé aplikace ASP.NET soubor global.asax nepoužívají vůbec.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

201

TIP Soubor global.asax není jediným možným místem, kde se dá reagovat na globální události aplikace. Můžete například vytvořit vlastní moduly, které budou participovat při zpracování webových požadavků, což probereme později v této kapitole, v oddílu popisujícím rozšíření kanálu HTTP.

Ukázka zpracování událostí aplikace Následující webová aplikace používá soubor global.asax, který reaguje na metodu Application_Error. Chyba je zachycena a informace o ní jsou zobrazeny v předdefinovaném formátu. <script language="C#" runat="server"> protected void Application_Error(Object sender, EventArgs e) { Response.Write("<b>"); Response.Write("Oops! Looks like an error occurred!!</b><hr />"); Response.Write(Server.GetLastError().Message.ToString()); Response.Write("<hr />" + Server.GetLastError().ToString()); Server.ClearError(); } </script>

Abyste mohli tento ovladač události aplikace otestovat, musíte vytvořit webovou stránku, která způsobí chybu. Podívejte se na ukázku, kde se chyba vygeneruje při pokusu dělit nulou (v okamžiku načítání stránky): protected void Page_Load(object sender, EventArgs e) { int i = 0; int j = 1; int k = j/i; }

Pokud budete tuto stránku požadovat, uvidíte to, co ukazuje obrázek 5-2.

Obrázek 5-2. Zachycení nezpracované chyby.


202

Kapitola 5 – Aplikace ASP.NET

Není ovšem typické řídit vzhled webových stránek metodou Application_Error(), protože neposkytuje dostatek flexibility, kterou potřebujete při výskytu různých druhů chyb (aniž byste museli psát bolestně pracnou podmínkovou logiku). Patrně to uděláte tak, že si pomocí souboru web.config nakonfigurujete vlastní chybové stránky (popisujeme se to v příštím oddílu). Application_Error() však může být nesmírně prospěšná, chcete-li protokolovat výskyt nějakých chyb pro potřeby budoucích referencí, nebo informace o nich dokonce odesílat e-mailem systémovému administrátorovi. A vskutku – v mnoha situacích budete tuto techniku potřebovat, například tehdy, nebude-li dostupný objekt Response. Dvě z těchto situací jsou metody Application_Start() a Application_End().

Konfigurace ASP.NET Konfigurace se v ASP.NET řídí pomocí souborů XML. V těchto konfiguračních souborech jsou uloženy nejenom všechny informace, které jsou potřebné pro nastavení klíčových nastavení ASP.NET, ale také i vaše vlastní nastavení, která jsou specifická pro vaši aplikaci. Konfigurační soubory ASP.NET mají oproti konfiguračním souborům v klasickém ASP několik následujících předností:

Nikdy nejsou uzamčeny. Jak jsme uvedli na začátku kapitoly, konfigurační nastavení můžete aktualizovat kdykoliv, když to potřebujete, přičemž ASP.NET hladce přejde do nové domény aplikace.

Snadno se k nim přistupuje a snadno se replikují. Za předpokladu, že máte přidělena patřičná síťová oprávnění, můžete konfigurační soubor modifikovat ze vzdáleného počítače (nebo jej nahradit tak, že pomocí FTP nahraje jeho novou verzi). Konfigurační soubor můžete také zkopírovat, pokud chcete použít identická nastavení v jiné aplikaci nebo na jiném webovém serveru, který provozuje stejnou aplikaci v rámci webové farmy.

Snadno se editují a chápou. Nastavení v konfiguračním souboru jsou srozumitelná pro lidi, což znamená, že je možné je jak editovat, tak i pochopit, aniž by byl k tomu potřebný nějaký specializovaný konfigurační nástroj.

S ASP.NET se nemusíte starat o konfiguraci metabáze IIS nebo o restarty webového serveru. Přesto však existuje několik věcí, které v souboru web.config dělat nemůžete. Nemůžete například vytvořit nebo odstranit virtuální adresář. Obdobně také nemůžete změnit mapování souborů. Chcete-li, aby služba ASP.NET zpracovávala požadavky i jiných typů souborů (jako třeba HTML nebo vaše vlastní typy souborů, které si nadefinujete), musíte k tomu použít manažera IIS, což je více popsáno v kapitole 18.

Soubor machine.config Konfigurace začíná souborem, který se jmenuje machine.config, a sídlí v adresáři c:\[WinDir]\Microsoft. NET\Framework\[Verze]\Config. V souboru machine.config se definují podporované sekce konfiguračního souboru, konfiguruje se zpracovatelský proces ASP.NET a registrují se poskytovatelé, kteří se budou používat pro pokročilé schopnosti, jako jsou profily, členství a bezpečnost založená na rolích. V ASP.NET 2.0 byl soubor machine.config dramaticky zprůhledněn. Aby se proces inicializace optimalizoval, mnohé z výchozích nastavení, které se dříve používaly v souboru machine.config, se nyní inicializují programátorsky. Pořád si však můžete vyhledat všechna relevantní nastavení, otevřete-li nový soubor machine. config.comments, který naleznete ve stejném adresáři. Obsahuje úplný text výchozích nastavení společně s komentáři (je to vlastně obdoba souboru machine.config v ASP.NET 1.x). V souboru machine.config.com-


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

203

ments se tedy dozvíte, jaká jsou výchozí nastavení a co znamenají, přičemž hodnoty, které potlačí tato výchozí nastavení, můžete poté přidat do souboru machine.config. Spolu se souborem machine.config používá ASP.NET 2.0 kořenový soubor web.config (ve stejném adresáři), který obsahuje dodatečná nastavení. Tato nastavení registrují klíčové ovladače a moduly HTTP ASP.NET, připravují pravidla pro podporu prohlížečů, a definují bezpečnostní politiku. V ASP.NET 1.x byla všechna nastavení tohoto druhu umístěna v souboru machine.config. Všechny webové aplikace na počítači dědí nastavení z obou těchto souborů. Většina z těchto nastavení jsou však v podstatě podpůrnými konstrukcemi, kterých se nemusíte nikdy dotknout. Dvě nejběžnější výjimky si probereme nyní.

<processModel> Tato sekce umožňuje nakonfigurovat, jak bude zpracovatelský proces ASP.NET recyklovat domény aplikace, a účet Windows, pod kterým se bude proces vykonávat, což určuje jeho privilegia. Používáte-li IIS 6 (což je verze IIS umístěná ve Windows 2003 Server), budou se mnohá z těchto nastavení ignorovat, protože obdobná nastavení je možné nakonfigurovat prostřednictvím manažera IIS. Další informace o prvku <processModel> najdete v kapitole 18.

<machineKey> Tato sekce umožňuje nastavit specifický klíč serveru, který se bude používat pro zašifrování dat a vytváření digitálních podpisů. Šifrování se dá používat v součinnosti s několika schopnostmi ASP.NET. ASP.NET je používá automaticky, aby ochránil cookie formulářové autentizace, a vy je můžete rovněž používat, pokud chcete ochránit data stavu zobrazení (view state) (popisuje se v kapitole 6). Klíč se také používá při autentizaci s poskytovateli stavu relace, kteří pracují vně procesu. Obvykle má prvek <machineKey> následující tvar: <machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="SHA1" />

Hodnota AutoGenerate,IsolateApps vyjadřuje, že ASP.NET bude vytvářet a ukládat klíče, které jsou specifické vzhledem ke stroji a aplikaci. Jinak řečeno – každá aplikace bude používat odlišný, automaticky vygenerovaný klíč. Tím se zabraňuje potenciálním útokům vedeným z jednoho webu na jiný web. Nepotřebujete-li klíče specifické pro jednotlivé aplikace, můžete zvolit jediný pro všechny aplikace na aktuálním počítači takto: <machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1" />

Pokud provozuje webovou farmu a jedna aplikace běží na několika počítačích, v obou případech ovšem narazíte na problém. Požadujete např. nějakou stránku, kterou zpracuje jeden server. Stránka se pak odešle zpět na server, nicméně nyní ji zpracuje úplně jiný server, a ten nebude schopen dešifrovat stav zobrazení a cookie formulářové autentizace z prvního serveru. To kvůli tomu, že každý z webových serverů používá jiné klíče. Abyste tuto záležitost vyřešili, je potřeba, abyste klíč explicitně nadefinovali v souboru machine.config. Podívejte se na ukázku prvku <machineKey>, ve které jsou oba důležité atributy nadefinovány:


204

Kapitola 5 – Aplikace ASP.NET

<machineKey validationKey="61EA54E005915332011232149A2EEB317586824B265326CCDB3AD9A BDBE9D6F24B0625547769E835539AD3882D3DA88896EA531CC7AFE664866BD5242FC2B05D" decrypt ionKey="61EA54E005915332011232149A2EEB317586824B265337AF" validation="SHA1" />

TIP Takto explicitně lze také nadefinovat klíče specifické pro konkrétní aplikace tím, že přidáte explicitně vytvořený prvek <machineKey> do souboru web.config, který se nachází ve virtuálním adresáři aplikace. Tento přístup budete potřebovat, pokud se ocitnete v situaci, ve které jde o kombinaci obou scénářů popsaných výše. Například to budete potřebovat tehdy, provozujete-li svou aplikaci na několika serverech, a tyto servery současně hostují více webových aplikací, které potřebují individuální klíče.

Hodnota validationKey může být dlouhá v rozsahu od 40 do 128 znaků. Důrazně se doporučuje, abyste používali maximální dostupnou délku. Hodnota decryptionKey může být 16, nebo 48 znaků dlouhá. Bude-li to 16 znaků, bude pro zašifrování použit standard DES (Data Encryption Standard). Bude-li to 48 znaků, použije se Triple DES (neboli 3DES). (Což znamená, že se DES aplikuje třikrát za sebou.) 3DES se luští mnohem obtížněji než DES, takže se doporučuje, abyste pro decryptionKey vždy používali 48 znaků. Je-li délka některého z obou klíčů mimo povolené meze, a pokud budou kladeny na aplikaci nějaké požadavky, bude ASP.NET vracet stránku s chybovou zprávou. Nemá valnou cenu vytvářet své vlastní ověřovací a dešifrovací klíče. Budete-li to dělat, nebudou pravděpodobně dostatečně náhodné, čímž budou zranitelnější proti některým druhům útoků, takže je lepší generovat silné náhodné klíče pomocí kódu a kryptografických tříd .NET Frameworku (z jmenného prostoru System. Security.Cryptography). Následující ukázka je obecný kód rutiny s názvem CreateMachineKey(), která vytvoří náhodnou posloupnost bajtů pomocí kryptograficky silného generátoru náhodných čísel. Metoda CreateMachineKey() přebírá jediný parametr, který udává, kolik znaků se má použít. Návratová hodnota je v hexadecimálním formátu, který se požaduje v souboru machine.config. public static string CreateMachineKey(int length) { byte[] random = new byte[length/2]; // Vytvoří kryptograficky silný generátor náhodných čísel. RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); // Naplní pole bajtů náhodnými bajty. rng.GetBytes(random); // Vytvoří objekt StringBuilder, ve kterém bude udržovat výsledky, // jakmile se převedou do hexadecimálního formátu System.Text.StringBuilder machineKey = new System.Text.StringBuilder(length); // Projde v cyklu pole náhodných bajtů a přidává postupně // jednotlivé hodnoty do objektu StringBuilder. for (int i = 0; i < random.Length; i++) { machineKey.Append(String.Format("{0:X2}", random[i])); } return machineKey.ToString(); }


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

205

Tuto funkci můžete použít ve svém webovém formuláři pro vytvoření potřebných klíčů. Například následující fragment kódu vytvoří dešifrovací klíč dlouhý 48 znaků a ověřovací klíč dlouhý 128 znaků. Každou z obou hodnot pak zobrazí v oddělených textových polích: txtDecryptionKey.Text = CreateMachineKey(48); txtValidationKey.Text = CreateMachineKey(128);

Vytvořené informace můžete zkopírovat a vložit do souboru machine.config každého počítače ve webové farmě. Je to mnohem pohodlnější a bezpečnější postup, než vytvářet klíče ručně. O kryptografických třídách z jmenného prostoru System.Security.Cryptography se více dozvíte v kapitole 25.

Soubor web.config Každá webová aplikace dědí nastavení ze souboru machine.config. Kromě toho můžete použít i nastavení specifické pro jednotlivé aplikace. Například tehdy, když chcete nastavit konkrétní metodu pro autentizaci, typ ladění, výchozí jazyk nebo vlastní chybové stránky. Je však důležité, abyste si uvědomili, že v souboru machine.config jsou některá nastavení, která nemůžete potlačit. Některá nastavení, jako jsou nastavení modelu procesu, se nedají měnit na úrovni aplikace. Některá nastavení také mohou být specifická pro konkrétní aplikaci. Používáte-li taková nastavení, musíte umístit soubor web.config do kořenového adresáře své aplikace (nikoliv do libovolného podadresáře). Celý obsah konfiguračního souboru ASP.NET je vnořen do kořenového prvku <configuration>. Tento prvek obsahuje prvek <system.web>, který se používá pro nastavení ASP.NET. Uvnitř prvku <system.web> jsou pak oddělené prvky určené pro každý aspekt konfigurace. Základní kostra souboru web.config vypadá takto: <?xml version="1.0" encoding="utf-8" ?> <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <system.web> <!-- sem přijdou konfigurační sekce ASP.NET. --> </system.web> </configuration>

ASP.NET používá vícevrstvý konfigurační systém, který umožňuje používat pro různé části aplikace různá nastavení. Chcete-li tento systém používat, musíte přidat do svého virtuálního adresáře dodatečné podadresáře. Ty pak mohou obsahovat své vlastní konfigurační soubory web.config s dodatečnými nastaveními. ASP. NET používá dědění těchto konfigurací, takže každý podadresář obdrží nastavení z rodičovského adresáře. Dejme tomu, že máme webový požadavek http://localhost/A/B/C/MojeStranka.aspx, kde A je kořenový adresář webové aplikace. V tomto případě se do hry zapojují nastavení z několika úrovní: 1.

Nejprve se použijí výchozí nastavení z machine.config.

2.

Pak se aplikují nastavení web.config z kořenového adresáře počítače. Tento soubor web.config je ve stejné složce CONFIG jako soubor machine.config.

3.

Je-li nějaký soubor web.config v kořenu aplikace A, jeho nastavení se uplatní nyní.

4.

Je-li nějaký soubor web.config v podadresáři B, jeho nastavení se uplatní nyní.

5.

Je-li nějaký soubor web.config v podadresáři C, uplatní se jeho nastavení jako poslední.


206

Kapitola 5 – Aplikace ASP.NET

K této posloupnosti je důležité připomenout, že ačkoliv můžete mít neomezený počet podadresářů, jsou významná zejména nastavení použitá v krocích 1 a 2. Je to proto, že některá nastavení se dají použít pouze na úrovni machine.config (jako je účet Windows, pod kterým se bude kód vykonávat), a jiná nastavení lze zase použít pouze na úrovni aplikace (jako je druh autentizace, kterou bude používat vaše webová aplikace).

Obrázek 5-3. Dědění konfigurací. V podadresářích je tak možné specifikovat pouze malou podmnožinu nastavení, která se liší od zbytku webové aplikace. Jedním z důvodů, proč je někdy žádoucí použít v aplikaci několik podadresářů, jsou různá nastavení týkající se bezpečnosti. Soubory, které je potřeba zabezpečit, by se umístily do speciálního adresáře s takovým souborem web.config, který byl definoval přísnější bezpečnostní nastavení, než jaká jsou použita v kořenovém virtuálním adresáři. Pokud jsou nějaká nastavení ve vzájemném rozporu, nastavení ve více vnořeném souboru vždy přepíše nastavení zděděné z rodiče. Až na jednu výjimku – je možné vyznačit konkrétní uzamčené sekce, které nebude možné měnit. Příslušnou techniku popisujeme v následujícím oddílu.

Práce s prvky <location> Prvek <location> je rozšíření, které umožňuje specifikovat v jednom konfiguračním souboru více než jednu skupinu nastavení. Podadresář nebo soubor, odkud se budou nastavení aplikovat, specifikujete atributem path prvku <location>. Například následující soubor web.config vytváří pomocí prvku <location> dvě skupiny nastavení – jedno, které je určeno pro aktuální adresář, a druhé, které se bude aplikovat pouze na soubory umístěné z podadresáři Secure: <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <system.web> <!-- Sem přijdou základní konfigurační nastavení. --> </system.web> <location path="/Secure"> <system.web>


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

207

<!-- Sem přijdou konfigurační nastavení pro podadresář Secure. --> </system.web> </location> </configuration>

Tento soubor web.config v podstatě zastává roli dvou konfiguračních souborů. Funguje stejně, jako kdybyste nastavení rozdělili do dvou oddělených souborů web.config, a jeden z nich dali do podadresáře Secure. Není stanoven žádný limit na počet prvků <location> v jednom konfiguračním souboru. Prvek <location> se však příliš často nepoužívá, protože konfigurační nastavení se obvykle snadněji spravují a aktualizují, když se udržují v oddělených souborech. Existuje však jedna situace, kdy prvek <location> poskytuje takovou funkcionalitu, které žádným jiným způsobem nedosáhnete. Je to tehdy, když uzamknete nějaké konkrétní nastavení, aby se nedalo potlačit. Abyste pochopili, jak tato technika funguje, zamyslete se nad následujícím příkladem, ve kterém definuji dvě skupiny nastavení, přičemž jsem v jedné skupině nastavil atribut allowOverride značky <location> na hodnotu false. Je to pěkně vidět v následujícím kódu: <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <system.web> <!-- Sem přijdou nechráněná konfigurační nastavení. --> </system.web> <location allowOverride="false" > <system.web> <!-- Sem přijdou uzamčená konfigurační nastavení. --> </system.web> </location> </configuration>

V tomto případě není možné potlačit žádné nastavení ze sekce <location>. Pokud se o to pokusíte, a budete ve své aplikaci požadovat nějakou stránku, ASP.NET vám vygeneruje nezpracovanou výjimku. Atribut allowOverride prvku <location> je primárně určen pro potřeby webhostingových firem, které si chtějí být jisté, že určité nastavení nebude možné změnit. V těchto případech administrátor upraví soubor machine. config na webovém serveru tak, že pomocí prvku <location> uzamkne všechny sekce souboru web.config, které chce ochránit. TIP Když uzamykáte nastavení v souboru machine.config, máte dvě možnosti. Zaprvé, můžete uzamknout nastavení pro všechny aplikace tím, že neuvedete atribut path značky <location>. Zadruhé, můžete uzamknout nastavení pro konkrétní webovou aplikaci, když nastavíte atribut path na její název.

Konfigurační nastavení Prvek <system.web> obsahuje všechna konfigurační nastavení specifická pro ASP.NET. Specifikuje různé aspekty webové aplikace a zapíná služby, jako je bezpečnost, správa stavu a trasování. Základní dceřiné prvky, které může prvek <system.web> obsahovat, a jejich účel, jsou uvedeny v tabulce 5-2. Seznam nicméně není úplný. Jeho účelem je vám dát pouze hrubou představu o rozsahu konfigurace ASP. NET.


KAPITOLA 11 Ukládání do cache Jednou z nejcennějších schopností ASP.NET 1.x bylo ukládání do cache, a v ASP.NET 2.0 je to ještě mnohem lepší. Anglicky se tomu říká caching a jedná se o dočasné uchovávání kopií informací v jisté, k tomuto účelu vyhrazené paměti (cache), když je opětovné vytváření takových informací v nějakém ohledu nákladné. Do cache se mohou například ukládat výsledky komplikovaných dotazů, aby následné požadavky vůbec nemusely přistupovat k příslušné databázi. Místo toho si shrábnou patřičný objekt výsledků přímo z paměti serveru, což je mnohem rychlejší. Skutečný půvab této techniky ale spočívá v tom, že na rozdíl od mnoha jiných technik pro zvýšení výkonu, zesiluje nejenom výkon, ale i škálovatelnost (scalability). Výkon je vyšší proto, že dramaticky klesá čas potřebný na získání informací. Škálovatelnost se zlepšuje proto, že obcházíte úzká hrdla, jako je databázové připojení, kde mohou vznikat zácpy. Využitím cache docílíte toho, že aplikace bude moci simultánně obsluhovat více požadavků na stránku s menším počtem databázových operací. Samozřejmě – ukládat informace do paměti není vždy ten nejlepší nápad. Paměť serveru je zdroj, který má své limity, a pokud se tam pokusíte nacpat příliš mnoho informací, část informací se bude stránkovat na disk, což může potenciálně zapříčinit zpomalení celého systému. To je také důvodem, proč nejlepší strategie pro dočasné uchovávání kopií informací (kam také patří ty, které jsou napevno zapojeny do ASP.NET) omezují samy sebe. Když ukládáte informace do nějaké cache, obvykle očekáváte, že je tam při budoucím požadavku také najdete. Jaká však bude doba života těchto informací, to už podle vlastního uvážení rozhoduje server. Jestliže se cache naplní, nebo aplikace spotřebovává velké množství paměti, informace se budou selektivně z cache odstraňovat, aby byl stále zajištěn požadovaný výkon. Takže můžeme říci, že právě soběstačnost je přesně to, co činí z ukládání do cache tak mocný zdroj. S ASP.NET máte prvotřídní techniku ukládání do cache zdarma, s řadou zajímavých voleb. Můžete si do cache uschovat kompletně realizovaný HTML výstup stránky, nebo část takového HTML, nebo libovolné objekty. Můžete si také přizpůsobit expirační politiky a připravit různé závislosti (dependencies), aby se položky z cache automaticky odstraňovaly na základě toho, že byly modifikovány jiné zdroje – jako jsou objekty souborů a databázových tabulek.


452

Kapitola 11 – Ukládání do cache

ZMĚNY TÝKAJÍCÍ SE UKLÁDÁNÍ DO CACHE V .NET 2.0 Už tak dost působivý model ukládání do cache se v ASP.NET 2.0 ještě více zdokonalil. V následujícím výčtu je uveden seznam změn v pořadí, v jakém se probírají v této kapitole:

Ovládací prvek Substitution. S jeho pomocí se definuje nějaký dynamický obsah na stránce, jejíž realizovaný HTML výstup se ukládá do cache. Konečným výsledkem je to, že se dynamický obsah realizuje vždy při běhu, i když se zbytek stránky získává z cache.

Profily cache. Správa webu obsahujícího desítky stránek ukládaných do cache může být dost ipracná, protože potřebujete-li nějak upravit na míru nějaká nastavení, která se týkají ukládání do cache, budete muset upravit každou stránku. S profily cache definujete svá nastavení v souboru web.config a aplikujete dávkově na stránky.

Cachování výstupu na disk. Nyní můžete ASP.NET explicitně říci, aby uschovával kopie informací nejenom do paměti, ale i na disk. Uložené prvky pak mohou přežívat mnohem déle – i když se z paměti odstraní, nebo se restartuje aplikace. Ukládání kopií informací na disk je standardně zapnuto, další konfigurace nebo vypnutí této volby je pochopitelně možné.

Závislosti cache na SQL (SQL cache dependencies). Kritériem pro odstranění kopií datových objektů uložených v cache může být to, že se změnila odpovídající data v databázi. Je to jedna z nejžhavějších nových schopností ASP.NET.

Vlastní závislosti (custom dependencies). Potřebujete automaticky zrušit platnost prvků, které máte uložené v cache, když se změní nějaké jiné zdroje? Nyní je třída CacheDependency nezapečetěná (unsealed), takže z ní můžete odvozovat vaše vlastní závislosti.

Všechny výše uvedené inovace se probírají v této kapitole.

Chápeme cachování v ASP.NET Mnozí vývojáři často považují cachování dat v paměti za jednu z parádiček produktu, a nikoliv za něco skutečně užitečného. Tento názor je ovšem velmi vzdálen skutečnému významu této techniky. Když se cachování využívá inteligentně, dokáže zvýšit výkon dvakrát, třikrát, a někdy i desetkrát, i když se důležitá data ukládají pouze na krátkou dobu. V ASP.NET existují dva způsoby cachování informací. Vaše aplikace může, a také by měla, využívat oba způsoby, protože se vzájemně doplňují:

Cachování výstupu (output caching). Nejjednodušší varianta. Ukládá se kopie finálně realizované stránky HTML, která se odesílá klientovi. Příští klient, který vyšle požadavek na tuto stránku, ji vlastně nespustí. Místo toho se automaticky odešle finální výstup HTML. Ušetří se tím veškerý čas, který by byl jinak zapotřebí na spuštění stránky a vykonání jejího kódu.

Cachování dat (data caching). Dá se provádět ručně z kódu. Do cache se uchovávají důležité informace, jejichž rekonstrukce je náročná na čas (například sada dat načítaná z databáze). Ostatní stránky mohou ověřovat, zdali už tyto informace existují, a použít je, takže se mohou vyhnout obvyklým krokům, které je jinak potřeba provést, aby se informace získaly. Cachování dat je sice koncepčně stejné jako využívání stavu aplikace, nicméně je mnohem přívětivější k serveru, protože se prvky budou z cache odstraňovat automaticky, jestliže jejich objem naroste natolik, aby to mělo nepříznivý vliv na výkon. Prvky lze také nastavit tak, aby jejich doba života vypršela automaticky.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

453

Nad těmito modely jsou vybudovány dva specializované typy ukládání do cache:

Cachování fragmentu (fragment caching). Jedná se o specializovaný typ cachování výstupu – neukládá se kopie HTML výstupu celé stránky, ale pouze část HTML. Cachování fragmentů funguje tak, že se ukládá realizovaný výstup HTML nějakého uživatelského ovládacího prvku (user control) na stránce. Až se bude stránka vykonávat příště, budou se odpalovat stejné události stránky (takže opět poběží kód stránky), ale kód pro odpovídající uživatelský ovládací prvek se vykonávat nebude.

Cachování zdroje dat (data source caching). Jedná se o techniku, která je zabudovaná do ovládacích prvků pro zdroje dat, což jsou SqlDataSource, ObjectDataSource a XmlDataSource. Formálně se při cachování zdroje dat pracuje s technikou cachování dat (data caching). Rozdíl je v tom, že proces není třeba zpracovávat explicitně. Prostě jen nakonfigurujete patřičné vlastnosti a ovládací prvek zdroje dat se sám bude starat o uschovávání dat do cache a získávání dat z cache.

V této kapitole se probírají všechny volby, které máte pro ukládání do cache k dispozici. Nejprve probereme základy cachování výstupu a dat. Pak se podíváme, jak se řeší ukládání do cache v ovládacích prvcích pro zdroje dat. A nakonec prozkoumáme jednu z nejžhavějších novinek ASP.NET – spojení cachovaných položek pro tabulky v databázi se závislostmi cache SQL.

Cachování výstupu Při cachování výstupu (output caching) se do cache ukládá finálně realizovaný HTML kód stránky. Když se později požaduje tatáž stránka, nevytvářejí se objekty ovládacích prvků, nenastartuje se životní cyklus stránky a nevykoná se žádný váš kód. K obsluze se využije HTML kód uložený v cache. Je jasné, že cachování výstupu teoreticky zvyšuje výkon maximálním způsobem, protože veškerá zátěž, kterou vnáší váš kód, je pryč. POZNÁMKA Stránka ASP.NET může využívat další statické prostředky (jako jsou obrázky), které ASP.NET zpracovávat nebude. O cachování těchto prvků se nestarejte. To automaticky zařídí IIS, který umí cachovat soubory efektivnějším způsobem, než cache ASP.NET.

Deklarativní cachování výstupu Abyste viděli cachování výstupu v akci, vytvořte stránku, která zobrazí aktuální čas, viz obrázek 11-1.

Obrázek 11-1. Cachování celé stránky.


454

Kapitola 11 – Ukládání do cache

Kód stránky je průzračný. Nastaví prostě datum, které se objeví v popisku, když se odpálí událost Page.Load: protected void Page_Load(Object sender, EventArgs e) { lblDate.Text = "The time is now:<br />"; lblDate.Text += DateTime.Now.ToString(); }

Existují dva způsoby, jak přidat stránku do výstupu cache. Nejběžnější způsob je vložit na začátek souboru .aspx direktivu OutputCache, jako zde: <%@ OutputCache Duration="20" VaryByParam="None" %>

Atribut Duration zde dává ASP.NET pokyn, aby uchoval stránku v cache po dobu 20 vteřin. Atribut VaryByParam je povinný a jeho efekt budeme probírat až v příštím oddílu. Když testovací stránku spustíte, odhalíte určité zajímavé chování. Když ke stránce přistoupíte poprvé, zobrazí se aktuální čas. Budete-li stránku aktualizovat o malou chvilku později, stránka se aktualizovat nebude. Místo toho vám ASP.NET automaticky pošle HTML kód stránky, která je uložena v cache (za předpokladu, že neuplynulo 20 vteřin, a tudíž ještě nevypršela platnost stránky v cache). Když vyprší platnost cachované stránky, ASP.NET spustí znovu kód stránky, uloží do cache novou kopii stránky, a bude ji používat po dalších 20 vteřin. Dvacet vteřin se někomu může zdát jako bezvýznamná doba, ale u webu s hustým provozem to může mít dramatický efekt. Do cache můžete například uložit stránku, která poskytuje seznam výrobků z nějakého katalogu. Tím, že máte kopii stránky uloženou v cache po dobu 20 vteřin, bude stačit, aby stránka prováděla tři databázové operace za minutu. Kdybyste kopii stránky do cache neukládali, pokoušela by se stránka připojovat k databázi pro každý požadavek klienta, což by snadno mohlo vést k několika desítkám požadavkům za minutu pro přístup k databázi. Samozřejmě – jenom kvůli tomu, že požadujete, aby byla kopie stránky uložena po dobu 20 vteřin, nutně neznamená, že tomu tak skutečně bude. Stránka může být vyklizena z cache dříve, pokud systém zjistí, že začíná být nouze o paměť. To znamená, že ukládání výstupu stránek do cache můžete používat celkem bezstarostně a nemusíte se dělat přílišné starosti s tím, zdali vaše aplikace není brzdou výkonu, protože používá příliš mnoho paměti životně důležité pro provoz. TIP Když překompilujete nějakou stránku, jejíž kopii máte uloženou v cache, ASP.NET tuto stránku automaticky odstraní z cache. Tím se zabraňuje potížím, které by vznikaly kvůli tomu, že stránka nebyla řádně aktualizována, protože se použila její starší kopie z cache. Když ale testujete svou aplikaci, bývá dobré ukládání kopií stránek vypnout. Jinak se totiž můžete dostat do nesnází, používáte-li sledování proměnných, zarážky a jiné ladicí techniky, protože se váš kód nebude vykonávat, je-li k dispozici kopie stránky uložená v cache.

Cachování a dotazovací řetězec Jedním z hlavních zdrojů úvah při cachování je rozhodnutí, kdy se dá stránka opětovně použít, a kdy musejí být informace na sekundu aktuální. Vývojáři, kteří nesmírně touží po okamžitém ukojení svých vášní (a trpí nedostatkem trpělivosti), obvykle přeceňují význam poskytování informací v reálném čase. Obvykle můžete cachování používat bez sebemenších problémů, což vede k efektivnímu a opětovnému využívání mírně zastaralých dat, protože odměnou je velmi značné zvýšení výkonu.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

455

Samozřejmě – informace někdy musejí být dynamické. Jednou z takových situací je, když stránka používá informace z relace (session) aktuálního uživatele, aby s jejich pomocí upravila na míru rozhraní uživatele. V tomto případě není ukládání celé stránky do cache příliš vhodné (i když lze situaci mnohdy vylepšit cachováním kopie fragmentu). Dalším takovým příkladem je stránka, která získává informace z jiné stránky prostřednictvím dotazovacího řetězce. Pak je stránka příliš dynamická na to, aby mělo smysl ji ukládat do cache – nebo tomu tak není? V našem aktuálním příkladu je atribut VaryByParam nastaven na None, čímž vlastně ASP.NET sdělujete, že potřebujete uložit pouze jedinou kopii cachované stránky, a že to bude vyhovující pro všechny situace. Jestliže nějaký požadavek na stránku přidá k URL argumenty v podobně dotazovacího řetězce, nebude v tom žádný rozdíl – ASP.NET použije vždy stejný výstup, dokud nevyprší jeho platnost. Můžete si to otestovat. Přidejte ručně v okně prohlížeče do URL nějaký parametr ve formě dotazovacího řetězce (jako například ?a=b). Na základě tohoto experimentu byste mohli usoudit, že cachování výstupu není vhodné pro stránky, které používají argumenty dotazovacího řetězce. ASP.NET však poskytuje ještě jinou volbu. Můžete nastavit atribut VaryByParam na *, čímž vyjádříte, že stránka používá dotazovací řetězec, a současně je to pokyn pro ASP. NET, aby do cache ukládal separátní kopie stránky pro různé argumenty dotazovacího řetězce, jako zde: <%@ OutputCache Duration="20" VaryByParam="*" %>

Když nyní požádáte o stránku s dodatečnými informacemi uvedenými v dotazovacím řetězci, ASP.NET prozkoumá dotazovací řetězec. Jestliže řetězec souhlasí s řetězcem předchozího požadavku, a v cache existuje uložená kopie stránky, bude tato opětovně použita. V jiném případě se vytvoří nová kopie stránky a uloží do cache separátně. Abyste si udělali lepší představu o tom, jak celý proces funguje, vezměte si na paškál následující sérii požadavků: 1.

Požadujete stránku bez jakéhokoliv dotazovacího řetězce. Obdržíte kopii A dané stránky.

2.

Požadujete stránku s parametrem ProductID=1. Obdržíte kopii B dané stránky.

3.

Jiný uživatel požaduje stránku s parametrem ProductID=2. Tento uživatel obdrží kopii C dané stránky.

4.

Jiný uživatel požaduje stránku s ProductID=1. Pokud je cachovaný výstup kopie B ještě platný, odešle se tomuto uživateli.

5.

Stejný uživatel pak požaduje stránku bez dotazovacího řetězce. Jestliže ještě nevypršela platnost kopie A, odešle se tato stránka z cache.

Celé si to můžete vyzkoušet na vlastní kůži, ale asi budete muset prodloužit dobu, po kterou se udržují stránky v cache, abyste se nemuseli při testování honit.

Cachování s konkrétními parametry dotazovacího řetězce Nastavení VaryByParam="*" umožňuje využívat cachování s dynamickými stránkami, jejichž výstup je variabilní na základě dotazovacího řetězce. Tento přístup může být nesmírně prospěšný pro stránku, která obsahuje podrobné údaji o výrobku a dostává ve svém dotazovacím řetězci ID výrobku. Při ukládání do cache, které bere v úvahu parametry, můžete uložit separátní stránku pro každý výrobek, a tím ušetřit nákladné výlety do databáze. Abyste však získali nějaké výhody ze zvýšeného výkonu, pravděpodobně budete muset zvýšit dobu života cachovaných stránek na několik minut, nebo i déle.


456

Kapitola 11 – Ukládání do cache

Taková technika ovšem sebou nese potenciální nesnáze. Stránka, která v dotazovacím řetězci akceptuje širokou škálu různých parametrů (jako třeba stránka, která dostává v řetězci nějaká čísla pro nějaké výpočty, nebo informace o klientovi, nebo slova, které se mají vyhledat), není vhodná pro ukládání do cache. Počet možných variant je totiž enormní a možností opětovného využití velmi málo. I přes fakt, že stránky budou z cache odstraňovány, pokud bude nouze o paměť, může se bezděčně stát, že z cache budou důležitější informace odstraněny jako první, nebo že se zpomalí všechny další operace. V mnoha případech je nastavení VaryByParam na zástupný znak hvězdička (*) zbytečně vágní. Obvykle je mnohem lepší, když se konkrétně specifikuje důležitá proměnná dotazovacího řetězce pomocí jejího názvu. Tady máte ukázku: <%@ OutputCache Duration="20" VaryByParam="ProductID" %>

V tomto případě ASP.NET prozkoumá dotazovací řetězec a bude hledat parametr ProductID. Požadavky s odlišnými ProductID se budou ukládat do cache separátně, ale všechny ostatní parametry se budou ignorovat. To je užitečné hlavně tehdy, jestliže se do stránky v dotazovacím řetězci předávají ještě další informace, které daná stránka nepoužívá. ASP.NET ale bez vaší pomoci neumí rozlišit, které parametry dotazovacího řetězce jsou "důležité", a které ne. Specifikovat můžete i několik parametrů současně. Oddělujte je středníky, jako zde: <%@ OutputCache Duration="20" VaryByParam="ProductID;CurrencyType" %>

V tomto případě se budou ukládat do cache oddělené verze pro ty dotazovací řetězce, které používají parametr ProductID nebo parametr CurrencyType. POZNÁMKA Cachování výstupu funguje dobře u stránek, které se mění pouze na základě dat na straně serveru (například data z nějaké databáze) a dat v dotazovacích řetězcích. Nebude však dobře fungovat, jestliže výstup stránky závisí na informacích specifických pro daného uživatele, jako jsou data relace nebo cookies. Cachování výstupu dále nefunguje u stránek, které jsou řízené událostmi a používají se v nich formuláře. V těchto případech se budou události ignorovat a statické stránky budou opětovně odeslány při každém zpětném odeslání zpět na server (postback), čímž se vlastně stránka vypíná. Abyste se těchto problémů vyvarovali, používejte cachování fragmentu, místo cachování celé stránky, nebo použijte cachování dat pro uložení konkrétních informací do cache.

Vlastní řízení cachování Cachování na základě variant dotazovacích řetězců není vaší jedinou volbou, pokud chcete ukládat do cache několik verzí stránky. S ASP.NET si totiž můžete vytvořit vlastní postup, ve kterém budete rozhodovat, zdali se do cache uloží nová verze stránky, nebo zdali se opětovně použije nějaká již existující. Kód, který napíšete, prozkoumá patřičné informace, a vrátí řetězec. Ten pak ASP.NET použije pro implementaci ukládání do cache. Jestliže kód vygeneruje pro různé požadavky stejný řetězec, ASP.NET opětovně použije cachovanou stránku. Jestliže kód vygeneruje novou hodnotu řetězce, ASP.NET vygeneruje novou verzi stránky a uloží ji do cache odděleně. Vlastní způsob cachování se hodí například tehdy, když potřebujete mít k dispozici různé verze stránky na základě typu prohlížeče. Prohlížeče Netscape pak vždy obdrží stránky optimalizované pro Netscape, uživatelé Internet Exploreru naopak získají HTML kód optimalizovaný pro Internet Explorer. Chcete-li si připravit tento druh logiky, začněte tím, že do stránek, jejichž kopie chcete ukládat do cache, přidáte direktivu Out-


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

457

putCache. Atributem VaryByCustom pak specifikujte název reprezentující typ vašeho ukládání do cache. V následujícím příkladu je použit název browser, protože se kopie stránek budou ukládat do cache podle toho, jaký prohlížeč uživatel používá: <%@ OutputCache Duration="10" VaryByParam="None" VaryByCustom="browser" %>

Dále je potřeba, abyste vytvořili proceduru, která bude realizovat řetězec pro vlastní ukládání. Proceduru musíte zapsat do souboru global.asax dané aplikace (nebo do jejího souboru kódu v pozadí) a musí mít následující syntaxi: public override string GetVaryByCustomString(

HttpContext context, string arg)

{ // Kontrola požadovaného typu cachování výstupu do cache. if (arg == "browser") { // Určí, jaký je aktuální prohlížeč string browserName; browserName = Context.Request.Browser.Browser; browserName += Context.Request.Browser.MajorVersion.ToString(); // Ukládání do cache se bude řídit podle návratové hodnoty. return browserName; } else { base.GetVaryByCustomString(context, arg) } }

Funkce GetVaryByCustomString() předává název VaryByCustom v parametru arg. To umožňuje vytvořit aplikaci, která bude pomocí stejné funkce implementovat několik různých typů vašeho vlastního ukládání do cache. Každý odlišný typ bude používat jiný název VaryByCustom (jako jsou Browser, BrowserVersion, nebo DayOfWeek). Funkce GetVaryByCustomString() prozkoumá název VaryByCustom a vrátí patřičný řetězec, podle něhož se bude ukládání do cache řídit. Bude-li řetězec u různých požadavků stejný, ASP.NET opětovně použije kopii stránky uloženou v cache. Pokud se na to podíváme z druhého konce, ASP.NET vytvoří a uloží do cache samostatnou kopii stránky pro každý různý řetězec, který obdrží. Je zajímavé, že základní implementace GetVaryByCustomString() už obsahuje logiku pro ukládání do cache na základě typu prohlížeče. To znamená, že nemusíte psát kód metody uvedené výše. Základní implementace GetVaryByCustomString() vytvoří řetězec na základě názvu prohlížeče a čísla hlavní verze. Chcete-li tuhle logiku změnit (například ukládat stránky do cache na základě názvu, hlavní verze a vedlejší verze prohlížeče), můžete překrýt metodu GetVaryByCustomString() v duchu návodu uvedeného v příkladu výše. POZNÁMKA Ukládání stránek do cache podle typu prohlížeče je velmi důležitá technika pro takové stránky, které využívají nějaké specifické schopnosti daného prohlížeče. Pokud například stránka generuje takový kód JavaScript, který se provádí u klienta, a který nepodporují všechny prohlížeče, musíte udělat ukládání do cache závislé na verzi prohlížeče. Samozřejmě – stále zůstává na vašem kódu, aby identifikoval prohlížeč, a specifikoval, jaký JavaScript se bude realizovat. O adaptivních stránkách a o JavaScriptu se více dozvíte v páté části knihy.


458

Kapitola 11 – Ukládání do cache

Direktiva OutputCache má ještě třetí atribut, který se dá využít pro definování způsobu cachování. Je to atribut VaryByHeader, který umožňuje ukládat samostatné verze stránky na základě hodnoty nějakého záhlaví HTTP obdrženého s požadavkem. Můžete uvést jedno záhlaví nebo seznam záhlaví oddělovaných středníky. Tato technika se vám může hodit u vícejazyčných webů, abyste si mohli ukládat různé verze stránky na základě jazyka klientského prohlížeče, jako třeba zde: <%@ OutputCache Duration="20" VaryByParam="None" VaryByHeader="Accept-Language" %>

Cachování s třídou HttpCachePolicy Direktiva OutputCache je všeobecně preferovanou technikou pro ukládání kopií stránek do cache, protože pokyny, které se týkají ukládání do cache, jsou odděleny od zbytku kódu. Direktiva OutputCache také snadno umožňuje konfigurovat několik vlastností na jediném řádku. Máte však i jinou volbu – napsat kód, který bude využívat zabudovanou speciální vlastnost Response.Cache. Ta poskytuje instanci třídy System.Web.HttpCachePolicy. Tento objekt nabízí vlastnosti umožňující zapnout cachování pro aktuální stránku. V následujícím příkladu je stránka zobrazující datum přepsána tak, že když je stránka poprvé načtena, automaticky se zapíná cachování. Kód zapíná cachování pomocí metody SetCacheability(), která specifikuje, že stránka bude cachována na serveru a že libovolný další klient může využívat cachovanou kopii této stránky. Metoda SetExpires() definuje expirační datum stránky a nastavuje je na aktuální čas plus 60 vteřin. protected void Page_Load(Object sender, EventArgs e) { // Kopie stránky se bude ukládat do cache na serveru. Response.Cache.SetCacheability(HttpCacheability.Public); // Uložená kopie stránky se bude používat po dobu //následujících 60 vteřin. Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); // Tento dodatečný řádek zajišťuje, že prohlížeč nemůže // učinit stránku neplatnou, když uživatel klikne //na tlačítko Refresh (Aktualizovat) // (o což se některé ničemné prohlížeče pokoušejí). Response.Cache.SetValidUntilExpires(true); lblDate.Text = "The time is now:<br />" + DateTime.Now.ToString(); }

Z hlediska návrhu není programátorské řešení cachování až tak průzračné. Vkládat kód týkající se cachování přímo do stránky je často krkolomné, a vždy jsou s tím nějaké zmatky, když potřebujete dostat do stránky ještě nějaký jiný inicializační kód. Uvědomte si, že kód v ovladači události Page.Load se vykoná jen tehdy, pokud stránka není uložená v cache (buď proto, že se jedná o první požadavek na stránku, nebo proto, že platnost naposledy cachované verze stránky už vypršela, nebo proto, že nesouhlasí parametry požadavku). TIP Přesvědčte se, že používáte vlastnost Response.Cache stránky, a nikoliv vlastnost Cache. Vlastnost Cache se nepoužívá pro cachování výstupu – místo toho poskytuje přístup ke cache, kam se ukládají data (což se probírá v oddílu "Cachování dat").


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

459

Nahrazení po uložení do cache a cachování fragmentů Ačkoliv v některých případech zjistíte, že nemůžete do cache uložit celou stránku, můžete do ní uložit alespoň ty části, které se nemění a jejichž opětovné vytvoření je nákladné. S touto výzvou se můžete vypořádat následujícími dvěma způsoby:

Cachování fragmentu (fragment caching). V tomto případě pouze specifikujte obsah, který chcete uložit do cache. Zabalte ho do účelového uživatelského ovládacího prvku, a do cache uložte výstup z tohoto ovládacího prvku.

Nahrazení po uložení do cache (post-cache substitution). V tomto případě pouze specifikujte dynamický obsah, který nechcete ukládat do cache. Pak nahraďte tento obsah za něco jiného pomocí ovládacího prvku Substitution. Nahrazení po uložení do cache je jednou z novinek ASP.NET 2.0.

Z těchto dvou technik se snadněji implementuje cachování fragmentu. Ovšem rozhodnutí, kterou techniku nakonec použít, se bude obvykle zakládat na objemu obsahu, jehož kopie chcete uložit do cache. Máte-li malou, dobře odlišitelnou část obsahu, který chcete ukládat do cache, je rozumnější použít cachování fragmentu. A opačně – máte-li pouze malou část dynamického obsahu, může být jednodušší nahrazovací přístup. Oba přístupy nabízejí obdobný výkon. TIP Nejflexibilnější způsob, jak implementovat částečné cachování, je úplně se oprostit od cachování výstupu, použít cachování dat (data caching), a zpracovat celý proces programátorsky v kódu. Tuto techniku uvidíte v oddílu "Cachování dat".

Cachování fragmentu Pro implementaci cachování fragmentu do cache musíte vytvořit nějaký uživatelský ovládací prvek pro tu část stránky, kterou chcete mít v cache. Pak k tomuto uživatelskému ovládacímu prvku přidejte direktivu OutputCache. Výsledkem bude, že do cache se nebude ukládat celá stránka, ale pouze uživatelský ovládací prvek. Uživatelské ovládací prvky se probírají v kapitole 14. Cachování fragmentu je koncepčně stejné jako cachování stránky. Je tu pouze jeden zádrhel – pokud stránka obdrží cachovanou verzi uživatelského ovládacího prvku, nebude moci s ním komunikovat v kódu. Pokud například uživatelský ovládací prvek poskytuje vlastnosti, váš kód webové stránky nebude schopen tyto vlastnosti modifikovat, ani k nim přistupovat. Když se používá cachovaná verze uživatelského ovládacího prvku, do stránky je jednoduše vložen blok HTML kódu. Odpovídající objekt uživatelského ovládacího prvku není dostupný.

Nahrazení po uložení do cache Schopnost nahrazení po uložení do cache (post-cache substitution) (což je jedna z novinek ASP.NET 2.0) se točí okolo jediné metody, která byla přidána do třídy HttpResponse. Je to metoda WriteSubstitution(), která přijímá jediný parametr – delegáta (delegate), který ukazuje na metodu zpětného volání, kterou implementujete ve vaší třídě stránky. Metoda vrací obsah pro patřičnou část stránky. Funguje to takto – když pracovní rámec ASP.NET stránky získá cachovanou stránku, automaticky spustí vaši metodu zpětného volání pro získání dynamického obsahu. Tento obsah je pak vložen do cachovaného HTML kódu stránky. Pěkné na tom je to, že i když vaše stránka ještě nebyla uložena do cache (například proto, že se realizovala úplně poprvé), ASP.NET i přesto zavolá stejným způsobem vaši metodu zpětného volání pro


460

Kapitola 11 – Ukládání do cache

získání dynamického obsahu. V podstatě je celý vtip v tom, že vytvoříte nějakou metodu, která generuje nějaký dynamický obsah, a tím, že to uděláte, garantujete, že se vaše metoda vždy zavolá, a že její obsah nebude nikdy cachován. Metoda, která generuje dynamický obsah, musí být statická. Je to z toho důvodu, že ASP.NET musí být schopno zavolat tuto metodu, i když ještě není k dispozici instance třídy stránky. (Je zřejmé, že pokud se stránka obsluhuje z cache, objekt stránky se nevytvoří.) Signatura metody je poměrně průzračná – přijímá objekt HttpContext reprezentující aktuální požadavek a vrací řetězec s novým kódem HTML. Podívejte se na ukázku, která vrací tučně naformátované datum: private static string GetDate(HttpContext context) { return "<b>" + DateTime.Now.ToString() + "</b>"; }

Pokud toto chcete dostat do stránky, je potřeba na vhodném místě zavolat metodu Response.WriteSubstitution(): protected void Page_Load(object sender, EventArgs e) { Response.Write("This date is cached with the page: "); Response.Write(DateTime.Now.ToString() + "<br />"); Response.Write("This date is not: "); Response.WriteSubstitution(new HttpResponseSubstitutionCallback(GetDate)); }

Když na tuto stránku nyní aplikujete cachování pomocí direktivy OutputCache, bude se při každém požadavku datum aktualizovat, protože metoda zpětného volání obchází proces ukládání do cache. Výsledek běhu stránky a její několikanásobnou aktualizaci vidíte na obrázku 11-2.

Obrázek 11-2. Injektáž dynamického obsahu do cachované stránky. Potíž s touto technikou je v tom, že nahrazení po uložení do cache funguje na nižší úrovni než zbytek vašeho rozhraní. Když navrhujete nějakou stránku ASP.NET, tak obvykle vůbec nepoužíváte objekt Response – pracujete s webovými ovládacími prvky, které pak využívají objekt Response, aby vygenerovaly svůj obsah. Pou-


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

461

žijete-li objekt Response stejným způsobem jako v předchozím v příkladu, jednou z nevýhod je to, že přijdete o možnost umisťovat svůj obsah s ohledem na zbytek stránky. Jediné realistické řešení je obalit dynamický obsah do nějakého druhu ovládacího prvku. Až se bude tento ovládací prvek realizovat, pak teprve bude schopen zavolat Response.WriteSubstitution(). O realizaci ovládacích prvků se dozvíte více v kapitole 27. Pokud vás mrzí, že se musíte trápit s vývojem vašeho vlastního ovládacího prvku jenom proto, abyste se dostali ke schopnosti nahrazení po uložení do cache, nedělejte to. ASP.NET totiž nabízí zkratku – obecný ovládací prvek Substitution, který pomocí právě popsané techniky udělá veškerý svůj obsah dynamickým. Ovládací prvek Substitution je možné svázat se statickou metodou, která vrátí váš dynamický obsah stejně jako v předchozím příkladu. Vy ovšem můžete ovládací prvek Substitution umisťovat úplně stejně jako jiné ovládací prvky ASP.NET, takže váš dynamický obsah dostanete přesně tam, kde chcete, aby se objevil. Podívejte se na ukázku, která je vlastně duplikátem jedné předchozí ukázky, ve které jsou použity značky v .aspx části stránky: Toto datum se ukládá se stránkou: <asp:Label ID="lblDate" runat="server" /><br /> Ovšem toto datum už nikoliv: <asp:Substitution ID="Substitution1" runat="server" MethodName="GetDate" />

V době návrhu stránky bohužel neuvidíte obsah ovládacího prvku Substitution. Nezapomínejte na to, že náhrada po uložení do cache umožňuje vykonat pouze statickou metodu. ASP.NET stále přeskakuje životní cyklus stránky, což znamená, že nevytvoří žádné objekty ovládacích prvků, a neodpálí se žádné události ovládacích prvků. Jestliže je váš dynamický obsah závislý na hodnotách jiných ovládacích prvků, budete potřebovat použít jinou techniku (jakou je třeba cachování dat), protože objekty těchto ovládacích prvků nebudou vaší statické metodě zpětného volání dostupné. POZNÁMKA Vaše vlastní ovládací prvky mohou dle libosti volat Response.WriteSubstitution(), aby nastavily své chování týkající se ukládání do cache. Například prvek AdRotator to využívá k tomu, aby zajistil, že na stránce bude pořád střídat nějaká reklama, i když zbytek výstupu stránky se bude brát z cache.

Profily cache Jednou z nesnází spojených s cachováním výstupu je to, že je potřeba vložit do stránky instrukci – buď do .aspx části se značkami, nebo do kódu třídy. Přestože je první volba (použití OutputCache) relativně jasná, určitě se objeví starosti ohledně správy, pokud vytvoříte desítky stránek, které cachujete. Budete-li pak chtít u všech těchto stránek změnit způsob ukládání do cache (například změnit dobu trvání platnosti z 30 na 60 vteřin), budete muset modifikovat každou stránku. ASP.NET navíc bude vyžadovat překompilování těchto stránek. ASP.NET 2.0 přichází s novou volbou, která se hodí, potřebujete-li aplikovat stejná nastavení týkající se cache na celou skupinu stránek. Tato schopnost, která se nazývá jako profily cache (cache profiles), umožňuje definovat nastavení pro cache v souboru web.config, asociovat s těmito nastaveními nějaký název, a pak prostřednictvím tohoto názvu použít tato nastavení ve více stránkách. Pak budete moci modifikovat všechny propojené stránky najednou a na jediném místě – pouze změníte profil cache v souboru web.config. Profil cache definujete tak, že do sekce <outputCacheProfiles> přidáte značku <add> – viz ukázka. Přiřadíte v ní název a dobu trvání.


KAPITOLA 22 Autentizace Windows Formulářová autentizace je výborná, chcete-li vytvořit vlastní autentizační systém s záložní databází a vlastní přihlašovací stránkou. Co když ale vytváříte webovou aplikaci pro menší skupinu známých uživatelů, kteří už mají své uživatelské účty Windows? V podobných situacích může být vhodnější nasazení systému, který do svého fungování zapojí již existující údaje o uživatelích a členství ve skupinách. Problém lze vyřešit pomocí autentizace Windows, při níž se srovnávají údaje o uživatelích webu s uživatelskými účty Windows, které jsou definovány na lokálním počítači nebo v jiné doméně sítě. V této kapitole se dozvíte, jak autentizaci Windows použít ve vašich webových aplikacích. Dozvíte se také, jak použít impersonalizaci (impersonation) pro dočasné převzetí cizí identity.

Představení autentizace Windows Autentizace Windows není na rozdíl od formulářové integrována v ASP.NET. Místo toho předává zodpovědnost za autentizaci IIS. Webový server IIS požádá o autentizaci prohlížeč, který poskytne přihlašovací doklady, které jsou pak mapovány na uživatelský účet Windows. Je-li uživatel autentizován úspěšně, IIS povolí žádost o webovou stránku a předá informace o uživateli a roli ASP.NET tak, že programový kód může fungovat téměř stejně, jako když pracuje s informacemi o identitě v situaci s formulářovou autentizací. Obrázek 22-1 na následující stránce názorně ukazuje celý proces.

Proč používat autentizaci Windows? Jsou pro to tři hlavní důvody:

• • •

Velmi málo programátorské práce pro vývojáře. Dovoluje použít existující uživatelská přihlášení. Dovoluje použít impersonalizaci a zabezpečení Windows.


838

Kapitola 22 – Autentizace Windows

Obrázek 22-1. Autentizační proces Windows. První důvod je zcela jednoduchý – při použití autentizace Windows je IIS a klientovi dovoleno se o autentizační proces postarat, takže nemusíte vytvářet přihlašovací stránku, kontrolovat databázi nebo psát nějaký vlastní programový kód. Windows dále podporují takové základní aspekty uživatelského účtu jako je vypršení doby platnosti hesla, uzamčení účtu nebo členství ve skupinách. Druhý a nejdůležitější důvod pro použití autentizace Windows spočívá v tom, že vám dovoluje zapojit do práce existující účty Windows. Tento typ autentizace se standardně používá pro aplikace, v nichž uživatelé i webový server patří ke stejné lokální síti nebo intranetu. To znamená, že uživatelé mohou být autentizováni pomocí stejných přihlašovacích dokladů, které používají pro přihlašování k počítači. Největším přínosem této metody je, že lze provádět "neviditelnou" autentizaci, u které (v závislosti na použitých nastaveních a architektuře sítě) není nutná samostatná přihlašovací procedura. Prohlížeč místo ní jednoduše používá identitu aktuálně přihlášeného uživatele. Třetím důvodem pro použití autentizace Windows je to, že dovoluje využít výhod existujících zabezpečovacích nastavení Windows. Můžete např. ovládat přístup k souborům pouhým nastavením přístupových oprávnění k souborům Windows. Je ovšem důležité si uvědomit, že tato oprávnění nemají automatický účinek. Je to proto, že vaše webová aplikace obvykle používá pevný účet (standardně je to účet ASPNET, který je definován v souboru machine.config). Tento režim lze změnit opatrným použitím autentizace Windows a impersonalizace, jak je popsáno v sekci s názvem "Impersonalizace a delegování na Windows Serveru 2003" v této kapitole.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

839

Proč nepoužívat autentizaci Windows? Proč byste neměli používat tento způsob autentizace?

• • •

Je spjat s uživateli Windows. Je spjat s klientskými počítači Windows. Nenechává příliš velkou flexibilitu nebo možnost ovládání a nedá se snadno přizpůsobovat.

První problém spočívá v tom, že autentizace Windows nebude fungovat, pokud uživatelé, které autentizujete, nemají platné účty Windows. U veřejných webů tuto překážku pravděpodobně nelze vůbec odstranit. I kdyby bylo možné pro každého uživatele vytvořit účet Windows, nebylo by to nikdy tak efektivní jako databázový přístup pro větší množství uživatelů. Existuje zde také potenciální bezpečnostní riziko, protože účty uživatelů Windows mohou mít oprávnění k přístupu na počítač webového serveru nebo k jiným síťovým počítačům. Druhý problém spočívá v tom, že některé autentizační metody používané IIS od uživatelů vyžadují, aby měli na počítači kompatibilní software, což omezuje schopnosti autentizace Windows u těch, kteří nemají operační systém od Microsoftu, nebo nepoužívají Internet Explorer. A posledním velkým problémem je to, že autentizace Windows nedává žádné možnosti pro řízení autentizačního procesu. Nelze tedy jednoduše programově přidávat, odstraňovat a ovládat informace spjaté s účtem Windows nebo ukládat jiné informace specifické pro jednotlivé uživatele společně s přihlašovacími doklady. Jak jste se dočetli v předchozí kapitole, všechny tyto aspekty se dají snadno začlenit do formulářové autentizace, ale v autentizaci Windows nehrají žádnou roli.

Mechanismy autentizace Windows Pokud implementujete autentizaci Windows, IIS použije jednu ze tří autentizačních strategií pro autentizaci každého přijatého požadavku.

Základní autentizace. Uživatelské jméno a heslo je předáváno jako prostý text. Základní autentizace je jako jediná autentizační metoda podporována všemi prohlížeči jako součást standardu HTML.

Digestní autentizace. Není přenášeno ani uživatelské jméno ani heslo. Místo toho se posílá hašovaná forma těchto údajů, která je z kryptografického hlediska bezpečná.

Integrovaná autentizace Windows. Není přenášeno ani uživatelské jméno ani heslo. Místo toho je údaj o identitě uživatele, který se právě přihlásil k Windows, automaticky předáván ve formě tokenu. Je to jediný typ autentizace, který se uskutečňuje zcela transparentně (bez zásahu uživatele).

Následující sekce této kapitoly probírají tyto tři uvedené možnosti. POZNÁMKA Pro autentizaci Windows existují i méně používané protokoly. Je to např. autentizace založená na certifikátu. Pokud zvolíte tento typ autentizace, musíte všem klientům rozeslat digitální certifikát a každý certifikát namapovat na příslušný účet Windows. U této metody se bohužel příliš často objevují problémy s administrací a dislokací. IIS 6 navíc podporuje pokročilou souhrnnou autentizaci (funguje v podstatě stejně jako digestní autentizace, ale hesla ukládá bezpečněji) a passportovou autentizaci umožňující uživateli se přihlásit k passportovému účtu, který se na uživatelský účet Windows mapuje.


840

Kapitola 22 – Autentizace Windows

Základní autentizace Nejpodporovanějším autentizačním protokolem je základní autentizace. Podporují ji téměř všechny webové prohlížeče. Pokud web vyžaduje autorizaci klienta pomocí základní autentizace, prohlížeč zobrazí přihlašovací dialog pro zadání uživatelského jména a hesla, který je podobný dialogu na obrázku 22-2.

Obrázek 22-2. Přihlašovací dialog pro základní autentizaci. Poté, co uživatel poskytne tyto údaje, jsou samotná data přenesena na webový server (v tomto případě localhost). Jakmile IIS obdrží autentizační data, pokusí se uživatele autentizovat ve spolupráci s odpovídajícím účtem Windows. Největším omezením základní autentizace je její nedostatečné zabezpečení, alespoň co se týče jí samotné. Přihlašovací doklady, které jsou reprezentovány uživatelským jménem a heslem, a které jsou získány pomocí základní autentizace, jsou mezi klientem a serverem přenášeny jako prostý text. Samotná data jsou zakódována (nikoliv šifrována) do řetězce typu Base64, který různí slídilové dokáží velmi snadno přečíst. Z tohoto důvodu byste měli základní autentizaci používat jen tehdy, když není potřeba přihlašovací doklady uživatele chránit, nebo jenom ve spolupráci s nějakým šifrovacím protokolem HTTP jako je např. SSL. Takto budou data, která jsou jinak snadno dostupná pro jakoukoliv síťovou slídicí utilitu, zašifrována pomocí komplexního algoritmu. (Více informací o SSL najdeme v kapitole 18.)

Digestní autentizace Tento typ autentizace (stejně jako základní autentizace) vyžaduje od uživatele, aby zadal informace do přihlašovacího dialogového boxu, který je zobrazen prohlížečem. Na rozdíl od základní autentizace však digestní autentizace předává místo hesla samotného jeho hašovanou formu. (Anglické slovo digest je synonymem slova haš – odtud pochází název tohoto autentizačního schématu.) Samotné heslo se v textové podobě nikdy po síti neposílá, protože se posílá jeho hašovaná forma, což zabraňuje zcizení hesla i přes fakt, že není použito SSL. Proces autentizace uživatele pomocí souhrnné metody funguje takto: 1.

Neautentizovaný klient požaduje webovou stránku s omezeným přístupem.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

841

2.

Server odpoví odezvou HTTP 401. Tato odezva zahrnuje příležitostnou hodnotu (nonce value), což je náhodně vygenerovaná série bitů. Server zajišťuje, že každá příležitostná hodnota bude jedinečná, předtím než ji použije.

3.

Klient použije pro vytvoření haše příležitostnou hodnotu, heslo, uživatelské jméno a některé další hodnoty. Hodnota tohoto haše, tzv. digest, je poslána zpátky na server společně s uživatelským jménem ve formě prostého textu.

4.

Server použije příležitostnou hodnotu, heslo uložené pro uživatelské jméno a ostatní hodnoty pro vytvoření haše. Tento haš pak porovná s hašem získaným od klienta. Pokud obě hašované hodnoty souhlasí, je autentizace úspěšná.

Digest není útočníkovi příliš platný, protože příležitostná hodnota se mění s každým autentizačním požadavkem. Z digestu se původní heslo extrahovat nedá. Protože digest obsahuje příležitostnou hodnotu, nemůže být použit pro opakovaný útok (replay attacks), kdy se útočník pokouší získat přístup ke chráněným zdrojům tak, že použije dříve zachycený digest. Teoreticky je digestní autentizace standardem a webové servery a prohlížeče by měly být schopny ji používat pro výměnu autentizačních informací. Firma Microsoft bohužel interpretuje část specifikace digestní autentizace trochu jiným způsobem než ostatní organizace, jako např. Apache Foundation (webový soubor Apache) a projekt Mozilla (webový prohlížeč Mozilla). Důsledkem je, že digestní autentizace IIS v současnosti funguje pouze v Internet Exploreru 5.0 a vyšších verzích. Dalším omezením digestní autentizace v IIS je to, že funguje pouze tehdy, když autentizovaný virtuální adresář běží pod doménovým řadičem Windows Active Directory.

Integrovaná autentizace Windows Tato metoda je nejvhodnějším autentizačním standardem pro intranetové aplikace založené na WAN nebo LAN, neboť autentizaci vykonává bez toho, aby se vyžadovala interakce s klientem. Požádá-li IIS klienta, aby se autentizoval, prohlížeč pošle token reprezentující uživatelský účet Windows aktuálního uživatele. Pokud webový server při autentizaci pomocí těchto údajů neuspěje, objeví se dialogový box, kam může uživatel zadat jiné uživatelské jméno a heslo. Integrovaná autentizace Windows může fungovat jen tehdy, když jsou klient a webový server ve stejné lokální síti nebo intranetu, neboť tato metoda de facto nepřenáší údaje obsahující uživatelská jména a hesla. Místo toho pracuje v koordinaci s doménovým serverem nebo instancí Active Directory, kde proběhlo přihlášení, přičemž přikáže příslušnému počítači, aby na webový server poslal autentizační údaje. Jako protokol je pro přenášení autentizačních údajů použita buď autentizace NTLM (NT LAN Manager), nebo Kerberos 5 – závisí to na verzi operačního systému klienta a serveru. Pokud na obou běží Windows 2000 nebo vyšší, a oba stroje pracují v doméně Active Directory, je jako autentizační protokol použit Kerberos, jinak to bude autentizace NTLM. Oba protokoly jsou extrémě zabezpečené (Kerberos je z aktuálně dostupných protokolů ten nejbezpečnější), nicméně, mají nějaká omezení. Integrovaná autentizace v zásadě pracuje jenom v Internet Exploreru 2.0 a vyšších (integrovaná autentizace Windows není podporována v ne-internetových klientech Exploreru). Kerberos samozřejmě funguje jenom na počítačích, na kterých běží Windows 2000 nebo vyšší verze, a ani jeden z protokolů nemůže pracovat přes proxy server. Kerberos navíc vyžaduje, aby byly otevřeny některé další porty na firewallech. V této kapitole se dále dozvíte základní věci o autentizačních protokolech používaných pro integrovanou autentizaci Windows, což vám pomůže lépe pochopit jednotlivé konfigurační kroky (zejména impersonalizaci a delegování).


842

Kapitola 22 – Autentizace Windows

Autentizace typu NT LAN Manager Autentizace NTLM je integrována v operačním systému Windows od okamžiku, kdy byla do něj zahrnuta podpora sítí. NTLM autentizuje klienty pomocí mechanismu výzva/odezva, který je založen na trojí výměně mezi klientem a serverem. Všechny procesy, o nichž se dozvíte v této sekci, se odehrávají v operačním systému zcela automaticky. Přirozeně – všechno bude fungovat pouze za předpokladu, kdy klient i server používají operační systém Windows. Klient zahajuje komunikaci vysláním zprávy na server, což signalizuje, že klient chce se serverem komunikovat. Server vygeneruje 64bitovou náhodnou hodnotu nazvanou jako příležitostná. Server na požadavek klienta odpovídá tím, že příležitostnou hodnotu navrací. Této odezvě se říká výzva. Nyní operační systém klienta požaduje od uživatele uživatelské jméno a heslo. Heslo v hašované formě – nazývané jako master-key – bude následně použito pro zašifrování příležitostné hodnoty. Klient posílá serveru svoji odezvu společně s uživatelským jménem a zašifrovanou příležitostnou hodnotou (čímž se dokončuje mechanismus výzva/odezva). Server musí nyní ověřit platnost vrácené příležitostné hodnoty. Podle toho, zdali se jedná lokálního uživatel nebo uživatele v rámci domény, se validace uskutečňuje lokálně nebo vzdáleně na doménovém řadiči. V obou případech je master-key uživatele, tedy hašovaná verze hesla, získáván z databáze zabezpečených účtů. S využitím master-key se příležitostná hodnota ve formátu prostého textu zašifruje na serveru ještě jednou (server pochopitelně cachuje příležitostnou hodnotu v textové podobě předtím, než pošle data klientovi). Pokud opětovně vytvořená šifrovaná verze příležitostné hodnoty souhlasí se šifrovanou verzí vrácenou z klienta, je autentizace úspěšná, a pro uživatele je na serveru vytvořena přihlašovací relace. Obrázek 22-3 ukazuje průběh tohoto procesu.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

843

Obrázek 22-3. Letmý pohled na NTLM. Z popisu je jasně vidět, že heslo se nikdy nepřenáší po lince. Dokonce se ani nepředává hašovaná verze hesla, což bezpečnost NTLM značně zvyšuje. Existuje ale ještě bezpečnější protokol s dalšími možnostmi, jak uvidíte v další sekci.

Autentizace pomocí Kerberos: krátké představení V současné době je Kerberos 5 nejbezpečnějším dostupným autentizačním protokolem. Je to veřejně známý standard, který byl vytvořen organizací IETF (Internet Engineering Task Force), a který implementuje autentizační protokol založený na autentizačních lístcích. V operačním systému Windows je Kerberos k dispozici od verze Windows 2000. Pokud aktivujete integrovanou autentizaci Windows, Kerberos bude automaticky použit za splnění těchto podmínek:

• •

Na klientovi a serveru běží Windows 2000 nebo vyšší. V síti je dostupná doména Active Directory s řadičem primární domény (který se automaticky přebírá roli tzv. distribučního centra klíčů)

Ve všech ostatních případech použije Windows jako autentizační protokol NTLM. Ačkoli detailní popis protokolu Kerberos by byl na samostatnou knihu, v této kapitole se alespoň dozvíte o základních konceptech. Ty vám pomohou porozumět nejenom nezbytným úkolům při konfiguraci, ale také tomu, kdy budou v činnosti


844

Kapitola 22 – Autentizace Windows

jednotlivé funkce. Jedním z největších rozdílů mezi NTLM a Kerberos je například to, že Kerberos podporuje impersonalizaci a delegování, zatímco NTLM jenom impersonalizaci. Delegování je v zásadě založeno na stejném konceptu jako impersonalizace. Jde v něm pouze o akce vykonávané v zastoupení za identitu klienta. Zatímco impersonalizace funguje v rámci jednoho počítače, delegování pracuje napříč celou sítí. To znamená, že autentizační lístek původní identity klienta může být předán jinému serveru v síti, pokud má k tomu původní server příslušná oprávnění. O impersonalizaci a delegování se více dozvíte později v této kapitole. Prozatím je důležité vědět, že Kerberos podporuje jak impersonalizaci, tak i delegování, zatímco NTLM a ostatní autentizační techniky Windows (jako základní nebo digestní autentizace) podporují pouze impersonalizaci. Klíčovou komponentou systému Kerberos je KDC (key distribution center, centrum distribuce klíčů), které zodpovídá za generování lístků a správu přihlašovacích dokladů. Ve světě Windows hraje roli KDC primární doménový řadič Active Directory. Každý aktér (klient a server) musí KDC důvěřovat. Spravuje totiž všechny uživatelské a počítačové účty a generuje autentizační a relační lístky pro komunikační relace mezi jednotlivými počítači v rámci domény. To je další velký rozdíl, který najdeme při srovnávání Kerberos a NTLM – NTLM pracuje v situacích pracovních skupin bez centrální správy, Kerberos ovšem pro vydávání všech typů lístků centrální správu vyžaduje. Pro nasazení protokolu Kerberos je požadováno spojení s doménovým řadičem Active Directory. Obrázek 22-4 ukazuje postup autentizace uživatele a ustavení relace mezi klientem a jednoduchým členským serverem v rámci domény. Každý uživatelský autentizační proces začíná zasláním požadavku autentizační službě, která běží na KDC. Tento požadavek obsahuje uživatelské jméno uživatele, který má být autentizován. KDC získá uživatelský master-key z databáze zabezpečených účtů. Opět to je hašovaná verze uživatelského hesla. Poté je vytvořen TGT (ticket-granting ticket, povolovací lístek). Tento lístek obsahuje klíč relace pro relaci uživatele a datum a čas vypršení platnosti. Než je lístek vrácen klientovi, server jej za použití uživatelského master-key zašifruje. Pouze se správným heslem vloženým uživatelem může operační systém klienta vytvořit správný master-key (haš) pro úspěšné dešifrování TGT požadavku získaného ze serveru. Pokud je dešifrování TGT na klientovi úspěšné, je uživatel úspěšně autentizován. Klient pak nakonec TGT lokálně cachuje. Pokud chce klient komunikovat s jiným členským serverem v rámci sítě, musí požádat KDC o relační lístek. Pro tyto účely posílá lokálně cachovaný TGT na tzv. povolovací službu, která běží na KDC. Tato služba ověřuje platnost TGT. Pokud je TGT stále platný (nevypršela jeho doba platnosti, nikdo s ním nemanipuloval apod.), služba vygeneruje klíč relace pro komunikační relaci mezi klientem a členským serverem. Relační klíč je pomocí master-key klienta zašifrován. Relační klíč je navíc začleněn do ST (session ticket, lístek relace), který obsahuje dodatečnou informaci pro server o době platnosti. Relační lístek je zašifrován pomocí master-key členského serveru. Zašifrovaný klíč relace i zašifrovaný lístek relace jsou přeposlány klientovi. Klient dešifruje klíč relace a přepošle lístek relace serveru. KDC samozřejmě dobře zná jak klienta, tak i server, protože oba byly v minulosti přidány do domény (přidání počítače do domény znamená ustavení spolehlivého vztahu mezi počítačem a KDC). KDC proto zná jak master-key klienta, tak i master-key serveru.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

845

Obrázek 22-4. Autentizace pomocí protokolu Kerberos a lístky. Pokud server dešifruje relační lístek od klienta a ověření jeho platnosti je úspěšné, je ustanovena komunikační relace. Klient i server použijí pro šifrování komunikace už vytvořený klíč relace. Jakmile vyprší platnost lístku relace, celá operace se opakuje. Každý lístek – relační i povolovací – mají jisté schopnosti. Mohou například na serveru napodobit uživatele klienta nebo delegovat identitu klienta na jiný server. Pokud klient a KDC tyto schopnosti nezačlení do lístku, nebudou funkční. Proto klient a server potřebují dodatečná oprávnění, jak se dočtete v sekci Impersonalizace dále v této kapitole. Základní koncepty NTLM a Kerberos budeme dále rozebírat proto, abyste pochopili nezbytné konfigurační kroky zajišťující funkčnost impersonalizaci a delegování. Pro většinu situací platí, že pokud nefunguje něco, co se týká impersonalizace nebo delegování, je to proto, že je chyba v konfiguraci doménového řadiče nebo KDC (používáte-li Active Directory), nebo proto, že datum vypršení platnosti lístku není adekvátně nastaveno (doba platnosti by neměla být nastavena jako příliš dlouhá, ale ani jako příliš krátká). Třebaže detailní rozbor diskutovaných témat by si vyžádal další knihu, tento přehled vám pomůže pochopit, jak protokol funguje a jaké jsou požadavky pro různé scénáře použití.


KAPITOLA 32 Tvorba webových služeb Už léta bojují softwaroví vývojáři a architekti o vytvoření softwarových komponent, které by mohly být vzdáleně zavolány prostřednictvím lokální sítě a Internetu. Během tohoto procesu bylo vytvořeno několik nových technologií a několik komplikovaných proprietárních řešení. Ačkoliv některé z těchto technologií byly docela úspěšné (pokud jde o spouštění back-end systémů v interních sítích), ani jedné z nich se nepodařilo zvládnout složité problémy spojené s Internetem, který představuje širokou, a někdy nespolehlivou síť počítačů, na nichž běží všechny možné typy hardware a operačních systémů. Zde přichází na scénu webové služby XML (XML web services). Pokud chcete komunikovat s nějakou webovou službou, stačí poslat prostřednictvím HTTP příslušnou zprávu XML. Protože každé zařízení, které je určeno pro Internet podporuje HTTP protokol, a protože každý programovací jazyk umožňuje přistupovat ke XML parseru, existují určitá omezení ohledně typů aplikací, které mohou používat webové služby. V podstatě většina programovacích prostředí obsahuje sadu nástrojů vyšší úrovně, díky kterým je komunikace s webovou službou stejně snadná jako volání lokální funkce. Tato kapitola přináší nejenom přehled webových služeb, ale také problémů, které tyto služby řeší. Pokud je tato problematika pro vás zcela nová, naučíte se, jak vytvářet a používat webové služby v ASP.NET. Zatím se však nebudete detailněji zabývat nižší úrovní – základními protokoly. Místo toho začnete webovou službu rovnou používat, přičemž v další kapitole se naučíte, jak ji rozšířit.


1204

Kapitola 32 – Tvorba webových služeb

ZMĚNY TÝKAJÍCÍ SE WEBOVÝCH SLUŽEB V .NET 2.0 Pokud jste již programovali s webovými službami v .NET 1.x, pravděpodobně vás zajímá, co všechno se v změnilo v .NET 2.0. Z praktického hlediska je zde překvapivě málo nových věcí, výchozí infrastruktura je v podstatě úplně stejná. Najdete zde však spoustu užitečných zlepšení, z nichž mnoho se týká fungování webových služeb s komplexními typy (což jsou vlastní třídy dat, které se používají pro zasílání nebo získávání informací pro webovou metodu). Najdete zde popsány všechny tyto změny:

Podpora pro vlastnosti procedur. Pokud máte webovou službu, která používá vlastní typ, .NET vytvoří kopii této třídy u klienta. V .NET 1.x je tato automaticky generovaná třída sestavena z veřejných vlastností. V .NET 2.0 se místo toho používají vlastnosti procedur. Tato malá změna sice neovlivní způsob fungování webové služby, nicméně vám umožní použít tuto třídu ve scénářích vázání dat.

Sdílení typů. .NET nyní rozeznává, pokud dvě webové služby používají stejný komplexní typ a generuje pouze jednu třídu na straně klienta. Nejlepší na tom je, že díky tomu, že obě třídy používají stejné typy, můžete snadno z jedné webové služby získat nějaký objekt a přímo jej poslat k jiné webové službě.

Vlastní serializace. Nyní můžete zapojit vaše vlastní třídy do procesu serializace tak, aby mohly kompletně řídit svoji vlastní reprezentaci v XML. Ačkoli jste serializaci mohli provádět i v ASP.NET 1.x, nebyla tato serializace zdokumentována a dostatečně podporována.

Bohaté objekty. Potřebujete si vyměňovat komplexní objekty společně s metodami a konstruktory? Nyní je to možné, pokud vytvoříte novou komponentu nazývanou jako importér schématu (schema importer) . Importér schématu ověřuje schéma webové služby a sděluje třídě, jaké typy by měla použít.

Contract-first vývoj. Nyní si můžete vybudovat webovou službu .NET, která bude srovnatelná s již existujícím WSDL.

Všechna tato zlepšení podrobně popisuje kapitola 33. Mnoho dramatických změn je ovšem stále ještě před vámi. Vývojáři Microsoftu dokončují Indigo, což je nový model pro distribuci zpráv, který obsahuje funkcionalitu webové služby a další technologie .NET, jako je například vzdálený přístup. Ačkoli bude určitě poskytnut přirozený způsob, jak přejít od webové služby ASP. NET k modelu Indigo, mnoho detailů implementace bude změněno. Indigo není součástí .NET 2.0, nýbrž by mělo být dodáváno s další verzí Windows (která nebude k dispozici dříve než koncem roku 2006). Microsoft však naznačil, že ještě předtím by mohl vydat sadu nástrojů Indigo určenou pro jiné verze Windows. Další informace získáte ve vývojářském centru Microsoft Indigo na adrese http://msdn.microsoft.com/ Longhorn/understanding/pillars/Indigo.

Přehled webových služeb Zatímco HTML stránky (nebo HTML výstup vygenerovaný webovými formuláři ASP.NET) by měly být používány koncovými uživateli, webové služby jsou používány jinými aplikacemi. Jsou to části obchodní logiky, ke kterým se lze dostat přes Internet. Například stránky internetového obchodu můžou využívat webovou službu nějaké poštovní společnosti pro výpočet ceny za dopravu zásilky. Stránka se zpravodajstvím může získávat nadpisy a články od externích dodavatelů zpráv a zobrazovat je v reálném čase na svých vlastních stránkách. Web může dokonce poskytovat aktuální hodnoty akcií, které jsou získávány ze specializovaných


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

1205

finančních nebo investičních stránek. To ovšem není žádná vzdálená budoucnost. Všechny tyto scénáře na webu už rutinně fungují a největší internetové společnosti, jako jsou Amazon, Google a eBay nabízejí vývojářům k použití své vlastní webové služby. Pomocí webových služeb můžete prostřednictvím několika řádek kódu použít obchodní logiku někoho jiného, aniž byste ji museli vytvářet od úplného začátku. Tato technika je podobná technice, kterou používají programátoři v případě knihoven API, tříd a komponent. Hlavní rozdíl je v tom, že webové služby mohou být umístěny na vzdáleném serveru a zpravovány jinou společností.

Historie webových služeb Ačkoliv webové služby představují novou technologii, můžete hodně pochopit, pokud znáte jejich nedávnou historii. Dvě z největších změny v oblasti vývoje softwaru, které proběhly během několika posledních dekád, se týkaly vývoje objektově orientovaného programování a technologie založené na komponentách. Objektově orientované programování se připojilo k hlavnímu programovacímu proudu někdy v osmdesátých letech minulého století. Mnozí lidé v objektově orientovaném programování viděli řešení softwarové krize, která vyplývala z narůstající složitosti a velikosti softwarových aplikací. Mnoho projektů se opozdilo a překročilo svůj rozpočet, přičemž výsledný produkt byl často nespolehlivý. Objektově orientovaný kód sliboval začlenění objektů do kódu, díky čemuž mohli vývojáři vytvářet komponenty, které byly opakovaně použitelné, rozšiřitelné a snadno udržovatelné. V devadesátých letech minulého století se objevila technologie komponent, která umožnila budovat aplikace sestavováním komponent. Technologie založená na komponentech je skutečným rozšířením objektově orientovaných principů za hranice libovolného jazyka, takže se stává jádrem infrastruktury, které může kdokoliv použít. Zatímco objektově orientovaný jazyk umožňoval vývojářům opakovaně používat objekty ve svých aplikacích, technologie založená na komponentách jim umožňovala snadno sdílet zkompilované objekty mezi aplikacemi. Vznikly dvě dominantní technologie založené na komponentách – COM (Component Object Model) a CORBA (Common Object Request Broker Architecture). Od té doby se objevily další technologie založené na komponentách (jako například JavaBeans a .NET), nicméně jsou navrženy jako proprietární řešení pro konkrétní programovací prostředí. Krátce poté, co byly COM a CORBA vytvořeny, byly tyto standardy použity u distribuovaných komponent tak, aby aplikace mohla pracovat s objekty umístěnými v různých počítačích zapojených do sítě. Ačkoli COM i CORBA jsou po technické stránce velice sofistikované, je často velmi obtížné je nastavit a podporovat v prostředí lokální sítě, nehledě na fakt, že nemohou fungovat společně. S objevením Internetu se pak logicky objevil dramatický nárůst dalších problémů. I přesto všechno je vývojáři začali používat při vytváření distribuovaných aplikací, tzn. WAN aplikací (Wide Area Networks), které se ovšem velmi pomalu rozšiřovaly, a které také byly méně spolehlivé. Protože technologie COM i CORBA jsou velice komplexní a současně proprietární, ani jedna z nich se v tomto prostředí neprosadila natolik, aby se to dalo považovat za úspěch. Webové služby jsou novou technologií, která má za cíl vyřešit tyto problémy rozšířením technologie objektů a komponent do webového prostředí. Webová služba je v zásadě jednotkou aplikační logiky (komponentou), která může být vzdáleně zavolána přes Internet. Očekávání vkládaná do webových služeb se v mnohém shodují s očekáváními vkládanými do technologie komponent, přičemž jejich cílem je usnadnit sestavování aplikací pomocí hotové aplikační logiky, sdílet funkcionalitu mezi partnery a vytvářet mnohem modulárnější aplikace. Na rozdíl od dřívějších technologií založených na komponentách jsou webové služby navrženy výhradně pro tento účel. To znamená, že jako vývojáři v .NET budete stále používat .NET model komponent, pomocí kterého budete schopni sdílet zkompilované assembly mezi jednotlivými aplikacemi .NET. Pokud


1206

Kapitola 32 – Tvorba webových služeb

však budete chtít sdílet funkcionalitu mezi aplikacemi, které běží na různých platformách, a které jsou poskytovány různými společnostmi, budou pro vás webové služby naprosto ideálním řešením. Webové služby také kladou mnohem větší důraz na součinnost (interoperability). Všechny platformy pro vývoj softwaru, které umožňují programátorům vytvářet webové služby, používají jako základní kámen otevřené standardy, které jsou založeny na XML. Tím je zajištěno, že pomocí .NET můžete vytvořit nějakou webovou službu a následně ji zavolat z nějakého klienta založeného na Javě, nebo vytvořit webovou službu v Javě, a tu následně zavolat z .NET aplikace. POZNÁMKA Webové služby nejsou omezeny pouze na .NET Framework. Standardy webových služeb byly specifikovány ještě před uvedením platformy .NET, a jsou používány a podporovány i dalšími výrobci softwaru. .NET Framework je ovšem speciálním případem, protože v sobě ukrývá veškerý propojovací kód, což vám usnadní nejenom zprovoznění vašich webových služeb přes internet, ale také vám to usnadní přístup k webovým službám, které poskytují jiné společnosti. Jak dále uvidíte, nemusíte znát XML a SOAP do naprostých detailů, abyste mohli úspěšně budovat webové služby, ačkoliv je pravda, že určitá úroveň znalostí vám rozhodně neuškodí. ASP.NET provádí abstrakci podrobnosti a vytváří obalové třídy, které vystavují jednoduchý, objektově orientovaný, model takovým způsobem, aby bylo snadné posílat, získávat a interpretovat zprávy SOAP.

Distribuované výpočty a webové služby Abyste zcela pochopili důležitost webových služeb, musíte porozumět požadavkům distribuovaných výpočtů. Distribuované výpočty představují rozdělení aplikační logiky do jednotek, které jsou vykonávány na dvou nebo více počítačích v síti. Myšlenka distribuovaných výpočtů se zrodila už dříve, přičemž pro distribuované a současně opakované použití aplikační logiky bylo vyvinuto mnoho komunikačních technologií. Použití distribuované aplikační logiky má mnoho výhod. Zde jsou uvedeny pouze nejdůležitější výhody takového přístupu:

Vysoká rozšiřitelnost. Prostřednictvím distribuované aplikační logiky je zátěž rozložena na více počítačů. To sice nezlepší výkon dané aplikace u jednotlivých uživatelů (v podstatě jej může o něco snížit), nicméně to prakticky vždy zvýší rozšiřitelnost – tím se dosáhne toho, aby aplikace současně mohla sloužit podstatně většímu počtu uživatelů.

Snadné rozmístění. Části distribuované aplikace můžou být upgradovány, aniž by bylo potřeba upgradovat celou aplikaci. Centrálně umístěná komponenta může být aktualizována, aniž by bylo nutné aktualizovat stovky (nebo dokonce tisíce) klientů.

Vylepšená bezpečnost. Distribuované aplikace často přesahují hranice společnosti či organizace. Můžete například používat distribuované komponenty, které vašemu obchodnímu partnerovi umožní získat katalog produktů vaší společnosti. Nebylo by ovšem bezpečné nechat vašeho obchodního partnera, aby se přímo napojil do databáze vaší společnosti. Místo toho musí obchodní partner použít komponentu, která běží na vašich serverech, a kterou máte pod vlastní kontrolou, a kterou můžete v případě potřeby odpovídajícím způsobem omezit.

Internet zvýšil důležitost a použitelnost distribuovaných výpočtů. Jednoduchost a všudypřítomnost Internetu z něj dělá logickou volbu při výběru základního kamene distribuovaných aplikací. Před objevením webových služeb byly dominantní protokoly COM (při použití v síti nazývaný jako DCOM – Distributed COM) a CORBA. Ačkoli CORBA a DCOM mají mnoho společného, liší se v několika detailech, z čehož vyplývá, že je velmi obtížné dosáhnout vzájemné spolupráce těchto dvou protokolů. Tabulka 32-1


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

1207

uvádí přehled podobností a rozdílů mezi CORBA, DCOM a webovou službou. V tabulce také najdete velké množství zkratek.

Tabulka 32-1. Srovnání jednotlivých distribuovaných technologií. Charakteristika

CORBA

DCOM

Webová služba

Mechanismus RPC (vzdálené volání procedury)

IIOP (Internet Inter-ORB Protocol)

DCE-RPC (Distributed Computing Environment Remote Procedure Call)

HTTP (Hypertext Transfer Protocol)

Kódování

CDR (Common Data Representation)

NDR (Network Data Representation)

XML (Extensible Markup Language)

Popis rozhraní

IDL (Interface Definition Language)

IDL (Interface Definition Language)

WSDL (Web Service Description Language)

Zpřístupnění

Služba pojmenování (Naming service) a obchodování (trading service)

Registr

UDDI (Universal Description, Discovery, and Integration)

Přívětivost k firewallu?

Ne

Ne

Ano

Složitost protokolů

Vysoká

Vysoká

Nízká

Použití mezi platformamy?

Částečně

Ne

Ano

Protokoly CORBA i COM umožňují vyvolat vzdálené objekty. CORBA používá standard pojmenovaný jako IIOP (Internet Inter-ORB Protocol), DCOM používá variantu standardu s názvem DCERPC (Distributed Computing Environment Remote Procedure Call). Kódování dat v CORBA je založeno na formátu s názvem CDR (Common Data Representation). V DCOM je kódování dat založeno na podobném, ale nekompatibilním formátu s názvem NDR (Network Data Representation). Tyto vrstvy standardů významně zvyšují složitost těchto protokolů. Existují také rozdíly mezi jazyky, které oba protokoly podporují. Protokol DCOM podporuje širokou škálu jazyků (C++, Visual Basic atd.), nicméně byl hlavně používán v operačních systémech Microsoftu. Protokol CORBA také podporoval různé platformy, byl však spojen především s aplikacemi založenými na Javě. Výsledkem bylo, že vývojáři měli k dispozici dvě platformy, které byly technicky schopny podporovat systémy distribuovaných objektů, nicméně však nemohly spolupracovat společně.

Problémy spojené s technologiemi distribuovaných komponent Součinnost představuje pouze část problémů spojených s protokoly CORBA a DCOM. Tyto protokoly se potýkají také s dalšími technickými potížemi – oba byly vyvinuty dříve než Internet a jako takové nejsou navrženy tak, aby počítaly s volně propojenou, a někdy nespolehlivou a velice zatíženou sítí. Oba tyto protokoly jsou orientované na spojení. To znamená, že DCOM klient udržuje spojení s DCOM serverem, aby mohl realizovat vícenásobná volání. DCOM komponenta na straně serveru si může v paměti uchovávat informace o klientovi. Tím vzniká bohatý a flexibilní programovací model, nicméně to však není vhodný způsob pro navrhování rozsáhlých aplikací, které používají bezstavové protokoly Internetu. Pokud klient jednoduše


1208

Kapitola 32 – Tvorba webových služeb

zmizí, aniž by řádně ukončil spojení, je zbytečně plýtváno důležitými zdroji. A podobně v případě, kdy se najednou pokouší připojit tisíce uživatelů, je server snadno zahlcen a rychle vyčerpá svou paměť nebo kapacitu spojení. Další problém je vtom, že oba protokoly jsou mimořádně komplexní. Kombinují v sobě technologii distribuovaného objektu s bezpečnostními funkcemi sítě a řízením životního cyklu. Používání webových služeb je ovšem mnohem jednodušší, protože nejsou natolik sofistikované. Neznamená to však, že nemůžete vytvořit bezpečnou webovou službu. Při vytváření takové bezpečné webové služby se však musíte opřít o nějaký další standard, například o SSL (implementované webovým serverem) nebo WSSecurity a XML Encryption (které jsou implementovány programovacím rámcem). POZNÁMKA Existuje zde nebezpečí, že vývojáři budou zaplaveni vznikajícími standardy, které nejsou potřebné pro základní webové služby, nýbrž pro sofistikované aplikace webové služby. Tento model však ještě pořád představuje nejlepší kompromis mezi složitostí a jednoduchostí. Výhodou je, že architekti mohou vyvíjet inovace webových služeb (jako je například podpora transakcí), aniž by byli nuceni přistupovat ke kompromisům na základní úrovni součinnosti, kterou poskytují základní standardy webových služeb.

Výhody webových služeb Webové služby jsou zajímavé z několika hledisek. Z technologického hlediska se webové služby snaží vyřešit problémy těsně spojených technologií, jako jsou například CORBA a DCOM. Jsou to problémy jako je například průchod přes firewally, zpracování složitých transportních protokolů nižší úrovně a integrace různorodých platforem. Webové služby jsou také zajímavé z organizačního a ekonomického hlediska, protože otevírají dveře novým způsobům obchodování a integraci systémů mezi jednotlivými organizacemi. DCOM a CORBA jsou vhodné pro budování podnikových aplikací, kde software běží na stejné platformě a podobně spravované lokální síti. Nejsou však vhodné pro vytváření aplikací, které propojují jednotlivé platformy, komunikují přes Internet, a které potřebují Internet pro dosazení větší rozšiřitelnosti. Pro tyto účely jednoduše nejsou určeny. Zde tedy přicházejí webové služby, které představují další logický krok ve vývoji distribuovaných technologií založených na komponentách. Jejich největší výhody jsou následující:

Webové služby jsou jednoduché. Jejich jednoduchost spočívá v tom, že mohou být snadno podporovány širokou škálou platforem.

Webové služby jsou volně spojeny. Webová služba může rozšířit svoje rozhraní a přidat nové metody, aniž by to jakkoliv ovlivnilo klienty (pokud ovšem webová služba poskytuje staré metody a parametry).

Webové služby jsou bezstavové. Klient vznese vůči webové službě požadavek, ta mu vrátí výsledek a spojení je ukončeno. Neexistuje permanentní spojení. To umožňuje se snadno přizpůsobit mnoha klientům a k poskytování webových služeb využívat serverovou farmu. Výchozí HTTP protokol, který je používán webovými službami, je rovněž bezstavový. Je samozřejmě možné poskytnout nějaký stav pomocí dodatečných technik, jako jsou například techniky používané u webových stránek ASP. NET včetně cookies. Tyto techniky však nejsou obecně standardizovány.

Webové služby jsou přívětivé k firewallu. Firewally mohou pro technologie distribuovaných objektů představovat problém. Jediné, co přes firewally prakticky vždy projde, je HTTP provoz na portech


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

1209

80 a 443. Protože webové služby zcela standardně používají HTTP protokol, mohou bez problémů procházet přes firewally, aniž by k tomu potřebovaly změnit nějaké nastavení firewallu. POZNÁMKA Firewall je ovšem možné použít k blokování přenosu zpráv SOAP. Je to možné díky tomu, že HTTP záhlaví zprávy nějaké webové služby rozpoznává zprávy SOAP a administrátor může firewall nakonfigurovat tak, aby zablokoval přenos těchto zpráv. Pro konkrétní scénáře typu "obchodník-s-obchodníkem" je možné firewall nastavit tak, aby byl povolen přenos zpráv SOAP pouze z vybraných IP adres.

Je samozřejmé, že jednoduchost webových služeb si vybírá svou daň. Webové služby nemají všechny funkce mnohem komplexnějších technologií distribuovaných komponent. Nenajdete zde například podporu oboustranné komunikace, což značí, že webový server nemůže zpětně zavolat klienta poté, co se klient odpojil. V tomto ohledu jsou těsně spojené protokoly jako například DCOM a CORBA mnohem výkonnější než webové služby. .NET Framework ovšem nabízí novou technologii nazvanou jako remoting (vzdálené volání), která je ideální pro komunikaci mezi distribuovanými .NET aplikacemi a interní sítí. Remoting je následovníkem DCOM na platformě .NET.

KDY POUŽÍT WEBOVÉ SLUŽBY Microsoft doporučuje se zamyslet nad následujícími příklady, pokud z nějakého důvodu nevíte, zdali je vhodné použít webové služby. Potřebujete-li překročit hranice jedné platformy (například při komunikaci mezi aplikací v .NET a Javě) nebo pokud se naopak máte na tyto hranice spoléhat (například při komunikaci mezi dvěma společnostmi), má použití webových služeb velký význam. Webové služby jsou rovněž dobrou volbou, potřebujete-li použít předem vybudované funkce ASP.NET, jako je například cachování nebo různé funkce IIS (zajištění bezpečnosti prostřednictvím SSL či autentizace Windows atd.). Webové služby mají smysl i tehdy, chcete-li nechat svoji vlastní aplikaci otevřenou pro případnou budoucí integraci fukcí, které vymyslel a vytvořil někdo jiný. Pokud chcete sdílet funkcionalitu mezi dvěma aplikacemi .NET, webové služby mohou být neúměrně velké a mohou zapříčinit zbytečné přetěžování zdrojů. Chcete-li například docílit toho, aby webové aplikace měly přístup ke specifické obchodní logice, je mnohem lepší vytvořit nějakou assembly (ve formě zkompilovaného souboru DLL) a použít ji v obou aplikacích. Tímto se vyhnete přetěžování neprocesové nebo síťové komunikace, která může velmi významná. A konečně – pokud chcete distribuovat nějakou vaši funkcionalitu tak, aby se k ní dalo vzdáleně přístupovat, a pokud klient i server používají .NET Framework, možná byste raději měli zvážit použití technologie vzdáleného volání .NET (.NET remoting). Vzdálené volání vám sice neposkytuje stejnou úroveň podpory otevřených standardů jako třeba SOAP, dává vám ovšem svobodu použít různé typy komunikace, proprietární datové typy .NET, stavové objekty a rychlejší komunikaci založenou na TCP/IP. Stručně řečeno – vzdálené volání vám nabízí více funkcí a možnost zvýšit výkon řešení založených na .NET.

Vydělávání peněz s webovými službami Nová technologie je ztracena, neposkytuje-li nové příležitosti lidem, kteří se zabývají vyděláváním peněz. Webové služby přinášejí z pohledu obchodníka tyto nové možnosti:

Nové platební struktury. Uživatel webové služby si může předplatit používání této služby. Příkladem může být dodávání zpráv z Associated Press. Další možností jsou platby za prohlížení (pou-


1210

Kapitola 32 – Tvorba webových služeb žívá se také pojem mikroplatby). Příslušný poskytovatel takové služby může provádět účtování při každém požadavku na využití služby.

Interakci a spolupráci v reálném čase. V dnešní době jsou data obvykle zkopírována a používána lokálně. Webové služby ovšem umožňují požádat v reálném čase o nějaká vzdálená data. Příkladem může být posílání počítačových her z internetového obchodu. Internetový obchod může být dále propojen se skladem a poskytovat aktuální počet položek na skladě. To umožňuje takovému internetovému obchodu poskytovat lepší služby. Určitě vás nevyvede z míry nic více než situace, kdy si něco objednáte přes Internet, zaplatíte, a na druhý den se dozvíte, že zboží, o které máte zájem, není momentálně skladem (nebo je rovnou vyprodáno).

Agregované služby. Vaše webová služba se může přičlenit k jiným webovým službám či k různým odvozeným komponentám, které jsou vystaveny pomocí proprietárních protokolů atd. Typickým příkladem agregované služby je porovnávací služba, která vám poskytuje informace o nejlepších cenách nějakého zboží. Dalším příkladem může být služba, která obsahuje několik souvisejících služeb. Představte si například, že se stěhujete do nového domu. Někdo by vám mohl poskytnout službu, která aktualizuje vaší poštovní adresu, vypátrá stěhovací společnost, která přestěhuje váš majetek, zobrazí mapu vašeho nového okolí atd.

Webové služby v žádném případě nejsou jedinou technologií, která dokáže poskytovat tato řešení. Dnes existuje mnoho různých řešení, které jsou založeny na použití existujících technologiích. Webové služby ovšem používají všeobecně respektované standardy, čímž mají potřebnou sílu k tomu, aby se všechny tyto typy služeb mohly stát široce dostupnými.

Standardy používané webovými službami Klíčem k úspěchu webových služeb je to, že jsou založeny na otevřených standardech, a že za těmito standardy stojí velké společnosti, jako je Microsoft, IBM a Sun. Otevřené standardy však automaticky nevedou ke spolupráci. Společnosti nejprve musí všechny tyto standardy implementovat, a to kompatibilním způsobem. Při budování webových služeb se používá několik specifikací. Na obrázku 32-1 vidíte standardy, které v současnosti používají webové služby.

Obrázek 32-1. Standardy, které dnes používají webové služby.


ASP.NET 2.0 a C# – tvorba dynamických stránek profesionálně

1211

O protokolech SOAP, WSDL a UDDI, které podporují webové služby, se dozvíte mnohem více v další kapitole. Než však začnete budovat a používat webové služby, je důležité alespoň rámcově pochopit úlohu, kterou tyto standardy sehrávají. Tabulka 32-2 uvádí stručný přehled těchto standardů, přičemž v několika dalších sekcích této kapitoly si je popíšeme o něco podrobněji. Podstatně podrobněji se jimi ovšem budeme zabývat až v další kapitole.

Tabulka 32-2. Standardy webových služeb. Standard

Popis

WSDL

Používá se na vytvoření definice rozhraní webové služby. WSDL dokument oznámí klientovi, které metody jsou ve webové službě přítomny, které parametry a návratové hodnoty jednotlivé metody používají, a jakým způsobem s nimi má komunikovat.

SOAP

Formát zprávy, který je použit pro kódování informací (jako jsou například hodnoty dat) před jejich zasláním webové službě.

HTTP

Prostřednictvím tohoto protokolu probíhá veškerá komunikace webových služeb. SOAP zprávy jsou například zasílány přes HTTP kanály.

DISCO

Používá se k vytvoření tzv. discovery dokumentů, které poskytují odkazy na více koncových bodů webové služby. Tento standard je specifický pro Microsoft a posléze bude nahrazen podobným standardem pojmenovaným jako WS-Inspection.

UDDI

Standard pro vytváření obchodních rejstříků, které registrují společnosti a webové služby, které nabízejí, a také odpovídající URL adresy jejich WSDL kontaktů.

Hledání webových služeb V jednoduchých aplikacích možná budete již předem znát URL webové služby, kterou chcete použít. V tom případě ji můžete zakódovat, nebo ji umístit do konfiguračního souboru. Není již potřeba provést žádné další kroky. Za jiných okolností možná budete chtít v běhovém režimu hledat webovou službu, kterou potřebujete. Můžete například použít standardizovanou službu, která je poskytována různými společnostmi poskytujícími hosting a není vždy k dispozici na stejném URL. Nebo možná pouze budete potřebovat snadný způsob, jak najít všechny webové služby poskytované obchodním partnerem. V obou případech musíte použít discovery (zpřístupnění), pomocí něhož programově lokalizujete webové služby, které potřebujete. Zpřístupnění webové služby vám usnadní dvě specifikace:

DISCO (což je zkratka ze slova discovery). Standard DISCO vytváří jediný soubor, který seskupuje seznam příbuzných webových služeb. Společnost může na svém serveru zveřejnit soubor DISCO, který obsahuje odkazy na všechny poskytované webové služby. Klienti, kteří chtějí najít všechny dostupné webové služby, musí o tento soubor pouze požádat. Tento postup je užitečný, když klient už zná společnost, která webové služby nabízí a chce zjistit, které služby jsou zpřístupněny, a také najít odkazy k podrobnějším informacím o těchto službách. Vyhledávání webových služeb přes Internet není sice moc efektivní, nicméně se to může hodit u lokálních sítí, kde se klient připojí na server a hned vidí, které služby jsou k dispozici a kde.

UDDI (Universal Description, Discovery, and Integration). UDDI je centralizovaný adresář, kam různé společnosti vkládají webové služby, které nabízejí klientům. Je to místo, kde může potenci-


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.