内容提要    ASP.NET 3.5在ASP.NET 2.0 Framework提供的功能的基础上,把Visual Studio 2008的强大功能、C# 2008和Visual Basic 2008中的许多语言改进结合起来,还集成了一个强大的新技术LINQ。再加上IIS 7.0及其托管代码请求处理管道,使Web应用程序的开发有了革命性的飞跃。    ASP.NET 3.5还有一些新增的服务器控件,例如ListView和非常灵活的GridView。它还包含AJAX技术的新改进和Visual Studio 2008中的新JavaScript调试功能。本书修订了非常畅销的《ASP.NET 2.0高级编程》,并添加了数百页新内容和数十个新代码示例,以便于读者学习这些新技术。
ASP.NET 3.5是一个建立Web解决方案的令人惊异的技术。早在ASP.NET 1.0版本于2000年发布时,许多人就认为它在Web应用程序开发方面迈出了具有革命性的一步。而后来的ASP.NET 2.0更激动人心、更富有革命性,ASP.NET 3.5则继续朝着这个方向前进,为在Web上建立应用程序提供了目前最佳的框架。ASP.NET 3.5建立在已发布的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页面的创建。它们的日益流行是因为它们出现在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,看看这个新技术能给自己带来什么。下面就讨论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领域中最高效的开发人员。 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) <%@ Page Language="VB" AutoEventWireup="True" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %> 尽管这里使用了相当多的代码,但与使用传统的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的其他新特性 前面学习了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 在代码中验证用户 VB If (Membership.ValidateUser (Username.Text, Password.Text)) Then Allow access code here End If C# if (Membership.ValidateUser (Username.Text, Password.Text)) { // Allow access code here } 使用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小组的站点,下载一些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 这些站点导航功能为编程访问站点布局提供了极大的便利,甚至也考虑到了类似于终端用户这样的角色如何确定显示站点的哪一部分这类事情。 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页面的