Tải bản đầy đủ (.pdf) (1,185 trang)

2006 apress beginning asp net 2 0 in c sharp 2005 from n

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (38.28 MB, 1,185 trang )


MacDonald.book Page i Friday, December 30, 2005 12:59 PM

Beginning ASP.NET 2.0
in C# 2005
From Novice to Professional

■■■

Matthew MacDonald


MacDonald.book Page ii Friday, December 30, 2005 12:59 PM

Beginning ASP.NET 2.0 in C# 2005: From Novice to Professional
Copyright © 2006 by Matthew MacDonald
All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording, or by any information storage or retrieval
system, without the prior written permission of the copyright owner and the publisher.
ISBN-13 (pbk): 978-1-59059-572-5
ISBN-10 (pbk): 1-59059-572-6
Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1
Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence
of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark
owner, with no intention of infringement of the trademark.
Contributor of Chapter 27: Julian Templeman
Lead Editor: Jonathan Hassell
Technical Reviewer: Ronald Landers
Editorial Board: Steve Anglin, Dan Appleman, Ewan Buckingham, Gary Cornell, Jason Gilmore, Jonathan
Hassell, Chris Mills, Dominic Shakeshaft, Jim Sumser
Project Manager and Production Director: Grace Wong


Copy Edit Manager: Nicole LeClerc
Copy Editor: Kim Wimpsett
Assistant Production Director: Kari Brooks-Copony
Production Editor: Kelly Winquist
Compositor: Pat Christenson
Proofreader: Nancy Riddiough
Indexer: Michael Brinkman
Artist: Kinetic Publishing Services, LLC
Cover Designer: Kurt Krames
Manufacturing Director: Tom Debolski
Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor,
New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail `cUVcd_j1dacZ_XVcdS^T`^, or
visit Yeea+ hhhdacZ_XVc`_]Z_VT`^.
For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley, CA
94710. Phone 510-549-5930, fax 510-549-5939, e-mail Z_W`1RacVddT`^, or visit Yeea+ hhhRacVddT`^.
The information in this book is distributed on an “as is” basis, without warranty. Although every precaution
has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to
any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly
by the information contained in this work.
The source code for this book is available to readers at Yeea+ hhhRacVddT`^ in the Source Code section.
You will need to answer questions pertaining to this book in order to successfully download the code.


MacDonald.book Page iii Friday, December 30, 2005 12:59 PM

For my loving wife, Faria


MacDonald.book Page iv Friday, December 30, 2005 12:59 PM


Contents at a Glance
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvi
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxviii
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix

PART 1

■■■

■CHAPTER 1

Introducing the .NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Learning the C# Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Types, Objects, and Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Introducing Visual Studio 2005. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

■CHAPTER 2
■CHAPTER 3
■CHAPTER 4

PART 2

■■■

■CHAPTER 5
■CHAPTER 6
■CHAPTER 7
■CHAPTER 8
■CHAPTER 9

■CHAPTER 10
■CHAPTER 11
■CHAPTER 12

PART 3

■CHAPTER 14
■CHAPTER 15
■CHAPTER 16
■CHAPTER 17

Developing ASP.NET Applications

Web Form Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Web Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Tracing, Logging, and Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . 219
Validation and Rich Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
State Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Master Pages and Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
Website Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
Deploying ASP.NET Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427

■■■

■CHAPTER 13

iv

Introducing .NET


Working with Data

ADO.NET Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Data Binding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
The Data Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
Files and Streams. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655


MacDonald.book Page v Friday, December 30, 2005 12:59 PM

PART 4

■■■

■CHAPTER 18
■CHAPTER 19
■CHAPTER 20

PART 5

■CHAPTER 22
■CHAPTER 23

PART 6

Security Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
Membership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739
Profiles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 781


■■■

■CHAPTER 21

■CHAPTER 25
■CHAPTER 26
■CHAPTER 27

Web Services

Web Services Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813
Creating Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831
Enhancing Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869

■■■

■CHAPTER 24

Website Security

Advanced ASP.NET

Component-Based Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 903
Custom Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 937
Caching and Performance Tuning . . . . . . . . . . . . . . . . . . . . . . . . . . . . 985
Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029

■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1063

v



MacDonald.book Page vi Friday, December 30, 2005 12:59 PM


MacDonald.book Page vii Friday, December 30, 2005 12:59 PM

Contents
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvi
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxviii
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix

PART 1
■CHAPTER 1

■■■

Introducing .NET

Introducing the .NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

The Evolution of Web Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
HTML and HTML Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Server-Side Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Client-Side Programming. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
The Problems with ASP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
The .NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

C#, VB .NET, and the .NET Languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
The Intermediate Language. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Other .NET Languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
The Common Language Runtime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
The .NET Class Library. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
.NET 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
C# 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
ASP.NET 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

vii


MacDonald.book Page viii Friday, December 30, 2005 12:59 PM

viii

■C O N T E N T S

■CHAPTER 2

■CHAPTER 3

Learning the C# Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

The .NET Languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

C# Language Basics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Case Sensitivity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Commenting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Line Termination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Block Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Variables and Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Assignment and Initializers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Strings and Escaped Characters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Enumerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Variable Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Advanced Math . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Type Conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Object-Based Manipulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The String Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The DateTime and TimeSpan Classes . . . . . . . . . . . . . . . . . . . . . . . . .
The Array Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Conditional Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The if Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The switch Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Loop Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The for Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The foreach Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The while Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Method Overloading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Delegates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


23
24
24
25
26
26
27
29
30
31
33
35
36
36
39
40
42
44
44
45
46
47
48
49
50
51
53
53
54
57


Types, Objects, and Namespaces. . . . . . . . . . . . . . . . . . . . . . . . . .

59

The Basics About Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Static Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
A Simple Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62


MacDonald.book Page ix Friday, December 30, 2005 12:59 PM

■C O N T E N T S

■CHAPTER 4

Building a Basic Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Live Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adding Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adding a Basic Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adding a Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adding a Basic Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Testing the Product Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Value Types and Reference Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Assignment Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Equality Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Passing Parameters by Reference and by Value . . . . . . . . . . . . . . . .
Reviewing .NET Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Understanding Namespaces and Assemblies . . . . . . . . . . . . . . . . . . . . . . .
Using Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Importing Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Advanced Class Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Static Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Casting Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Partial Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Generics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62
63
65
66
67
68
70
73
73
74
74
76
78
79
80
81
82
83
84
85

87
89
90

Introducing Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . .

91

The Promise of Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Creating a Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
The Solution Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Designing a Web Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Adding Web Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
The Properties Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Adding Ordinary HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
HTML Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Writing Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Adding Event Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
IntelliSense and Outlining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Assembly References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

ix


MacDonald.book Page x Friday, December 30, 2005 12:59 PM

x

■C O N T E N T S


Visual Studio Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Single-Step Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Variable Watches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

PART 2
■CHAPTER 5

■■■

115
116
120
121

Developing ASP.NET Applications

Web Form Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

125

The Anatomy of an ASP.NET Application . . . . . . . . . . . . . . . . . . . . . . . . . .
ASP.NET File Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ASP.NET Application Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Application Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Simple One-Page Applet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The ASP Solution—and Its Problems . . . . . . . . . . . . . . . . . . . . . . . .
The ASP.NET Solution: Server Controls . . . . . . . . . . . . . . . . . . . . . . .
HTML Server Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
View State. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

The HTML Control Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Event Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Behind the Scenes with the CurrencyConverter . . . . . . . . . . . . . . .
Improving the Currency Converter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adding Multiple Currencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Storing Information in the List. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adding Linked Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Setting Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Deeper Look at HTML Control Classes . . . . . . . . . . . . . . . . . . . . . . . . . .
HTML Control Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Advanced Events with the HtmlInputImage Control . . . . . . . . . . . .
The HtmlControl Base Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The HtmlContainerControl Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The HtmlInputControl Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Page Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Controls Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The HttpRequest Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The HttpResponse Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The ServerUtility Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

125
127
128
129
130
133
133
134
136
137

142
143
146
146
148
149
151
152
153
154
156
157
158
158
159
160
161
162


MacDonald.book Page xi Friday, December 30, 2005 12:59 PM

■C O N T E N T S

■CHAPTER 6

■CHAPTER 7

ASP.NET Configuration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The web.config File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Nested Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Storing Custom Settings in the web.config File . . . . . . . . . . . . . . . .
Modifying web.config Settings Programmatically . . . . . . . . . . . . . .
The Website Administration Tool (WAT) . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

165
165
166
167
171
172
174

Web Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

175

Stepping Up to Web Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Basic Web Control Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Web Control Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Web Control Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The WebControl Base Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Units . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Enumerated Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Colors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Focus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Default Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
List Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Multiple-Select List Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The BulletedList Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
AutoPostBack and Web Control Events . . . . . . . . . . . . . . . . . . . . . . . . . . . .
How Postback Events Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Page Life Cycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Simple Web Page Applet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Improving the Greeting Card Applet . . . . . . . . . . . . . . . . . . . . . . . . . .
Generating the Cards Automatically. . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

175
176
177
179
179
181
182
182
183
185
185
186
187
190
191
197
201
202
206

212
214
217

Tracing, Logging, and Error Handling . . . . . . . . . . . . . . . . . . . .

219

Common Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Exception Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Exception Chain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

219
221
222
224

xi


MacDonald.book Page xii Friday, December 30, 2005 12:59 PM

xii

■C O N T E N T S

■CHAPTER 8

Handling Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Catching Specific Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Nested Exception Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exception Handling in Action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mastering Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Throwing Your Own Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Logging Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using the EventLog Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Custom Logs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Retrieving Log Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Error Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Error Modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Custom Error Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Specific Custom Error Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Page Tracing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Enabling Tracing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Tracing Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Writing Trace Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Reading Trace Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Application-Level Tracing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

225
226
227
229
231
232
236
239
241

243
246
248
249
250
252
253
254
259
263
264
266

Validation and Rich Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

267

Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Validation Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Validation Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Client-Side Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Validator Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Simple Validation Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Other Display Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Manual Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Understanding Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Literals and Metacharacters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Finding a Regular Expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Validated Customer Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Validation Groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Rich Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Calendar Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The AdRotator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

267
268
269
270
270
271
274
276
278
278
279
282
288
290
291
299


MacDonald.book Page xiii Friday, December 30, 2005 12:59 PM

■C O N T E N T S

Pages with Multiple Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The MultiView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Wizard Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


■CHAPTER 9

■CHAPTER 10

State Management

302
304
310
316

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317

The Problem of State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A View State Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Making View Sate Secure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Retaining Member Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Storing Custom Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Transferring Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Cross-Page Posting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Query String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Custom Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Cookie Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Session Tracking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Session State Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Session State Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Cookieless . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Timeout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Application State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
An Overview of State Management Choices . . . . . . . . . . . . . . . . . . . . . . .
The Global.asax Application File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Application Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

317
318
318
320
322
324
325
325
330
334
336
337
338
339
340
344
344
347
348
352
354

356
357
358

Master Pages and Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

359

Master Page Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Simple Master Page and Content Page . . . . . . . . . . . . . . . . . . . . .
How Master Pages and Content Pages Are Connected . . . . . . . . .
A Master Page with Multiple Content Regions . . . . . . . . . . . . . . . . .
Default Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Master Pages and Relative Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . .

359
360
364
366
369
370

xiii


MacDonald.book Page xiv Friday, December 30, 2005 12:59 PM

xiv

■C O N T E N T S


■CHAPTER 11

■CHAPTER 12

Advanced Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table-Based Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Code in a Master Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interacting with a Master Page Programmatically. . . . . . . . . . . . . .
Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
How Themes Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Applying a Simple Theme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Handling Theme Conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating Multiple Skins for the Same Control . . . . . . . . . . . . . . . . .
Skins with Templates and Images . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

371
372
375
375
377
378
380
381
383
384
387

Website Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


389

Site Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Defining a Site Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Seeing a Simple Site Map in Action . . . . . . . . . . . . . . . . . . . . . . . . . .
Binding an Ordinary Page to a Site Map . . . . . . . . . . . . . . . . . . . . . .
Binding a Master Page to a Site Map . . . . . . . . . . . . . . . . . . . . . . . .
Binding Portions of a SiteMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Navigating Programmatically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mapping URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The SiteMapPath Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Customizing the SiteMapPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using SiteMapPath Styles and Templates . . . . . . . . . . . . . . . . . . . .
Adding Custom Site Map Information . . . . . . . . . . . . . . . . . . . . . . . .
The TreeView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TreeView Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TreeView Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Menu Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Menu Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Menu Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

389
391
395
396
397
399
405

407
409
410
410
412
413
414
415
420
421
423
425

Deploying ASP.NET Applications

. . . . . . . . . . . . . . . . . . . . . . . . . 427

ASP.NET Applications and the Web Server . . . . . . . . . . . . . . . . . . . . . . . .
How Web Servers Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Web Application URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Web Farms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

427
427
429
431


MacDonald.book Page xv Friday, December 30, 2005 12:59 PM


■C O N T E N T S

IIS (Internet Information Services) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Installing IIS 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Installing IIS 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Registering the ASP.NET File Mappings . . . . . . . . . . . . . . . . . . . . . .
Verifying That ASP.NET Is Correctly Installed . . . . . . . . . . . . . . . . . .
Managing Websites with IIS Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Virtual Directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Virtual Directories and Web Applications . . . . . . . . . . . . . . . . . . . . .
Configuring an Existing Virtual Directory . . . . . . . . . . . . . . . . . . . . . .
Adding a Virtual Directory to Your Neighborhood . . . . . . . . . . . . . .
Deploying a Simple Site. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Web Applications and Components . . . . . . . . . . . . . . . . . . . . . . . . . .
Other Configuration Steps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The ASPNET Account . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Code Compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Deploying with Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Virtual Directory for a New Project . . . . . . . . . . . . . . . . .
Copying a Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Publishing a Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

PART 3

■■■

■CHAPTER 13

433

433
435
436
438
439
439
442
444
451
453
454
455
456
459
460
460
463
466
468

Working with Data

ADO.NET Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

471

ADO.NET and Data Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Role of the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Database Access in the Internet World . . . . . . . . . . . . . . . . . . . . . . .
Introducing ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

SQL Server 2005 Express Edition . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Browsing and Modifying Databases in Visual Studio . . . . . . . . . . .
SQL Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running Queries in Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Select Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The SQL Update Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The SQL Insert Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The SQL Delete Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ADO.NET Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Data Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Data Provider Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

471
472
473
474
475
476
478
479
481
485
486
487
487
489
490

xv



MacDonald.book Page xvi Friday, December 30, 2005 12:59 PM

xvi

■C O N T E N T S

■CHAPTER 14

Direct Data Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Importing the Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Connection String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Windows Authentication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Connection String Tips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Making the Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Defining a Select Command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using a Command with a DataReader . . . . . . . . . . . . . . . . . . . . . . . .
Putting It All Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Filling the List Box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Updating Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Enhancing the Author Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating More Robust Commands . . . . . . . . . . . . . . . . . . . . . . . . . . .
Disconnected Data Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Selecting Disconnected Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Selecting Multiple Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Modifying Disconnected Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adding Information to a DataSet. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Updating Disconnected Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The CommandBuilder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Updating a DataTable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Controlling Updates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Disconnected Update Example . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Concurrency Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Concurrency Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

492
493
493
495
495
496
497
500
501
502
503
507
507
512
518
519
521
526
527
528
528
529
530

531
533
535
538

Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

539

Introducing Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Types of ASP.NET Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
How Data Binding Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Single-Value Data Binding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Simple Data Binding Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Simple Data Binding with Properties . . . . . . . . . . . . . . . . . . . . . . . . .
Problems with Single-Value Data Binding . . . . . . . . . . . . . . . . . . . .
Using Code Instead of Simple Data Binding . . . . . . . . . . . . . . . . . . .

539
540
540
541
542
545
546
547


MacDonald.book Page xvii Friday, December 30, 2005 12:59 PM


■C O N T E N T S

■CHAPTER 15

Repeated-Value Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Data Binding with Simple List Controls . . . . . . . . . . . . . . . . . . . . . . .
A Simple List Binding Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Generic Collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Multiple Binding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Data Binding and View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Data Binding with a Dictionary Collection . . . . . . . . . . . . . . . . . . . . .
Using the DataValueField Property . . . . . . . . . . . . . . . . . . . . . . . . . . .
Data Binding with ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Record Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Data Source Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Page Life Cycle with Data Binding . . . . . . . . . . . . . . . . . . . . . . .
The SqlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Selecting Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parameterized Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Handling Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Updating Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

547
548
549
550
551
553
553

555
557
559
564
565
566
568
570
574
574
578

The Data Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

581

The GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Automatically Generating Columns . . . . . . . . . . . . . . . . . . . . . . . . . .
Defining Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Formatting the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Formatting Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Formatting-Specific Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Selecting a GridView Row . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adding a Select Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using Selection to Create a Master-Details Form . . . . . . . . . . . . . .
Editing with the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sorting and Paging the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Paging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Using GridView Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using Multiple Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Editing Templates in Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . .
Handling Events in a Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Editing with a Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

581
582
584
588
588
590
593
595
596
598
600
603
603
606
608
610
611
612
613

xvii


MacDonald.book Page xviii Friday, December 30, 2005 12:59 PM


xviii

■C O N T E N T S

The DetailsView and FormView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The DetailsView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The FormView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

■CHAPTER 16

■CHAPTER 17

Files and Streams

618
618
621
623

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625

Files and Web Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
File System Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Directory and File Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The DirectoryInfo and FileInfo Classes . . . . . . . . . . . . . . . . . . . . . . .
The DriveInfo Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Sample File Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Reading and Writing with Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Text Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Binary Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Shortcuts for Reading and Writing Files . . . . . . . . . . . . . . . . . . . . . .
A Simple Guest Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Allowing File Uploads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dissecting the Code… . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

625
626
627
633
635
636
640
640
642
643
645
650
653
654

XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

655

XML’s Hidden Role in .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Configuration Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ADO.NET Data Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Anywhere Miscellaneous Data Is Stored . . . . . . . . . . . . . . . . . . . . . .
XML Explained . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Improving the List with XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
XML Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The XML Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The XML TextWriter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The XML Text Reader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Working with XML Documents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Reading an XML Document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Searching an XML Document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

655
655
656
656
656
656
659
660
662
663
663
664
666
673
677
680



MacDonald.book Page xix Friday, December 30, 2005 12:59 PM

■C O N T E N T S

XML Validation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
XML Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
XSD Documents. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Validating an XML File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
XML Display and Transforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Xml Web Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
XML Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Nonhierarchical Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Hierarchical Binding with the TreeView. . . . . . . . . . . . . . . . . . . . . . .
Binding to XML Content from Other Sources . . . . . . . . . . . . . . . . . .
XML in ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Accessing a DataSet As XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Accessing XML Through the DataSet . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

PART 4

■■■

■CHAPTER 18

681
681
683

684
687
690
692
692
695
697
698
699
701
702

Website Security

Security Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

707

Determining Security Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Restricted File Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Security Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The ASP.NET Security Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Security Strategies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Certificates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Secure Sockets Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Web.config Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Authorization Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The WAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Login Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Windows Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IIS Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Web.config Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Windows Authentication Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Impersonation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programmatic Impersonation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

707
708
708
709
712
713
715
716
718
719
722
726
729
730
732
734
735
737
738

xix



MacDonald.book Page xx Friday, December 30, 2005 12:59 PM

xx

■C O N T E N T S

■CHAPTER 19

■CHAPTER 20

Membership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

739

The Membership Data Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Membership with SQL Server 2005 Express . . . . . . . . . . . . . . . . . .
Configuring the Membership Provider . . . . . . . . . . . . . . . . . . . . . . . .
Manually Creating the Membership Tables . . . . . . . . . . . . . . . . . . .
Creating Users with the WAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Membership and MembershipUser Classes . . . . . . . . . . . . . . .
Authentication with Membership . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Disabled Accounts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Security Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Login Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The CreateUserWizard Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The PasswordRecovery Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Role-Based Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating and Assigning Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Restricting Access Based on Roles . . . . . . . . . . . . . . . . . . . . . . . . . .

The LoginView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

740
741
744
749
751
753
757
758
759
760
766
770
773
773
777
778
780

Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

781

Understanding Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Profile Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
How Profiles Store Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using the SqlProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Enabling Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Profiles with SQL Server 2005 Express Edition . . . . . . . . . . . . . . . .
Configuring the Profile Provider to Use a Different Database . . . .
Manually Creating the Profile Tables . . . . . . . . . . . . . . . . . . . . . . . . .
The Profile Databases. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Defining Profile Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using Profile Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Profile Serialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Profile Groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Profiles and Custom Data Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Profile API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Anonymous Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

782
782
783
785
786
787
787
789
790
793
794
796
798
799
804
807
809



MacDonald.book Page xxi Friday, December 30, 2005 12:59 PM

■C O N T E N T S

PART 5

■■■

■CHAPTER 21

■CHAPTER 22

Web Services

Web Services Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

813

Internet Programming Then and Now . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Era of Monolithic Applications . . . . . . . . . . . . . . . . . . . . . . . . . . .
Components and the COM Revolution . . . . . . . . . . . . . . . . . . . . . . . .
Web Services and the Programmable Web . . . . . . . . . . . . . . . . . . .
When Web Services Make Sense . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Open-Standards Plumbing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Web Services Description Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The <definitions> Element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The <types> Element. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The <message> Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

The Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The <binding> Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The <service> Element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Sample SOAP Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Communicating with a Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Web Service Discovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The DISCO Standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Universal Description, Discovery, and Integration . . . . . . . . . . . . . .
WS-Interoperability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

813
813
814
815
816
816
817
818
818
820
821
821
823
824
824
825
827
827

828
829
830

Creating Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

831

Web Service Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Configuring a Web Service Project . . . . . . . . . . . . . . . . . . . . . . . . . . .
The StockQuote Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Understanding the StockQuote Service . . . . . . . . . . . . . . . . . . . . . . .
Web Services with Code-Behind . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The ASP.NET Intrinsic Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Documenting Your Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Descriptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The XML Namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Conformance Claims . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

831
832
834
835
836
837
838
839
840
840


xxi


MacDonald.book Page xxii Friday, December 30, 2005 12:59 PM

xxii

■C O N T E N T S

■CHAPTER 23

Testing Your Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Web Service Test Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Service Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Method Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Testing a Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Web Service Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The StockQuote Service with a Data Object . . . . . . . . . . . . . . . . . . .
Consuming a Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Configuring a Web Service Client in Visual Studio. . . . . . . . . . . . . .
The Role of the Proxy Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Web Reference in Visual Studio . . . . . . . . . . . . . . . . . . .
Creating a Proxy with WSDL.exe . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dissecting the Proxy Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dynamic Web Service URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using the Proxy Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Waiting and Timeouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Web Service Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Connecting Through a Proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


842
842
843
845
845
847
848
853
853
854
855
857
859
862
863
864
865
866
867

Enhancing Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

869

State Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The StockQuote Service with State Management . . . . . . . . . . . . . .
Consuming a Stateful Web Service . . . . . . . . . . . . . . . . . . . . . . . . . .
Web Service Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Windows Authentication with a Web Service . . . . . . . . . . . . . . . . . .

Ticket-Based Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ticket-Based Authentication with SOAP Headers . . . . . . . . . . . . . .
Using SOAP Headers in the Client . . . . . . . . . . . . . . . . . . . . . . . . . . .
Web Service Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
An Example with TerraService . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adding the Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Testing the Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Searching for More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Displaying a Tile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Windows Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

869
870
872
877
878
882
885
888
888
891
892
893
895
896
898
900



MacDonald.book Page xxiii Friday, December 30, 2005 12:59 PM

■C O N T E N T S

PART 6

■■■

■CHAPTER 24

■CHAPTER 25

Advanced ASP.NET

Component-Based Programming . . . . . . . . . . . . . . . . . . . . . . . . .

903

Why Use Components? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Component Jargon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Three-Tier Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Encapsulation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Data Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Business Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Simple Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Component Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Classes and Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adding a Reference to the Component. . . . . . . . . . . . . . . . . . . . . . .
Using the Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Properties and State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

A Stateful Account Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Stateless AccountUtility Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Database Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Simple Database Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Consuming the Database Component . . . . . . . . . . . . . . . . . . . . . . . .
Enhancing the Component with Error Handling . . . . . . . . . . . . . . . .
Enhancing the Component with Aggregate Information . . . . . . . . .
The ObjectDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Making Classes the Object Data Source Can Understand . . . . . . .
Selecting Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using Method Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Updating Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

903
905
905
907
907
907
908
908
910
912
914
916
917
918
919
920

924
927
928
930
930
931
932
933
936

Custom Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

937

User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Simple User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Independent User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Integrated User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
User Control Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using Events with Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
User Control Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

937
939
941
943
946
949
952


xxiii


MacDonald.book Page xxiv Friday, December 30, 2005 12:59 PM

xxiv

■C O N T E N T S

■CHAPTER 26

Derived Custom Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Simple Derived Control . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using a Derived Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Custom Control Library . . . . . . . . . . . . . . . . . . . . . . . . . . .
Custom Controls and Default Values . . . . . . . . . . . . . . . . . . . . . . . . .
Changing Control Rendering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Web Control from Scratch . . . . . . . . . . . . . . . . . . . . . . . .
Maintaining State Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Design-Time Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Composite Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Custom Control Events and Postbacks . . . . . . . . . . . . . . . . . . . . . . .
Dynamic Graphics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Basic Drawing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Drawing Custom Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Placing Custom Images Inside Web Pages . . . . . . . . . . . . . . . . . . . .
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

953
953

955
957
958
961
964
967
969
971
973
977
978
980
981
983

Caching and Performance Tuning . . . . . . . . . . . . . . . . . . . . . . . .

985

Designing for Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 986
ASP.NET Code Compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 986
Server Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 986
ADO.NET Database Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 987
Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 989
Profiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 989
Stress Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 990
Performance Counters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 990
Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 994
Output Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 995
Caching on the Client Side. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997

Caching and the Query String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997
Caching with Specific Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . 998
A Multiple Caching Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 999
Custom Caching Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001
Fragment Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002
Cache Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1003
Output Caching in a Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . 1004


×