ASP.NET 3.5是一种建立Web解决方案的令人惊异的技术。早在ASP.NET 1.0版本于2000年发布时,许多人就认为它在Web应用程序开发方面迈出了具有革命性的一步。而后来的ASP.NET 2.0更激动人心、更富有革命性,ASP.NET 3.5 Service Pack 1(SP1)则继续朝着这个方向前进,为在Web上建立应用程序提供了目前最佳的框架。ASP.NET 3.5 SP1建立在已发布的ASP.NET 1.0基础之上,但它主要关注的是开发人员的效率。
本书介绍ASP.NET的所有内容,除了论述新主题外,还列举了一些有关这些新技术的例子。
0.1 简史
在各个公司考虑为Internet开发应用程序之前,应用程序的开发主要集中在桌面应用程序上。这些胖客户端应用程序适用于所有场合:家用计算、游戏、办公等。这种应用程序模型的流行可谓势不可挡。
在这个过程中,Microsoft开发胖客户端应用程序使用的是其主要产品Visual Basic(VB)。
Visual Basic不仅是一种编程语言,它还与便于开发胖客户应用程序的IDE有密切的关系。在Visual Basic模型中,开发人员可以把控件拖放到窗体上,设置这些控件的属性,给它们提供代码来处理控件的事件。例如,终端用户单击Visual Basic窗体上的一个按钮时,窗体的隐藏代码就会处理该事件。
在20世纪90年代中期,Internet开始崭露头角。Microsoft未能将Visual Basic模型转向基于Internet应用程序的开发。Internet的确有强大的功能,此时胖客户端应用程序模型面临的问题也开始显露出来。基于Internet的应用程序创建了每个人都能访问的一个应用程序实例。拥有应用程序的一个实例,意味着在对应用程序进行升级或打补丁时,对这个实例的修改会立即展现给通过浏览器访问该应用程序的每个用户。
为了进入Web应用程序行业,Microsoft开发了Active Server Pages (ASP)。ASP是开发Web页面的一种快捷方式。ASP页面由一个页面组成,其中包含了标记和语言的混合。ASP的强大之处在于,在将页面发送给终端用户的Web浏览器之前,可以在页面上包含在Web服务器上执行的VBScript或JScript代码指令。这是创建动态Web页面的一种简单方式,动态Web页面是根据开发人员指定的参数进行定制的。
ASP在尖括号和百分号[% %]之间使用脚本来控制服务器端的行为。开发人员可以先从一组静态的HTML开始建立ASP页面。页面需要的动态元素用脚本语言(如VBScript或JScript)来定义。当用户使用浏览器从服务器上请求页面时,asp.dll (这是一个ISAPI应用程序,它在脚本语言和Web服务器之间架起了一座桥梁)就提取页面,根据脚本中指定的编程逻辑定义页面中的动态部分。定义页面中的所有动态部分后,所得到的结果就是一个HTML页面,该页面被输出到请求客户机的浏览器上。
在开发Web应用程序模型的过程中,静态HTML中混合了越来越多的语言,以帮助处理输出页面的操作方式和外观。随着时间的推移,ASP页面上将出现非常多的语言、脚本和纯文本,开发人员开始把使用这些特性的页面称为spaghetti code(意大利细面条式代码)。例如,页面上可能使用了HTML、VBScript、JavaScript、层叠样式表、T-SQL等。在这种情况下,页面是很难管理的。
ASP进一步演化并推出了新版本。ASP 2.0和3.0开始流行,因为这些技术非常便于Web页面的创建。它们的日益流行是因为它们出现在20世纪90年代后期,那时诞生了.com。在这个阶段,人们开发了许多Web页面和门户,ASP是一种业界领先的技术,个人和公司都使用该技术建立Web页面。甚至到现在,仍可以在Internet上找到许多.asp页面—— 包括Microsoft的一些Web页面。
但在1998年后期,Active Server Pages发布其最后一个版本时,Microsoft雇员Marc Anders 和 Scott Guthrie有了另一个想法。他们称之为XSP(这个缩写词没有什么特别的含义)—— 这是以面向对象的方式创建Web应用程序的方法,而不是使用ASP 3.0的过程式方法来创建。他们把这个想法告诉Microsoft中许多不同的团体,并得到了广泛的认可。2000年夏, Microsoft的Professional Developers Conference发布了其测试版ASP+。与会者都非常渴望使用它。该技术发布时(与.NET Framework 1.0的最终版本一起发布),被重新命名为ASP.NET—— 加上.NET标记是因为在那时Microsoft的大多数新产品都加上了这个标记。
在引入.NET之前,传统ASP提供的模型和Visual Basic中开发的模型大相径庭,很少有VB开发人员能开发Web应用程序,Web开发人员也不能开发VB的胖客户应用程序。这是一条很大的鸿沟,ASP.NET则为此搭建了一座桥梁。ASP.NET把Visual Basic样式的事件模型引入到Web应用程序的开发中,为无状态的HTTP提供了迫切需要的状态管理技术。其模型非常类似于早期的Visual Basic模型,因为开发人员可以把控件拖放到设计界面或窗体上,处理控件的属性,处理控件的代码,甚至基于控件的生存周期指定一些事件。ASP.NET综合了这两个模型的优点,如本书后面所述。
读者一定很希望使用ASP.NET 3.5 SP1这个最新版本,看看这种新技术能给自己带来什么。下面就讨论ASP.NET的目标,看看它有什么新内容。
0.2 ASP.NET的目标
ASP.NET 3.5是该产品的另一个重要版本,建立在.NET Framework 2.0的核心功能之上,并带有额外的类和功能。Framework的这个版本在Microsoft内部的代码名称是Orcas,读者可能听说过其他人把ASP.NET的这个版本称为ASP.NET Orcas。ASP.NET 3.5继续使ASP.NET开发人员成为Web领域中最高效的开发人员。本书也重点介绍ASP.NET 3.5 SP1版本中的ASP.NET 3.5和.NET Framework 3.5的新功能。
Microsoft小组刚开始开发ASP.NET 2.0时,就设定了要实现的目标。这些目标集中于开发人员的效率、管理、性能和可伸缩性。
0.2.1 开发人员的效率
ASP.NET 3.5的主要目标是效率。ASP.NET 1.x的发布就已经达到了很高的效率,但效率还能进一步提高吗?
ASP.NET开发小组的一个目标是去除ASP.NET中原来必需的大量繁琐的编码,使常见的ASP.NET任务更容易完成。开发人员的高效率将在本书中体现出来。在介绍这些功能之前,首先看看以前的ASP.NET 1.0技术,以便与ASP.NET 3.5进行比较。程序清单0-1使用ASP.NET 1.0在Web页面上建立了一个表,并可以对所提供的数据进行简单的分页。
. 程序清单0-1 在支持分页功能的DataGrid服务器控件上显示数据(仅用于VB)
尽管这里使用了相当多的代码,但与使用传统的Active Server Pages 3.0相比,所需的代码量削减了很多。这里不详细探讨这些旧代码的细节,只说明为了给表中显示的数据添加额外的常见功能(如分页功能),开发人员必须创建定制的代码。
在ASP.NET 3.5中,这是开发人员效率提高最显著的一个方面。ASP.NET 3.5提供了一个新的控件,称为GridView服务器控件,这个控件非常类似于以前的DataGrid服务器控件,但GridView服务器控件(除了提供许多其他新功能之外)内置了分页、排序和编辑数据的功能,而用户不需要做任何工作。程序清单0-2就是使用GridView服务器控件的一个例子,该例子为Northwind数据库的Customers表中的数据建立了一个包含分页功能的表。
程序清单0-2 用新的GridView服务器控件查看分页的数据集
使用几个新服务器控件就可以应用分页功能。要启用这个功能,只需使用GridView服务器控件的AllowPaging属性即可:
在文档的代码部分,所发生的另一个有趣事件如下:
实际上,运行该文件并不需要这两行代码。这里包含它们是为了说明一点:不需要编写任何服务器端代码,就可以使页面工作!只需包含一些服务器控件:获取数据的控件和显示数据的控件。然后,将这些控件关联到一起。
0.2.2 性能和可伸缩性
Microsoft 小组为ASP.NET设定的一个目标是提供世界上最快的Web应用程序服务器。本书也介绍ASP.NET 3.5中许多性能上的改进。
最激动人心的性能改进之一是为了利用Microsoft的SQL Server而新增的高速缓存功能。ASP.NET 3.5包含一个名为“禁用SQL高速缓存”的特性。在ASP.NET 2.0之前,可以高速缓存来自SQL Server的结果,并根据一定的时间间隔来更新高速缓存,例如,每15秒更新一次。这样,如果结果集在15秒的时间内发生了变化,终端用户看到的可能就是过期的数据。
在一些情况下,更新结果集的这个时间间隔是无法接受的。在理想情况下,如果从中提取结果集的数据源(这里是SQL Server)发生了变化,那么存储在高速缓存中的结果集就应删除。在ASP.NET 3.5中,禁用SQL高速缓存功能就可以达到这个目的。也就是说,来自SQL Server的结果集发生变化时,输出的高速缓存也会变化,终端用户看到的总是最新的结果集,显示的数据永远都没有过期。
ASP.NET 3.5提供了64位支持,于是,现在可以在64位的Intel或AMD处理器上运行ASP.NET应用程序。
ASP.NET 3.5完全兼容ASP.NET 1.0、1.1和2.0,所以可以在.NET Framework 3.5上打开以前的ASP.NET应用程序,重新编译,并在64位处理器上运行它们。
0.3 ASP.NET 3.5和3.5 SP1的其他新特性
前面学习了ASP.NET小组为ASP.NET设定的主要目标。为了达到这些目标,ASP.NET小组在ASP.NET中内置了许多新特性。下面就介绍其中的几个。
0.3.1 新的开发基础结构
ASP.NET 3.5中的一个重要改进是新的基础结构,可以在应用程序中使用它。ASP.NET小组选择Web应用程序中一些最常见的编程操作,直接内置到ASP.NET中,这样可以省去大量的时间和编码量。
1. 成员和角色管理
在ASP.NET 2.0以前的版本中,如果开发一个要求用户登录应用程序,以获得许可的访问权限的门户,那么总是需要自己创建它。这样创建出来的应用程序在某些方面就存在一些限制,只有选定的人才可以访问它。
在ASP.NET 3.5中内置了这个功能。现在可以使用程序清单0-3来验证用户。
程序清单0-3 通过代码验证用户
使用ASP.NET 3.5中的一系列API、控件和提供程序可以控制应用程序的用户成员和角色管理。使用这些API,可以轻松地管理用户及其复杂的角色—— 创建、删除和编辑它们。这些功能只需使用API或内置的Web工具Web Site Administration Tool即可实现。
对于用户及其角色的存储,ASP.NET 3.5使用.mdf文件(该文件类型用于SQL Server Express Edition)来存储所有的用户和角色。但这个数据存储是没有限制的,可以扩展ASP.NET提供的功能,使用任何数据存储建立自己的提供程序。例如,可以轻松地在LDAP或Oracle数据库中建立自己的用户存储。
2. 个性化
门户(portal)为其成员提供的一个高级特性是个性化产品,终端用户可以定制站点的外观和功能。个性化应用程序和存储个性化设置的功能现在已完全内置到ASP.NET框架中。
个性化常常围绕一个用户和这个用户承担的角色来进行,所以个性化体系结构可以与成员和角色基础结构紧密联系起来。存储所创建的个性化设置有几种方式。在Microsoft Access和SQL Server中存储这些设置的功能已内置到ASP.NET 3.5中。与成员和角色API的功能一样,可以使用灵活的提供程序模型,通过改变内置提供程序使用可用数据存储的方式,或者建立自己的定制数据提供程序,来实现全新的数据存储。个性化API也支持一系列数据存储,因此可以使用多个数据存储。
使用这些新API很容易地为定制过程创建一个站点,所以这个特性对于用户建立的任意应用程序来说都是有价值的。
3. ASP.NET门户框架
在使用ASP.NET 1.0时,开发人员可以访问ASP.NET小组的站点(http://www.asp.net),下载一些Web演示应用程序,如IBuySpy。这些演示程序叫作Developer Solution Kits,可以用作目前Internet上许多Web站点的基础。其中一些甚至扩展为开放源代码的框架,如DotNetNuke。
IBuySpy的优点是,可以把它提供的代码作为基础,建立Web存储或门户。只需以基本代码作为起点,扩展它即可。例如,可以改变代码显示部分的外观和操作方式,或者在其模块化体系结构中引入高级功能。Developer Solution Kits相当流行,因为它们使这些类型的操作非常容易实现。
像IBuySpy这样的框架非常流行,因此,ASP.NET 3.5提供了内置功能,以使用Web Parts方便地建立门户。可以使用Portal Framework建立的项目类型非常多。使用Web Parts建立项目的优点在于终端用户可以根据自己的喜好完全定制门户。
4. 站点导航
ASP.NET小组成员认识到,终端用户希望方便地在整个应用程序中导航。以逻辑方式进行导航的机制有时很难编码。该小组在ASP.NET中使用一系列基于导航的服务器控件解决了这个问题。
首先,在一个XML文件中为应用程序建立一个站点地图,特定的控件可以在该站点地图中工作。程序清单0-4显示了一个示例站点地图文件。
程序清单0-4 站点地图文件示例
有了站点地图之后,就可以把这个文件用作几个站点导航服务器控件的数据源,如TreeView和SiteMapPath服务器控件。TreeView服务器控件允许在应用程序中放置可扩展的站点导航系统。图0-1显示了TreeView服务器控件的许多外观之一。
图 0-1
SiteMapPath控件可以在应用程序中放置一些导航项,这样终端用户就可以查看应用程序当前采用的路径,并能轻松地导航到树型结构的上一级。图0-2显示了SiteMapPath服务器控件的一个例子。
图 0-2
这些站点导航功能为编程访问站点布局提供了极大的便利,甚至也考虑到了类似于终端用户的角色如何确定显示站点的哪一部分这类事情。
5. ADO.NET实体框架
大多数开发人员都需要使用某种底层的数据库,无论使用的是Microsoft SQL Server数据库还是Oracle数据库,应用程序通常都要提取某类内容,以执行操作。使用底层数据库的难点在于数据库与面向对象的代码在处理对象时使用的方式大相径庭。
在数据库领域中,数据结构放在表中,项中的集合(例如,附带有Orders的Customers对象)简单地表示为用Join语句连接起来的两个表。而在面向对象的代码中,在表示这些对象时,Orders项是Customers对象的一个属性。把这两个领域关联起来,并映射出这些区别总是比较麻烦的。
ASP.NET 3.5 SP1引入了ADO.NET实体框架,它有点类似于LINQ to SQL。ADO.NET实体框架的目标是允许创建一个实体数据模型(Entity Data Model,EDM),以便于映射面向对象的数据与这些数据在数据库中的表达方式。
ADO.NET实体框架的一个优点是它可以使用许多不同类型的数据库,所以不像LINQ to SQL那样只使用一个数据库。另一个优点是ADO.NET实体框架是ASP.NET 3.5 SP1引入的其他一些新技术的基础,如ADO.NET数据服务。
6. ASP.NET动态数据
ASP.NET 3.5 SP1的另一个新特性是ASP.NET动态数据,利用这个功能可以方便地在几分钟内,通过数据库创建报表和数据输入应用程序。
使用ASP.NET动态数据是很简单的,只需指向在应用程序中创建好的实体数据模型(EDM),允许动态数据引擎自动创建Web页面,以提供数据库中的创建、编辑、更新和删除等全部功能。
ASP.NET动态数据要求有一个实体数据模型才能工作。但不一定非要使用ADO.NET实体框架,也可以使用已创建好的任意LINQ to SQL模型。
ASP.NET动态数据的体系结构的一个优点是,它在动态生成站点上的页面时使用的是模板。像使用这个系统的开发人员一样,用户也可以使用系统“as-is”,甚至可以提取其中的一部分,把它的功能合并到已有的ASP.NET应用程序中。
7. ADO.NET数据服务
ASP.NET 3.5 SP1版本引入的另一个新特性是ADO.NET数据服务。ADO.NET数据服务的正式名称为Project Astoria,它允许用户在数据库上创建Restful服务接口。
使用ADO.NET数据服务,可以把请求的URL用作命令驱动的URI,并和HTTP动词一起使用,告诉服务器如何处理底层数据。使用这种技术可以创建、读取、更新或删除底层数据库的数据,但接口的实现人员也可以限制终端用户可用的功能和访问权限。
0.3.2 ASP.NET编译系统
ASP.NET 1.0中的编译是一个很困难的过程。在ASP.NET 1.0中,要使用ASP.NET和Visual Studio建立应用程序的隐藏代码文件,部署它,然后在请求每个页面时,逐个观察.aspx文件是否已编译。如果在ASP.NET 1.0中对隐藏代码文件进行了修改,这些修改的内容将不能反映到应用程序中,除非重新建立了整个应用程序。也就是说,在重新编译整个应用程序之前,必须再次逐个地请求每个页面。
ASP.NET 1.0处理类和编译的方式在ASP.NET 3.5中都得到了改进。新编译系统的机制首先从页面在ASP.NET 3.5中的构建方式入手。在ASP.NET 1.0中,可以使用隐藏代码模型构建页面,也可以把所有的服务器代码放在.aspx页面的[script]标记之间。大多数页面都使用隐藏代码模型来构建,因为在Visual Studio .NET 2002或2003中,这是默认方式。在这些IDE中使用内嵌编码方式创建页面是比较困难的。如果用这种方式创建页面,就不能使用IntelliSense,而在使用.NET Framework 提供的绝大多数类集合时,使用IntelliSense可以使创建工作更容易完成。
ASP.NET 3.5提供了一个与1.0/1.1不同的隐藏代码模型,因为.NET Framework 3.5提供了使用部分类(也称为部分类型)的功能。在编译时,各个文件将组合为一个产品,这将生成非常简洁的隐藏代码页面。类中Web Form Designer Generated部分的代码与自己创建的隐藏代码类是分开的。而在ASP.NET 1.0中与此相反,.aspx页面需要从它自己的隐藏代码文件中派生,以表示一个逻辑页面。
ASP.NET 3.5应用程序可以包含一个\App_Code目录,以放置类的源代码。放在该目录下的所有类都是动态编译的,并在应用程序中反映出来。在进行修改时,不需要像ASP.NET 1.0那样使用独立的建立过程,这是一个“只要保存了就可以使用”的部署模型,类似于传统ASP. NET 3.0中的部署模型。Visual Studio 2008也为\App_Code目录中的对象提供了IntelliSense,因此可以使用隐藏代码模型,也可以在线编码。
ASP.NET 3.5还提供了一些工具,可以预先编译ASP.NET应用程序,包括.aspx页面和隐藏代码,这样当第一次检索页面时,应用程序中的所有页面都不会出现延迟现象。如果页面中有错误,即使不调用每个页面,也可以找出这些错误。ASP.NET 2.0(3.0和3.5)应用程序的预编译非常简单,只需使用aspnet_compiler.exe,利用某些可用的标记即可。在预编译整个应用程序时,如果在应用程序中发现错误,我们就会收到错误通知。还可以预先编译应用程序,再给部署服务器传送已创建好的程序集,从而防止代码在部署后被窃取、修改和损坏。本书后面会列举这方面的示例。
0.3.3 ASP.NET应用程序的健康监控
ASP.NET内置的健康监控功能是相当强大的,它非常便于管理已部署的ASP.NET应用程序。顾名思义,健康监控功能可以监控已部署的ASP.NET应用程序的健康状况和性能。
使用健康监控系统可以执行健康监控事件(称为Web事件)的记录操作,如失败的登录、应用程序的启动和停止,或未处理的异常等。事件记录操作可以在多个地方执行,因此可以把事件记录到事件日志或数据库中。除了执行这个基于磁盘的记录操作之外,还可以使用该系统通过电子邮件发送健康监控信息。
除了处理应用程序中的特定事件之外,健康监控系统还可以记录正在运行的应用程序在某一刻的健康状况。与ASP.NET 3.5内置的大多数系统一样,也可以扩展健康监控系统,创建自己的事件,以记录应用程序信息。
在系统的.config文件中,默认为激活健康监控功能。健康监控的默认设置会把所有的错误和失败的审查记录到事件日志中。例如,每在应用程序中抛出一个错误,就会在Application日志中记录一个错误通知。
只需对应用程序的web.config文件进行一些小的修改,就可以改变默认的事件记录操作。例如,假设要把这些错误事件信息存储在应用程序的一个SQL Express文件中,就可以在web.config文件中添加一个[healthMonitoring]节点,如程序清单0-5所示。
程序清单0-5 在web.config文件中定义健康监控功能
进行了这个修改后,事件就被记录到项目中自动创建的ASPNETDB.MDF文件中。
打开这个SQL Express文件,可以找到aspnet_WebEvent_Events表,其中包含所有这些信息。
第35章将介绍ASP.NET 3.5提供的许多健康监控功能。
0.3.4 读写配置设置
使用WebConfigurationManager类,可以读写服务器或应用程序配置文件。也就是说,可以读写应用程序所用的machine.config或web.config文件中的设置。
读写配置文件的功能不但可以处理应用程序所在的本地机器,还可以在远程服务器或应用程序中执行这些操作。
当然,在配置文件上执行这些读取或修改操作时,还可以采用GUI方式。内置的GUI工具使用WebConfigurationManager类提供了这个功能(如Windows XP中的ASP.NET MMC插件或Windows Vista中的新IIS界面),这个类还可以用于定制管理工具。
程序清单0-6演示了如何从应用程序的web.config文件中读取连接字符串。
程序清单0-6 从应用程序的web.config文件中读取连接字符串
这段代码使用一个Label控件把web.config文件中的Northwind连接字符串写到屏幕上。可以看出,从配置文件中提取信息是非常简单的。
0.3.5 本地化
ASP.NET比以前更易于使应用程序本地化。除了使用Visual Studio之外,还可以通过创建资源文件(.resx)根据请求者的文化设置动态地修改已创建的页面。
ASP.NET 3.5还通过两个应用程序文件夹App_GlobalResources和App_LocalResources提供可在整个应用程序的范围内使用的资源,或提供在应用程序的某些页面上使用的资源。
在.resx文件中定义的项可以直接在ASP.NET服务器控件中访问,或使用如下表达式来编程访问:
[%= Resources.Resource.Question %]
这个系统很直观,也很容易实现。有关这个主题的内容详见第33章。
0.3.6 页面框架的新增内容
可以根据可视化继承来构建ASP.NET页面。这在Windows Forms中已经实现,但使用ASP.NET很难实现。使用主题很容易给应用程序中的各个页面应用统一的外观和操作方式。过去使用ADO.NET时碰到的许多困难现在都通过一系列新的数据源控件克服了,这些数据源控件可以从一个大的数据存储集合中访问和检索数据。
1. Master页面
ASP.NET 引入了Master页面,现在可以在ASP.NET应用程序中使用可视化继承了。因为许多ASP.NET应用程序中的页面都有类似的结构,所以创建一个页面模板,把这个模板应用于整个应用程序是很合理的。
在ASP.NET中,通过创建一个带后缀.master的页面可以实现这一点,如图0-3所示。
Master页面包含标题、脚标以及所有页面都有的其他元素。每个继承和使用这个模板的页面都要包含这些元素。除了这些核心元素之外,还可以在Master页面中包含用于子页面(或内容页面)的服务器控件[asp:ContentPlaceHolder],以改变Master页面模板的特定区域。编辑子页面时的情形如图0-4所示。
终端用户调用某个子页面时,就是在查看用该子页面及其继承的Master页面编译的单个页面。这也意味着页面的服务器和客户端代码在新的页面上处于激活状态。
Master页面的优点是,可以在一个地方进行影响整个站点的修改,而不需要修改应用程序中的每个页面。
图 0-3
图 0-4
2. 主题
ASP.NET中引入了主题,便于为整个站点提供统一的外观和操作方式。主题是一些简单的文本文件,在这些文件中,定义了整个站点或一个页面上使用的服务器控件的外观,或者某个特定服务器控件的外观。除了服务器控件的定义之外,还可以轻松地集成图形和层叠样式表。
主题存储在应用程序根目录下的/App_Theme目录中。主题的一个重要功能是用户可以通过ASP.NET提供的个性化服务动态地应用它们。门户或应用程序的每个用户都可以选择自己的个性化外观和操作方式。
0.3.7 访问数据的对象
ASP.NET 1.0中一个代码量较大的任务是数据的检索。在许多情况下,这意味着需要使用许多对象。如果读者以前使用过ASP.NET,就知道这个过程需要在DataGrid服务器控件中显示Microsoft SQL Server表中的数据。例如,首先要创建许多新对象,包括SqlConnection对象和SqlCommand对象。有了这些对象之后,还要创建一个SqlDataReader对象,把结果绑定到DataGrid上来填充DataGrid。最后,显示一个表,其中包含了我们检索的数据内容(例如,Northwind数据库中的Customers表)。
现在,ASP.NET引入了一系列专门处理数据访问和检索的新对象,去除了这个涉及许多代码的过程。这些新的数据控件非常易用,不需要编写任何代码,就可以访问和检索数据,以填充ASP.NET服务器控件。在程序清单0-6的示例中,[asp:SqlDataSource]服务器控件在SQL Server中检索Northwind服务器数据库的Customers表中的数据行。这个SqlDataSource服务器控件使用GridView服务器控件中的简单属性,绑定到新的GridView服务器控件上。没有比这更容易的了!
这个新功能的优点是,它并不只局限用于Microsoft的SQL Server。实际上,还有几个数据源服务器控件也有这个功能。还可以创建自己的数据源服务器控件。除了SqlDataSource服务器控件之外,ASP.NET 3.5还引入了AccessDataSource、XmlDataSource、ObjectDataSource、SiteMapDataSource和LinqDataSource服务器控件。本书的后面将使用这些新数据控件。
0.4 使用本书的要求
在使用本书中的示例时,最好安装Visual Studio 2008,但只安装Microsoft的Notepad和.NET Framework 3.5 SP1附带的命令行编译器也可以。要运行本书的所有示例,需要:
·Windows Server 2003、Windows Server 2008、Windows 2000、Windows XP或Windows Vista
·Visual Studio 2008 SP1(这会安装.NET Framework 3.5 SP1)
·SQL Server 2000、2005或2008
·Microsoft Access或SQL Server Express Edition
使用ASP.NET 3.5 SP1时,并不需要安装Microsoft Internet Information Services (IIS),因为该版本包含了一个内置的Web服务器,它基于以前发布的Microsoft Cassini技术。如果没有SQL Server的完整版本也不必担心。使用这个数据库的许多例子都可以改为使用Microsoft SQL Server Express Edition,它可以从Internet上免费下载。
0.5 本书读者对象
本书介绍的是ASP.NET 3.5 SP1提供的新特性和新功能,并解释ASP.NET的基础知识。所以读者应大致了解Web技术,如ASP.NET的以前版本、Active Server Pages 2.0/3.0或JavaServer Pages。如果读者具备Web编程的基础,阅读本书的内容就不会有什么问题。
如果读者是ASP.NET新手,就应先阅读由Imar Spaanjaars编写的Beginning ASP.NET 3.5:In C# and VB一书(Wiley publishing,Inc.,2008),掌握ASP.NET基础知识。
除了具备Web技术的相关知识之外,读者还应对基本的编程结构有一定的了解,例如变量、For Each循环、面向对象的编程等。
那么,本书到底是适用于Visual Basic开发人员还是C#开发人员呢?这两类开发人员都可以阅读本书!如果示例代码的区别比较大,本书就会提供VB和C#两个版本的代码。
0.6 本书内容
本书主要介绍ASP.NET 3.5 SP1版本,详细阐述该版本中包含的每个主要新特性。下面是每章的主要内容。
·第1章“应用程序和页面框架”:本章介绍ASP.NET应用程序的框架,以及为单个ASP.NET页面提供的结构和框架。本章将描述如何使用IIS或Visual Studio 2008附带的内置Web服务器构建ASP.NET应用程序,讨论ASP.NET中的文件夹和文件,论述编译代码的方式以及如何执行跨页面的传送过程。本章最后列出处理Visual Studio 2008中的类的简单方法。
·第2~4章:将这3章放在一起,是因为它们讨论的都是服务器控件。这几章首先介绍服务器控件的概念及其在ASP.NET开发中的重要作用。除了讨论服务器控件的框架之外,还将深入探讨服务器控件在ASP.NET开发项目中的作用。第2章“ASP.NET服务器控件和客户端脚本”介绍使用服务器控件的基础知识,第3章“ASP.NET Web服务器控件”介绍ASP.NET技术自发布以来就有的控件和每个ASP.NET版本中新增的控件。第4章“验证服务器控件”描述了一组特殊的服务器控件—— 用于验证的服务器控件。使用这些控件可以创建从初级到高级的窗体验证。
·第5章“使用Master页面”:Master页面是ASP.NET技术中的一个强大功能,它提供了创建模板页面的方式,该模板页面能用于整个应用程序,而不是单个页面。本章介绍这些模板的创建方式,以及如何把它们应用于ASP.NET应用程序中的内容页面。
·第6章“主题和Skin”:允许在ASP.NET 1.0/1.1中使用的层叠样式表文件在许多方面都存在不足之处,尤其是在服务器控件方面。在使用这些早期的版本时,开发人员不能确保这些文件能生成HTML输出。本章将介绍如何处理应用程序需要的样式,说明如何使用主题和主题中的skin文件,为应用程序的所有页面创建一个集中管理式的外观和操作方式。
·第7章“ASP.NET 3.5中的数据绑定”:ASP.NET的一个重要任务是显示数据,本章将介绍显示数据的各种方式。ASP.NET提供了许多控件,用于关联数据,把它们显示给终端用户。本章介绍把数据发布给控件之前支持编程处理数据的一些底层功能。
·第8章“使用ADO.NET管理数据”:本章介绍ASP.NET提供的ADO.NET数据模型,它允许快速有条理地处理数据的检索、更新和删除。这个新数据模型可以使用一两行代码获取存储在SQL Server或XML文件中任何位置的数据。
·第9章“使用LINQ查询”:.NET Framework 3.5中的一个新增功能是许多人期待的LINQ。LINQ是对.NET Framework的一系列扩展。它封装了语言集成的查询、集合和转换操作。本章介绍LINQ,以及如何在Web应用程序中高效地使用这个新功能。
·第10章“使用XML和LINQ to XML”:毫无疑问,XML是用于数据显示的一种领先技术。所以,.NET Framework和ASP.NET 3.5都在其框架中内置了许多功能,以方便XML的提取、创建、处理和存储。本章主要介绍ASP.NET和底层.NET Framework中内置的一些XML技术。
·第11章“IIS 7.0 开发”:IIS 7.0是IIS最重要的版本,它改变了存储和使用ASP.NET 应用程序的方式。IIS 7.0是Windows Server 2008的一部分。
·第12章“提供程序模型概述”:ASP.NET内置的许多系统大大方便了开发人员的工作,显著提高了他们的效率。这些系统以“提供程序模型”为基础,这个提供程序模型是可扩展的。本章将概述这个提供程序模型,以及它在ASP.NET 3.5中的用法。
·第13章“扩展提供程序模型”:在介绍了提供程序模型后,本章将探讨扩展ASP.NET 3.5中提供程序模型的方式,并演示对提供程序模型的几个扩展。
·第14章“站点导航”:显然,许多开发人员都不是简单地开发单个页面,而是创建应用程序。所以,他们需要处理贯穿整个应用程序的功能,而不仅仅是页面上的功能。ASP.NET 3.5提供的一个应用程序功能就是站点导航系统,本章就介绍这个系统。底层的导航系统允许通过一个XML文件定义应用程序的导航结构,该系统引入了一整套全新的导航服务器控件,来处理XML文件中的数据。
·第15章“个性化”:开发人员总是在寻找存储与终端用户相关的信息的方式。在存储了这些信息之后,这些个性化数据就可以用于用户以后的访问,或者用于获取同一个应用程序中的其他页面。ASP.NET小组开发了一种存储这些信息的方式—— ASP.NET个性化系统。这个系统的最大优点是,可以在web.config文件中配置系统的所有操作。
·第16章“成员和角色管理”:本章介绍新的成员和角色管理系统,该系统用于简化向ASP.NET应用程序添加身份验证和授权的过程。这两个系统是可扩展的,使以前较复杂的身份验证和授权方式永远成为过去。本章主要讨论使用web.config文件控制这些系统的应用方式,以及使用底层系统的新服务器控件。
·第17章“Portal Framework和Web Part”:本章介绍Web Part,它是把页面封装到更小、管理性更强的对象中的新方式。Web Part最大的优点在于它是用较大的Portal Framework构造的,从而允许终端用户可以完全修改它在页面上的构造方式,包括它的外观和布局。
·第18章“用ASP.NET进行HTML和CSS设计”:Visual Studio 2008比较注重建立基于CSS的Web应用程序。本章将详细介绍如何针对ASP.NET应用程序高效地使用HTML和CSS设计。
·第19章“ASP.NET AJAX”:目前,AJAX是Web应用程序领域的一个热门词汇,它是Asynchronous JavaScript and XML的缩写。在Web应用程序开发领域,它表示建立使用XMLHttpRequest对象的应用程序的能力。Visual Studio 2008的一个新增功能是允许从默认安装的IDE中建立支持AJAX的ASP.NET应用程序。本章将介绍建立应用程序的一种新方式。
·第20章“ASP.NET AJAX控件工具集”:除了建立使用AJAX技术的ASP.NET应用程序的新功能之外,还有一系列新控件可用于使任务更简单。本章介绍ASP.NET AJAX控件工具集,以及如何将这个工具集应用于应用程序。
·第21章“安全性”:本章讨论ASP.NET 3.5中成员和角色管理特性之外的安全性,深入研究ASP.NET技术中固有的身份验证和授权机制,以及HTTP访问类型和模拟。
·第22章“状态管理”:ASP.NET是一种基于请求/响应的技术,所以状态管理和请求、响应的性能非常重要。本章介绍ASP.NET开发中这两个独立而又重要的主题。
·第23章“高速缓存”:ASP.NET的本质是请求/响应,所以服务器上的高速缓存(存储以前生成的结果、图像和页面)对于ASP.NET应用程序的性能来说非常重要。本章介绍ASP.NET提供的一些高级高速缓存功能,包括ASP.NET 3.5中的SQL高速缓存禁用功能。
·第24章“调试和错误处理技术”:能在ASP.NET应用程序中处理未预料到的错误是至关重要的。本章描述如何在应用程序中正确构建结构化错误处理机制,说明如何使用各种调试技术查找应用程序可能包含的错误。
·第25章“文件I/O和流”:我们常常希望ASP.NET应用程序能处理基本应用程序之外的项,如文件和流。本章介绍如何处理ASP.NET应用程序引入的各种文件类型和流。
·第26章“用户控件和服务器控件”:我们不仅可以使用ASP.NET附带的服务器控件,还可以使用这些控件的框架,创建自己的控件。本章描述了如何创建自己的服务器控件,如何在应用程序中使用它们。
·第27章“模块和处理程序”:有时,仅使用最新的语言和数据库创建动态的Web页面,并不能给开发人员提供控制应用程序的足够权限。开发人员需要进一步创建可以与Web服务器本身交互的应用程序,并能与低层的进程通信,例如,了解Web服务器如何处理传入和传出的HTTP请求。本章介绍操纵ASP.NET处理HTTP请求的两种方法—— HttpModule和HttpHandler。这两种方法都提供了对ASP.NET的底层处理过程的独特访问,是创建Web应用程序的强大工具。
·第28章“使用业务对象”:对于一些用以前技术创建的组件,我们不想重新创建它们,而是直接把它们集成到新的ASP.NET应用程序中。此时,利用.NET Framework可以轻松地把以前的COM组件集成到应用程序中。本章除了介绍如何把COM组件集成到应用程序中之外,还将研究如何建立全新样式的.NET组件,来代替以前COM组件的体系结构。
·第29章“ADO.NET实体框架”:把对象从数据库映射到代码中总是一个麻烦、有时甚至很困难的过程。ASP.NET 3.5 SP1引入的ADO.NET实体框架使这个任务简单了许多。使用Visual Studio 2008 SP1可以可视化地设计实体数据模型,非常容易地在代码中访问这些模型,允许ADO.NET实体框架处理与底层数据库的连接和事务。
·第30章“ASP.NET动态数据”:ASP.NET 3.5 SP1提供的这个新特性可以快速、方便地从数据库中建立报表和数据输入应用程序。还可以提取这些功能,将其集成到已有的应用程序中。
·第31章“建立和使用服务”:在过去的几年中,XML Web服务占据了垄断地位。.NET中Web服务模型的一个主要方面就是ASP.NET。本章介绍XML Web服务的建立过程,以及在ASP.NET应用程序中如何使用它们。然后描述如何建立利用SOAP标题的XML Web服务,以及如何使用这类特殊的服务。
·第32章“ADO.NET数据服务”:ADO.NET数据服务是ASP.NET 3.5 SP1提供的另一个新特性,它允许使用实体数据模型创建Restful服务层。使用这个功能可以快速建立一个服务层,以便把内容呈现为AtomPub或JSON,允许用户与底层的数据库完全地交互操作。
·第33章“本地化”:开发人员通常用英语构建Web应用程序,随着应用程序用户的不断扩大,开发人员发现需要将应用程序全球化。当然,最理想的办法是从一开始就建立能应对世界各地用户的Web应用程序。但在许多情况下,这是不可能的,因为它需要大量额外的工作。ASP.NET为Web应用程序的国际化提供了一种不同凡响的方式。API的巨大改进、服务器控件的新增功能,甚至Visual Studio本身都使Web应用程序的国际化变得非常简单。本章就介绍构建国际化的Web应用程序时应考虑的一些重要事项。
·第34章“配置”:ASP.NET中的配置是一个很大的主题,因为ASP.NET小组不是在建立黑盒子,而是以一种便于以后扩展的方式建立ASP.NET的底层功能。本章讲述如何使用各种配置文件修改ASP.NET的功能和操作方式。
·第35章“测试”:ASP.NET 3.5为把测试技术应用于应用程序提供了强大的功能。ASP.NET框架包括性能计数器、处理Windows Event Tracing系统的功能、跟踪应用程序的新方式(参见本书的第24章)和本章讨论的内容—— 健康监控系统,它可以在应用程序的生命周期内记录许多不同的事件。本章将深入探讨这个健康监控系统。
·第36章“管理”:ASP.NET小组除了让开发人员在建立ASP.NET应用程序时更轻松、效率更高之外,还花了大量的精力来简化应用程序的管理。过去,使用ASP.NET 1.0/1.1管理ASP.NET应用程序时,必须改变XML配置文件中的值。本章将概述这个版本中新增的GUI工具,利用它可以方便、高效地管理Web应用程序。
·第37章“打包和部署ASP.NET应用程序”:构建好ASP.NET应用程序之后应该干什么呢?本章进一步介绍建立过程,说明如何打包ASP.NET应用程序以便于部署。有许多选项可用于处理安装程序和编译模型,以改变为用户提供的内容。
·附录A“迁移ASP.NET旧项目”:在一些情况下,要从头开始构建ASP.NET 3.5应用程序—— 从一开始,所有的内容都是新的。但在许多情况下,并不需要这么做。而需要迁移以前用.NET Framework 1.0、1.1或2.0版本构建的ASP.NET应用程序,使它们能在.NET Framework 3.5上运行。本附录就介绍如何把ASP.NET 1.x或2.0项目迁移到3.5框架上。
·附录B“ASP.NET终极工具”:本附录介绍ASP.NET开发人员可以使用的工具,其中有许多工具有助于加速开发过程,在许多情况下,还可以使读者成为更好的开发人员。
·附录C“Silverlight 2和ASP.NET”:这种技术在开发过程中称为WPF/E,现在称为Silverlight,它是使用XAML建立流体应用(fluid application)的一种方式。这种新技术可以让开发人员开发出真正基于矢量的应用程序。
·附录D“ASP.NET大于ASP.NET MVC”:ASP.NET MVC是ASP.NET最新添加的主要功能,它给开发团体带来了许多令人兴奋的亮点。ASP.NET MVC提供了一种许多开发人员期待的方式,允许使用“模块/视图/控制器”模型创建ASP.NET。ASP.NET MVC为开发人员在其建立的应用程序中提供了可测试性、灵活性和可维护性。注意,ASP.NET MVC并不是许多人熟知和喜欢的ASP.NET的替代,而只是构建应用程序的另一种方式。
·附录E“ASP.NET在线资源”:本附录列出了一些有价值的在线资源,便于读者进一步理解ASP.NET。
0.7 源代码
在读者学习本书中的示例时,可以手工输入所有的代码,也可以使用本书附带的源代码文件。本书使用的所有源代码都可以从本书合作站点http://www.wrox.com/或www.tupwk.com.cn/downpage上下载。登录到站点http://www.wrox.com/,使用Search工具或使用书名列表就可以找到本书。接着单击本书细目页面上的Download Code链接,就可以获得所有的源代码。
注释:
由于许多图书的标题都很类似,因此按ISBN搜索是最简单的,本书英文版的ISBN是978-0-470-47826-4。
在下载了代码后,只需用自己喜欢的解压缩软件对它进行解压缩即可。另外,也可以进入http://www.wrox.com/dynamic/books/download.aspx上的Wrox代码下载主页,查看本书和其他Wrox图书的所有代码。
0.8 勘误表
尽管我们已经尽了各种努力来保证文章或代码中不出现错误,但是错误总是难免的,如果您在本书中找到了错误,例如拼写错误或代码错误,请告诉我们,我们将非常感激。通过勘误表,可以让其他读者避免受挫,当然,这还有助于提供更高质量的信息。
请给wkservice@vip.163.com发电子邮件,我们会检查您的反馈信息,如果是正确的,我们将在本书的后续版本中采用。
要在网站上找到本书英文版的勘误表,可以登录http://www.wrox.com,通过Search工具或书名列表查找本书,然后在本书的细目页面上,单击Book Errata链接。在这个页面上可以查看到Wrox编辑已提交和粘贴的所有勘误项。完整的图书列表还包括每本书的勘误表,网址是www.wrox.com/misc-pages/booklist.shtml。
p2p. wrox.com
要与作者和同行讨论,请加入p2p.wrox.com上的P2P论坛。这个论坛是一个基于Web的系统,便于您张贴与Wrox图书相关的消息和相关技术,与其他读者和技术用户交流心得。该论坛提供了订阅功能,当论坛上有新的消息时,它可以给您传送感兴趣的论题。Wrox作者、编辑和其他业界专家和读者都会到这个论坛上来探讨问题。
在http://p2p.wrox.com上,有许多不同的论坛,它们不仅有助于阅读本书,还有助于开发自己的应用程序。要加入论坛,可以遵循下面的步骤:
(1) 进入p2p.wrox.com,单击Register链接。
(2) 阅读使用协议,并单击Agree按钮。
(3) 填写加入该论坛所需要的信息和自己希望提供的其他信息,单击Submit按钮。
(4) 您会收到一封电子邮件,其中的信息描述了如何验证账户,完成加入过程。
注释:
不加入P2P也可以阅读论坛上的消息,但要张贴自己的消息,就必须加入该论坛。
加入论坛后,就可以张贴新消息,响应其他用户张贴的消息。可以随时在Web上阅读消息。如果要让该网站给自己发送特定论坛中的消息,可以单击论坛列表中该论坛名旁边的Subscribe to this Forum图标。
关于使用Wrox P2P的更多信息,可阅读P2P FAQ,了解论坛软件的工作情况以及P2P和Wrox图书的许多常见问题。要阅读FAQ,可以在任意P2P页面上单击FAQ链接。