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

Pro aspnet in c sha

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 (14.32 MB, 1,288 trang )

4967FM.qxd

8/16/05

1:14 PM

Page i

Pro ASP.NET 2.0
in C# 2005

Matthew MacDonald and Mario Szpuszta,
Revising Authors
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


4967FM.qxd

10/19/05

4:48 PM

Page ii

Pro ASP.NET 2.0 in C# 2005
Copyright © 2005 by Matthew MacDonald and Mario Szpuszta
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-496-4
ISBN-10 (pbk): 1-59059-496-7
Printed and bound in the United States of America 9 8 7 6 5 4 3 2
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.
Lead Editor: Ewan Buckingham
Technical Reviewers: Robert Lair, Jason Lefebvre
Editorial Board: Steve Anglin, Dan Appleman, Ewan Buckingham, Gary Cornell, Tony Davis,
Jason Gilmore, Jonathan Hassell, Chris Mills, Dominic Shakeshaft, Jim Sumser
Associate Publisher: Grace Wong
Project Manager: Kylie Johnston
Copy Edit Manager: Nicole LeClerc
Copy Editor: Kim Wimpsett
Assistant Production Director: Kari Brooks-Copony
Production Editor: Laura Cheu
Compositor: Dina Quan
Proofreaders: Liz Welch and Lori Bring
Indexer: Broccoli Information Management
Artist: Kinetic Publishing Services, LLC
Interior Designer: Diana Van Winkle
Cover Designer: Kurt Krames
Manufacturing Manager: 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 , or
visit .
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 , or visit .
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 in the Source Code section.


4967FM.qxd

8/16/05

1:14 PM

Page iii


4967FM.qxd

8/16/05

1:14 PM

Page iv

Contents at a Glance

About the Revising Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxv
About the Technical Reviewers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix

PART 1


Core Concepts

■CHAPTER 1

Introducing ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

■CHAPTER 2

Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

■CHAPTER 3

Web Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

■CHAPTER 4

Server Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

■CHAPTER 5

ASP.NET Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151

■CHAPTER 6

State Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

PART 2

■■■


Data Access

■CHAPTER 7

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

■CHAPTER 8

Data Components and the DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265

■CHAPTER 9

Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295

■CHAPTER 10

Rich Data Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335

■CHAPTER 11

Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391

■CHAPTER 12

XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425

■CHAPTER 13

Files and Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471


PART 3

iv

■■■

■■■

Building ASP.NET Websites

■CHAPTER 14

User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505

■CHAPTER 15

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

■CHAPTER 16

Website Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555

■CHAPTER 17

Resources and Localization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599

■CHAPTER 18

Website Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619



4967FM.qxd

8/16/05

1:14 PM

PART 4

Page v

■■■

Security

■CHAPTER 19

The ASP.NET Security Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667

■CHAPTER 20

Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689

■CHAPTER 21

Membership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709

■CHAPTER 22

Windows Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751


■CHAPTER 23

Authorization and Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777

■CHAPTER 24

Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 803

■CHAPTER 25

Cryptography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 839

■CHAPTER 26

Custom Membership Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 867

PART 5

■■■

Advanced User Interface

■CHAPTER 27

Custom Server Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 899

■CHAPTER 28

Design-Time Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 941


■CHAPTER 29

JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975

■CHAPTER 30

Dynamic Graphics and GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011

■CHAPTER 31

Portals with Web Part Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1043

PART 6

■■■

Web Services

■CHAPTER 32

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

■CHAPTER 33

Web Service Standards and Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . 1129

■CHAPTER 34

Advanced Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175


■INDEX

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1211

v


4967FM.qxd

8/16/05

1:14 PM

Page vi


4967FM.qxd

8/16/05

1:14 PM

Page vii

Contents

About the Revising Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxv
About the Technical Reviewers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix


PART 1
■CHAPTER 1

■■■

Core Concepts

Introducing ASP.NET

............................................3

The Evolution of Web Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
The Development World Before ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
What’s Wrong with Classic ASP? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
ASP.NET 1.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Seven Important Facts About ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Fact 1: ASP.NET Is Integrated with the .NET Framework . . . . . . . . . . . . . . . . . . . . 7
Fact 2: ASP.NET Is Compiled, Not Interpreted . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Fact 3: ASP.NET Is Multilanguage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Fact 4: ASP.NET Runs Inside the Common Language Runtime . . . . . . . . . . . . . . 11
Fact 5: ASP.NET Is Object-Oriented . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Fact 6: ASP.NET Is Multidevice and Multibrowser . . . . . . . . . . . . . . . . . . . . . . . . 14
Fact 7: ASP.NET Is Easy to Deploy and Configure . . . . . . . . . . . . . . . . . . . . . . . . 14
ASP.NET 2.0: The Story Continues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
C# 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
ASP.NET 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22


■CHAPTER 2

Visual Studio 2005

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

The .NET Development Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
The Compiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
The Visual Studio IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Websites in Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Projectless Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Migrating a Visual Studio .NET Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Designing a Web Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
The Visual Studio IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Solution Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Document Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Toolbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
vii

6f07122590a6750721a6f2c93fcdacb4


4967FM.qxd

viii

8/16/05

1:14 PM


Page viii

■CONTENTS

Error List and Task List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Server Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
The Code Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Adding Assembly References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
IntelliSense and Outlining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
The Coding Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
How Code-Behind Files Are Connected to Pages . . . . . . . . . . . . . . . . . . . . . . . . 49
How Control Tags Are Connected to Page Variables . . . . . . . . . . . . . . . . . . . . . . 50
How Events Are Connected to Event Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Visual Studio Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Single-Step Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Advanced Breakpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Variable Watches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Visual Studio Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
ASP.NET Development Helper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

■CHAPTER 3

Web Forms

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

Page Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
HTML Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Dynamic Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

The ASP.NET Event Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Automatic Postbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
XHTML Compliance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Web Forms Processing Stages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Page Framework Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
User Code Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Event Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Automatic Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Cleanup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
A Page Flow Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
The Page As a Control Container . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Showing the Control Tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
The Page Header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Dynamic Control Creation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
The Page Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Session, Application, and Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
User . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Trace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Accessing the HTTP Context in Another Class . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101


4967FM.qxd

8/16/05


1:14 PM

Page ix

■CONTENTS

■CHAPTER 4

Server Controls

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

Types of Server Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
The Server Control Hierarchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
HTML Server Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
The HtmlControl Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
The HtmlContainerControl Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
The HtmlInputControl Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
The HTML Server Control Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Setting Style Attributes and Other Properties . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Programmatically Creating Server Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Handling Server-Side Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Web Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
The WebControl Base Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Basic Web Control Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Units . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Enumerated Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Colors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

Focus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
The Default Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Scrollable Panels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Handling Web Control Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
The List Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
The Selectable List Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
The BulletedList Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Input Validation Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
The Validation Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
The Validation Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
The BaseValidator Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
The RequiredFieldValidator Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
The RangeValidator Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
The CompareValidator Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
The RegularExpressionValidator Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
The CustomValidator Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
The ValidationSummary Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Using the Validators Programmatically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Validation Groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
The ASP.NET Rich Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
The AdRotator Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
The Calendar Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

■CHAPTER 5

ASP.NET Applications

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151


Anatomy of an ASP.NET Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
The Application Domain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Application Lifetime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

ix


4967FM.qxd

x

8/16/05

1:14 PM

Page x

■CONTENTS

Application Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Application Directory Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
The Global.asax Application File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Application Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Demonstrating Application Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
ASP.NET Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
The Machine.config File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
The Web.config File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Configuration Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Reading and Writing Configuration Sections Programmatically . . . . . . . . . . . . . 168
The Website Administration Tool (WAT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171

Extending the Configuration File Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Encrypting Configuration Sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
.NET Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Creating a Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Using a Component Through the App_Code Directory . . . . . . . . . . . . . . . . . . . . 179
Using a Component Through the Bin Directory . . . . . . . . . . . . . . . . . . . . . . . . . 180
Extending the HTTP Pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
HTTP Handlers and HTTP Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Creating a Custom HTTP Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Configuring a Custom HTTP Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Registering HTTP Handlers Without Configuring IIS . . . . . . . . . . . . . . . . . . . . . . 186
Creating an Advanced HTTP Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Creating a Custom HTTP Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

■CHAPTER 6

State Management

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

ASP.NET State Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
A View State Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Storing Objects in View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Retaining Member Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Assessing View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Trimming View State in a List Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
View State Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Transferring Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207

The Query String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Cross-Page Posting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Cross-Page Posting and Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Custom Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Session Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Using Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Configuring Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Securing Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222


4967FM.qxd

8/16/05

1:14 PM

Page xi

■CONTENTS

Application State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Static Application Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226

PART 2
■CHAPTER 7

■■■


Data Access

ADO.NET Fundamentals

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229

The ADO.NET Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
ADO.NET Data Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Standardization in ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
SQL Server 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Fundamental ADO.NET Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
The Connection Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Connection Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Testing a Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Connection Pooling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Connection Statistics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
The Command and DataReader Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Command Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
The DataReader Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
The ExecuteReader() Method and the DataReader . . . . . . . . . . . . . . . . . . . . . . 242
The ExecuteScalar() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
The ExecuteNonQuery() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
SQL Injection Attacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Using Parameterized Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Calling Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Transactions and ASP.NET Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Isolation Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Savepoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Nested Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260

Provider-Agnostic Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Creating the Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Create Objects with Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
A Query with Provider-Agnostic Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263

■CHAPTER 8

Data Components and the DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Building a Data Access Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
The Data Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
The Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
The Data Utility Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Testing the Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274

xi


4967FM.qxd

xii

8/16/05

1:14 PM

Page xii

■CONTENTS


Disconnected Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Web Applications and the DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
XML Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
The DataSet Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
The DataTable Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
The DataRow Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
The DataAdapter Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Filling a DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Working with Multiple Tables and Relationships . . . . . . . . . . . . . . . . . . . . . . . . 282
Searching for Specific Rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Using the DataSet in a Custom Data Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
The DataView Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Sorting with a DataView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Filtering with a DataView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Advanced Filtering with Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Calculated Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

■CHAPTER 9

Data Binding

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295

Basic Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Single-Value Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Other Types of Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Repeated-Value Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Data Source Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309

The Page Life Cycle with Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
The SqlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Selecting Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Parameterized Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Handling Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Updating Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Disadvantages of the SqlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
The ObjectDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Selecting Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Updating Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Updating with a Data Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
The Limits of the Data Source Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
The Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Adding the Extra Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Handling the Extra Options with the SqlDataSource . . . . . . . . . . . . . . . . . . . . . 333
Handling the Extra Options with the ObjectDataSource . . . . . . . . . . . . . . . . . . . 334
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334


4967FM.qxd

8/16/05

1:14 PM

Page xiii

■CONTENTS

■CHAPTER 10


Rich Data Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
The GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Defining Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Formatting the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Formatting Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Formatting-Specific Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
GridView Row Selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Using Selection to Create a Master-Details Form . . . . . . . . . . . . . . . . . . . . . . . 346
The SelectedIndexChanged Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Using a Data Field As a Select Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
Sorting the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Sorting with the SqlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Sorting with the ObjectDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Sorting and Selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Advanced Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
Paging the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Automatic Paging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Custom Pagination with the ObjectDataSource . . . . . . . . . . . . . . . . . . . . . . . . . 357
Customizing the Pager Bar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
GridView Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Using Multiple Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
Editing Templates in Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Binding to a Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Handling Events in a Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Editing with a Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
The DetailsView and FormView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
The DetailsView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
The FormView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374

Advanced Grids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Summaries in the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
A Parent/Child View in a Single Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
Serving Images from a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Detecting Concurrency Conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389

■CHAPTER 11

Caching

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391

Understanding ASP.NET Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Output Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Declarative Output Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Caching and the Query String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Caching with Specific Query String Parameters . . . . . . . . . . . . . . . . . . . . . . . . 395
Custom Caching Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Caching with the HttpCachePolicy Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Post-Cache Substitution and Fragment Caching . . . . . . . . . . . . . . . . . . . . . . . . 398

xiii


4967FM.qxd

xiv

8/16/05


1:14 PM

Page xiv

■CONTENTS

Cache Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Caching to Disk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Data Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Adding Items to the Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
A Simple Cache Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Cache Priorities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
Caching with the Data Source Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Cache Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
File and Cache Item Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
Aggregate Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
The Item Removed Callback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Understanding SQL Cache Notifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
Cache Notifications in SQL Server 2000 or SQL Server 7 . . . . . . . . . . . . . . . . . 415
Cache Notifications in SQL Server 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
Custom Cache Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
A Basic Custom Cache Dependency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
A Custom Cache Dependency Using Message Queues . . . . . . . . . . . . . . . . . . . 422
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424

■CHAPTER 12

XML


. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425

When Does Using XML Make Sense? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
An Introduction to XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
The Advantages of XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
Well-Formed XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
XML Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
XML Schemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
Writing and Reading XML Programmatically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
Writing XML Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Reading XML Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Validating XML Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Displaying XML Content with XSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
A Basic Stylesheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Using XslTransform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Using the Xml Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
XML Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Nonhierarchical Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Using XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Nested Grids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
Hierarchical Binding with the TreeView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
Using XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
Binding to XML Content from Other Sources . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Updating XML Through the XmlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
XML and ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Converting the DataSet to XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Accessing a DataSet As XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Executing an XML Query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470


6f07122590a6750721a6f2c93fcdacb4


4967FM.qxd

8/16/05

1:14 PM

Page xv

■CONTENTS

■CHAPTER 13

Files and Streams

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471

Working with the File System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
The Directory and File Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
The DirectoryInfo and FileInfo Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
The DriveInfo Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
Working with Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
Filter Files with Wildcards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Retrieving File Version Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
The Path Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
A File Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
Reading and Writing Files with Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Text Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489

Binary Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
Uploading Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
Making Files Safe for Multiple Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Serialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502

PART 3

■■■

■CHAPTER 14

Building ASP.NET Websites

User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505
User Control Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Creating a Simple User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Converting a Page to a User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
Adding Code to a User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
Handling Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
Adding Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Using Custom Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
Adding Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Exposing the Inner Web Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Dynamically Loading User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Portal Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
Partial Page Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
VaryByControl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Sharing Cached Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524

■CHAPTER 15

Themes and Master Pages

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525

Standardizing Website Formatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Cascading Style Sheets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
Theme Folders and Skins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
Applying a Simple Theme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530

xv


4967FM.qxd

xvi

8/16/05

1:14 PM

Page xvi

■CONTENTS

Handling Theme Conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531

Creating Multiple Skins for the Same Control . . . . . . . . . . . . . . . . . . . . . . . . . . 532
Skins with Templates and Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
Using CSS in a Theme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Applying Themes Through a Configuration File . . . . . . . . . . . . . . . . . . . . . . . . . 536
Applying Themes Dynamically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Standardizing Website Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
Master Page Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
A Simple Master Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
A Simple Content Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
Design-Time Quirks with Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
Default Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
A More Practical Master Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Master Pages and Relative Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Master Pages and Formatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Applying Master Pages Through a Configuration File . . . . . . . . . . . . . . . . . . . . 549
Advanced Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Specifying a Title and Metatags for a Content Page . . . . . . . . . . . . . . . . . . . . . 550
Interacting with the Master Page Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
Dynamically Setting a Master Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
Nesting Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554

■CHAPTER 16

Website Navigation

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555

Pages with Multiple Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
The MultiView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556

The Wizard Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
Site Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
Defining a Site Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568
Binding to a Site Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Breadcrumbs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
Binding Portions of a SiteMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
Programmatic Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Binding Other Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
Adding Custom Site Map Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
Creating a Custom SiteMapProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
URL Mapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
The TreeView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
The TreeNode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
Populating Nodes on Demand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
TreeView Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
Menu Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
Menu Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595
Menu Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598


4967FM.qxd

8/16/05

1:14 PM

Page xvii

■CONTENTS


■CHAPTER 17

Resources and Localization

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599

Resources in .NET Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Localization of Web Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Localization and the Common Language Runtime . . . . . . . . . . . . . . . . . . . . . . 607
Local Resources for a Single Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
Sharing Resources Between Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Localizing Static Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Text Directions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618

■CHAPTER 18

Website Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Internet Information Services (IIS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
IIS and URL Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620
Request Processing with IIS and ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
IIS 5.x Process Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
IIS 6.0 Process Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
Installing IIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
Managing Websites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634
Creating a Virtual Directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634
Virtual Directories and Web Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
Folder Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637
Managing Application Pools in IIS 6.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641

Creating Application Pools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641
Application Pools and Web Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
Custom Application Pool Identities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
Deploying Your ASP.NET Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
Verifying the ASP.NET Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
ASP.NET Side-By-Side Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 650
Configure HTTP Runtime Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651
Compilation Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
Deploying with Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653
The VirtualPathProvider in ASP.NET 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655
Health Monitoring in ASP.NET 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 660
Understanding the Basic Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 660
Events and Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 660
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664

PART 4

■■■

■CHAPTER 19

Security

The ASP.NET Security Model

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667

What It Means to Create Secure Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667
Understanding Potential Threats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668
Secure Coding Guidelines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668

Understanding Gatekeepers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669

xvii


4967FM.qxd

xviii

8/16/05

1:14 PM

Page xviii

■CONTENTS

Understanding the Levels of Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672
Confidentiality and Integrity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
Pulling It All Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
Internet Information Services Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
IIS Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
IIS Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676
IIS and Secure Sockets Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
ASP.NET Security Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685
The Security Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686

Membership and Roles APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688

■CHAPTER 20

Forms Authentication

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689

Introducing Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Why Use Forms Authentication? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
Why Would You Not Use Forms Authentication? . . . . . . . . . . . . . . . . . . . . . . . . 692
Why Not Implement Cookie Authentication Yourself? . . . . . . . . . . . . . . . . . . . . 693
The Forms Authentication Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
Implementing Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
Configuring Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
Denying Access to Anonymous Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698
Creating a Custom Login Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698
Custom Credentials Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704
Persistent Cookies in Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707

■CHAPTER 21

Membership

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709

Introducing the ASP.NET Membership API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709
Using the Membership API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711

Configuring Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
Creating the Data Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714
Configuring Connection String and Membership Provider . . . . . . . . . . . . . . . . . 718
Creating and Authenticating Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721
Using the Security Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723
The Login Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724
The LoginStatus Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
The LoginView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
The PasswordRecovery Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735
The ChangePassword Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739
The CreateUserWizard Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740
Using the Membership Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744
Retrieving Users from the Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745


4967FM.qxd

8/16/05

1:14 PM

Page xix

■CONTENTS

Updating Users in the Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747
Creating and Deleting Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748
Validating Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749


■CHAPTER 22

Windows Authentication

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751

Introducing Windows Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
Why Use Windows Authentication? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
Why Would You Not Use Windows Authentication? . . . . . . . . . . . . . . . . . . . . . . 752
Mechanisms for Windows Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
Implementing Windows Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759
Configuring IIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759
Configuring ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 760
Denying Access to Anonymous Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761
Accessing Windows User Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761
Impersonation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764
Impersonation in Windows 2000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765
Impersonation on Windows XP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766
Impersonation and Delegation on Windows Server 2003 . . . . . . . . . . . . . . . . . 767
Configured Impersonation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769
Programmatic Impersonation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775

■CHAPTER 23

Authorization and Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777
URL Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777
Authorization Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778
File Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783
Authorization Checks in Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784

Using the IsInRole() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784
Using the PrincipalPermission Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785
Using the Roles Service for Role-Based Authorization . . . . . . . . . . . . . . . . . . . . . . . . . 787
Using the LoginView Control with Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793
Accessing Roles Programmatically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794
Using the Roles Service with Windows Authentication . . . . . . . . . . . . . . . . . . . 796
Protecting Non-Web-Page Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
Adding a File Type Mapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
Writing a Custom HTTP Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 800
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 801

■CHAPTER 24

Profiles

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 803

Understanding Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 803
Profile Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 803
How Profiles Store Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 804
Profiles and Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 805
Profiles vs. Custom Data Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 806

xix


4967FM.qxd

xx


8/16/05

1:14 PM

Page xx

■CONTENTS

Using the SqlProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 806
Creating the Profile Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 807
Configuring the Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 809
Defining Profile Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 810
Using Profile Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 811
Profile Serialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 812
Profile Groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 814
Profiles and Custom Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 814
The Profiles API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 818
Anonymous Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Building a Shopping Cart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 822
The Shopping Cart Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823
The Test Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 826
Multiple Selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Custom Profiles Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829
The Custom Profiles Provider Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829
Designing the FactoredProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831
Coding the FactoredProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 832
Testing the FactoredProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 836
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838

■CHAPTER 25


Cryptography

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 839

Encrypting Data: Confidentiality Matters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 839
The .NET Cryptography Namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 840
Understanding the .NET Cryptography Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
Symmetric Encryption Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 844
Asymmetric Encryption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845
The Abstract Encryption Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 846
The ICryptoTransform Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 847
The CryptoStream Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 847
Encrypting Sensitive Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 848
Managing Secrets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 849
Using Symmetric Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 850
Using Asymmetric Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
Encrypting Sensitive Data in a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858
Encrypting the Query String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 861
Wrapping the Query String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862
Creating a Test Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866

■CHAPTER 26

Custom Membership Providers

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 867

Architecture of Custom Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 867

Basic Steps for Creating Custom Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Overall Design of the Custom Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Designing and Implementing the Custom Store . . . . . . . . . . . . . . . . . . . . . . . . 870


4967FM.qxd

8/16/05

1:14 PM

Page xxi

■CONTENTS

Implementing the Provider Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876
Using the Custom Provider Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 894
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 896

PART 5

■■■

■CHAPTER 27

Advanced User Interface

Custom Server Controls

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 899


Custom Server Control Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 900
Creating a Bare-Bones Custom Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 900
Using a Custom Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902
Custom Controls in the Toolbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 903
Creating a WebControl That Supports Style Properties . . . . . . . . . . . . . . . . . . . 904
The Rendering Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 908
Dealing with Different Browsers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 909
The HtmlTextWriter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 909
Browser Detection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 910
Browser Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 912
Adaptive Rendering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914
Control State and Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915
View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915
Control State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 917
Postback Data and Change Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918
Triggering a Postback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 921
Extending Existing Web Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 923
Composite Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 923
Derived Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 925
Templated Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Creating a Templated Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Using Customized Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 936
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940

■CHAPTER 28

Design-Time Support


. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 941

Design-Time Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 942
The Properties Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 942
Attributes and Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 945
The Toolbox Icon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 946
Web Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 947
Code Serialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 949
Type Converters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 949
Serialization Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957
Type Editors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 962
Control Designers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 965
A Basic Control Designer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 966

6f07122590a6750721a6f2c93fcdacb4

xxi


4967FM.qxd

xxii

8/16/05

1:14 PM

Page xxii

■CONTENTS


Smart Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 968
The Action List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 969
The DesignerActionItem Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 970
The Control Designer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 972
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 973

■CHAPTER 29

JavaScript

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975

JavaScript Essentials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
JavaScript Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 976
Script Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 978
Rendering Script Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 986
Script Injection Attacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 987
Request Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 988
Disabling Request Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 988
Client Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 991
Creating a Client Callback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 991
Client Callbacks “Under the Hood” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 995
Custom Controls with JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 996
Pop-Up Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997
Rollover Buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000
Dynamic Panels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1003
Frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006
Frame Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1007
Inline Frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1008

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010

■CHAPTER 30

Dynamic Graphics and GDI+

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011

The ImageMap Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
Creating Hotspots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012
Handling Hotspot Clicks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1013
A Custom Hotspot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1014
Drawing with GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016
Simple Drawing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1017
Image Format and Quality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1019
The Graphics Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1020
Using a GraphicsPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1023
Pens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1024
Brushes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1026
Embedding Dynamic Graphics in a Web Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1028
Using the PNG Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029
Passing Information to Dynamic Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1030
Custom Controls That Use GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1033
Charting with GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1037
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1042


4967FM.qxd

8/16/05


1:14 PM

Page xxiii

■CONTENTS

■CHAPTER 31

Portals with Web Part Pages

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1043

Typical Portal Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1043
Basic Web Part Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1045
Creating the Page Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1045
WebPartManager and WebPartZones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1047
Adding Web Parts to the Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1048
Customizing the Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1051
Creating Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1054
Simple Web Part Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1054
Developing Advanced Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1062
Web Part Editors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1070
Connecting Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1076
Authorizing Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1083
Final Tasks for Personalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1084
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1084

PART 6


■■■

■CHAPTER 32

Web Services

Creating Web Services

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1087

Web Services Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1088
The History of Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1088
Distributed Computing and Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1089
The Problems with Distributed Component Technologies . . . . . . . . . . . . . . . . 1091
The Benefits of Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1091
Making Money with Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1093
The Web Service Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1093
Building a Basic Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1096
The Web Service Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1096
Web Service Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1097
Exposing a Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1100
Testing a Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1103
Consuming a Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106
The Proxy Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1112
Creating an ASP.NET Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1113
Creating a Windows Forms Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1115
Creating an ASP Client with MSXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1117
Creating an ASP Client with the SOAP Toolkit . . . . . . . . . . . . . . . . . . . . . . . . . 1119
Refining a Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1120
CacheDuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1120

EnableSession . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1123
BufferResponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1126
TransactionOption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1126
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1128

xxiii


4967FM.qxd

xxiv

8/16/05

1:14 PM

Page xxiv

■CONTENTS

■CHAPTER 33

Web Service Standards and Extensions

. . . . . . . . . . . . . . . . . . . 1129

WS-Interoperability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1129
SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1131
SOAP Encoding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1132
SOAP Versions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1133

Tracing SOAP Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1134
The SOAP Envelope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1136
The SOAP Header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1140
WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1144
Viewing the WSDL for a Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1144
The Basic Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1146
Implementing an Existing Contract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1151
Customizing SOAP Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1152
Serializing Complex Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1152
Customizing XML Serialization with Attributes . . . . . . . . . . . . . . . . . . . . . . . . 1156
Type Sharing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1159
Customizing XML Serialization with IXmlSerializable . . . . . . . . . . . . . . . . . . . 1161
Custom Serialization for Large Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . 1165
Schema Importer Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1170
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1173

■CHAPTER 34

Advanced Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175
Asynchronous Calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175
Asynchronous Delegates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1176
A Simple Asynchronous Call . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1178
Concurrent Asynchronous Calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1180
Responsive Windows Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1181
Asynchronous Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1185
Securing Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1186
Windows Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1186
Custom Ticket-Based Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1189
Tracking the User Identity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1190
Authenticating the User . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1191

Authorizing the User . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1192
Testing the SOAP Authentication System . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1192
SOAP Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1194
Creating a SOAP Extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1196
The Web Services Enhancements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1203
Installing the WSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1204
Performing Authentication with the WSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1206
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1210

■INDEX

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1211


4967FM.qxd

8/16/05

1:14 PM

Page xxv

About the Revising Authors

■MATTHEW MACDONALD is an author, educator, and MCSD developer. He’s a
regular contributor to programming journals and the author of more than a
dozen books about .NET programming, including ASP.NET: The Complete
Reference (Osborne McGraw-Hill, 2002), Programming .NET Web Services
(O’Reilly, 2002), Beginning ASP.NET in C (Apress, 2004), and Microsoft .NET
Distributed Applications (Microsoft Press, 2003). In a dimly remembered past

life, he studied English literature and theoretical physics.

■MARIO SZPUSZTA works in the Developer and Platform Group of Microsoft
Austria. Before he started working for Microsoft, Mario was involved in several
projects based on COM+ and DCOM with Visual Basic and Visual C++ as well
as projects based on Java and J2SE. With beta 2 of the first version of the .NET
Framework, he started developing web applications with ASP.NET. Currently,
as a developer evangelist for Microsoft Austria, he conducts workshops, trainings, and proof-of-concept projects with independent software vendors in
Austria based on .NET web services and Office 2003 technologies.

xxv


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×