假如读者已经熟悉了asp 2.0,并正在寻找3.0版本中的实际改变的列表,那么将在下面发现这些信息。假如读者是一个asp的初学者,可以越过本章到下一章,那里循序渐进地介绍了asp对象和它们的用法。 asp 3.0新特性概要 在asp 3.0中,有一些新的特性或经历较大的变化或改进的特性。 1. 无脚本的asp 如早先提到的, asp处理不包括任何脚本的.asp页的速度是很快的,假如你正在创建的站点或web应用程序文件最终可能使用asp,最好让这些文件使用.asp文件扩展名,而不用考虑它们是包含服务器端脚本还是仅仅包含静态( html和文本)内容。 2. 新的流向控制能力 到目前为止,假如想把执行转向另外的一个asp页,不得不使用response.redirect语句,这个工作通过向客户端发送一个响应来指示其载入新的页面来实现。然而这对客户端来讲是费事的。而且当代理服务器用于客户端时,会引起错误的消息。asp 3.0为server对象提供了两个新的方法,允许在服务器上转换页面而不需要新的客户端的请求。 server.transfer是转换执行到另一个页面;而server.execute是执行另一个页面,然后将控制返回原来的页面。在新的页面里可访问原来页面的环境,包括response 和request等所有asp对象,但是不能访问页面范围的变量。假如原始的页面使用了一个事务标志(在开放的< % @ . . . % >元素中),事务的环境被传递到新的页面。假如第二个asp文件的事务标志表明事务是受到支持的或需要的,则现有的事务将被使用,而不会开始一个新的事务。 3. 错误处理和新的asperror对象 通过提供一个用server.transfer方法自动调用的定制的asp页面,提供了可配置的错误处理。在这个asp页面中,server.get last error可被用来返回一个asp error对象的实例,其中包含了错误的细节,例如错误的描述和相关的行号。 4. 编码后的asp脚本 asp脚本和客户端脚本现在可以使用base 64加密法进行编码。更高水平的加密计划将出现在asp的未来新版本里(注意,这个特征是由vbscript 5.0和jscript 5.0脚本引擎实现的,因此在脚本被执行时要求这些引擎存在)。编码后的脚本将在运行时由脚本引擎解码。因此不必使用别的工具,尽管这不是很安全的加密方法,但能够保护脚本不被一般的用户浏览和拷贝。 5. 包含脚本文件的一种新方式 除了使用<!--#include...-->元素使服务器端的iis包含脚本代码文件, asp 3.0也能够“包含”其自己。<script >元素与runat=“server”和src =“path_and_filename”属性共同使用,来包含基于服务器的脚本代码文件。相对的物理路径或虚拟路径也可以用在src属性中: 6. server scriptlets asp 3.0支持一种强有力的新的脚本技术,称之为server scriptlets。这些是驻留在服务器上的xml格式的文本文件,可以像一般的com对象(即active服务器组件)为asp所用。这样可以把web应用程序的业务逻辑脚本过程更容易地实现为一个可重用的组件。 7. 增强性能的active服务器组件 asp中的许多active服务器组件得到了改进,能够提供更好的性能和附加的功能,一个例子就是新的browser capabilities组件。除此之外,还有一些新的组件。例如, xml分析器使应用程序可以处理服务器上的xml格式的数据。同时,提供了ado与xml更加紧密的集成 (通过windows 2000所提供的新的ado 2.5版),这为以xml格式存贮和获取数据,提供了新的机会。 8. 性能 为改善asp和iis的性能和可扩展性,新版本做了大量的工作。这包含asp中的自我调整特征,它可以检测阻塞情况并自动增加可用线程的数量。当请求在执行中受到外部资源的阻塞时, asp能够检测出来,并为同时执行附加请求和继续正常处理提供更多的线程。但是, 假如cpu变得超负荷, asp会减小可用线程的数量,以便当过多的非阻塞请求同时执行时,将线程切换次数最小化。 对asp 2.0的改进 下面的一些特征是从2 . 0版本中改进或升级来的。 1. 缓冲缺省为打开状态 asp提供可选的输出缓冲。从iis 4.0开始,这使得脚本执行得更快,并提供对流向浏览器的输出的控制能力。在asp 3.0这个改进的性能通过改变response.buffer属性的缺省设置为true而反映出来。缺省状态下缓冲是打开的,这意味着最终的输出只有在进程完成时,或脚本调用response.flush或response.end方法时,才送至客户端。 注意,可以通过设置response.buffer属性为false,关闭缓冲。只有这样,才能发送xml格式化输出给客户端,让xml分析器在收到输出后开始工作。也可以使用response.flush发送大页面的一部分,这样使用户可以很快看到部分输出。 2. response.isclientconnected的变化 response.isclientconnected属性可以在没有任何内容发送给客户端的情况下被读取到。在asp 2.0中,这只在至少有一部分内容被发送后才能返回准确的信息。这一改进解决了iis必须响应每个客户的请求(即使客户可能已经转移到另一个页面或站点)的问题。同时如客户在3秒内没有再连接,服务器上创建的完整的输出信息将被丢弃。 3. 带有默认文档的查询字符串 假如一个用户访问一个站点而不提供所请求页面的名字,默认的文档(如存在的话)将被送往客户端。然而假如他们提供了附在url后面的查询字符串,这在早先的asp版本中是被忽略的,而在iis 5.0 和asp 3.0 中这个查询子符串将被送到缺省页面。例如,在一个url为:http://www.wrox.com/store/的目录中缺省页面为default.asp,则下面这两种情况都将名称/值对code=1274送往default.asp页面: 4. 服务器端包含文件的安全性 服务器端的包含文件常用于一些敏感的信息,如数据库连接字符串或其他访问细节。一个虚拟的路径(即url而不是完整的物理磁盘文件路径)可以用来指定这些文件。在这种情况下,早先的asp版本不核对文件的安全设置和用户的证书;换句话说,授权(验证后)的用户和匿名的web服务器帐号都没有与文件的访问控制列表相比较。在iis 5.0和asp 3.0,这些证书将被检查以防止非授权访问。 5. 可配置项移到元数据库中 在iis 5.0中processorthreadmax和errorstontlog的注册项被移到元数据库中,所有的asp可配置参数能够通过active directory和active directory服务接口( adsi )在元数据库中修改。 6. 应用程序中的双线程对象的性能 为了在常有多个并发请求的asp中获得最佳性能,组件应是双线程的( both-threaded )—即单线程单元(single threaded apartment,sta)和多线程单元(multi-threaded apartment,mta ),并且支持com free-thread marshaller(ftm)。不支持ftm的双线程的com对象假如被存储在asp application状态对象中,将导致运行失败。 7. 更早释放com对象 在iis 5.0中,实例化的对象或组件可更早释放。在iis 4.0中,com对象只有在asp处理完一个页面时才能释放。在iis 5.0中,假如一个com对象不使用onendpage方法,且对象的引用计数达到零,则这个对象在处理完成之前就被释放了。 8. 缺省时asp允许进程外组件 定制的本地服务器组件现在可以从iis中被实例化,而不需要改变元数据库的设置。控制本地服务器实例化的元数据库属性aspallowoutofproccomponents缺省值为1,在iis早期版本为0。 9. com对象的安全性 iis使用了新的由com +提供的cloaking特性,因此,从asp实例化的本地服务器应用程序可以运行在原始的客户的安全环境中。在早期版本中,安全环境被指派到本地服务器com对象,依赖于调用进程的身份。 10. 缺省时组件运行在进程外 在asp早期版本中,所有在asp页面环境中创建的组件缺省时运行在进程内。 为在组件的性能和web服务器安全性之间折衷,对于一个虚拟的应用程序,可以从properties对话框中application protection的三个选项中选择: low (iis process) 这种设置的asp虚拟应用程序的所有应用程序可执行文件和组件都运行在web服务器可执行文件( inetinfo.exe )的进程(即内存空间)中。因此,web服务器就有受到可执行文件或组件失败影响的风险,然而这提供了最快的和最少资源浪费的应用程序执行选项。 medium (pooled)—这是缺省设置 这种设置的asp虚拟应用程序的所有应用程序可执行文件和组件都运行在单个共享的dllhost.exe实例的进程(即内存空间)中。这保护了web服务器可执行文件( inetinfo.exe )免受任何一个可执行文件或组件失败带来的风险。然而,可执行文件或组件的失败会引起 dllhost.exe进程失败,进而所有其他驻留其中的可执行文件和组件也会失败。 high (isolated) 这种设置的asp虚拟应用程序的所有应用程序可执行文件和组件都运行在单个dllhost.exe实例的进程(即内存空间)中,但是每个asp应用程序都有自己的dllhost.exe实例。dllhost.exe对应用程序而言是独有的,这保护web服务器可执行文件免受任何一个可执行文件或组件失败带来的危险,同时也保护了虚拟应用程序,免受因其他虚拟应用程序的可执行文件或组件失败带来的问题。微软建议在任何一个web服务器上最多驻留10个隔离的虚拟应用程序。 推荐的配置是:在它们自己的进程中运行对于任务关键的应用程序,即high (isolated);余下的所有应用程序在一个共享的进程中运行,即medium (pooled)。也可设置组成每个虚拟应用程序的脚本和组件的执行权限(execute permission),三个选项是: 1) none:在这个虚拟的应用程序中不能运行脚本或可执行文件。在实际效果上,这提供了一个在必要时快速和简便地禁止一个应用程序的方式。 2) scripts only:仅允许脚本文件,诸如asp、idc或其他,能够在这个虚拟应用程序中运行,可执行文件不能运行。 3) scripts and executables:允许任何脚本和可执行文件在这个虚拟应用程序中运行。 vbscript 5.0中的新特性 能够在asp中应用的特性包括了那些由脚本引擎所提供的特性,这意味着vbscript的改进也可在asp中应用。vbscript的改进如下所述。 1. 在脚本中使用类 在vbscript中实现完整的vb类( class )模型,但明显的例外是在asp服务器端的脚本事件。可以在脚本中创建类,使它们的属性和方法能够用于页面的其余代码,例如: 这段代码产生如下结果: value of halfvalue property is 21 result of getresult method is 42 2. with结构 vbscript 5.0支持with结构,使访问一个对象的几个属性或方法的代码更加紧凑: 3. 字符串求值 eval函数(过去只在javascript和jscript中可用)目前在vbscript 5.0中已经得到了支持。它允许创建包含脚本代码的字符串,值可为true或false,并在执行后可得到一个结果: 4. 语句执行 新的execute函数允许执行一个字符串中的脚本代码,执行方式与eval函数相同,但是不返回结果。它可以用来动态创建代码中稍后执行的过程,例如: 一个回车返回(如程序中示)或冒号字符“:”可用来分隔一个字符串中的各条语句。 5. 设置地区 新的setlocale方法可以用来改变脚本引擎的当前地区,可正确显示特殊的地区特定字符,如带重音符的字符或来自不同字符集的字符。 6. 正则表达式 vbscript 5.0 现在支持正则表达式(过去只在javascript、jscript和其他语言中可用)。regexp对象常用来创建和执行正则表达式,例如: 7. 在客户端vbscript中设置事件处理程序 这不是直接应用于asp的脚本技术,这个新的特性在编写客户端的vbscript时是很有用的。现在可以动态指定一个函数或子程序与一个事件相关联。例如,假设一个函数的名称为myfunction(),可把它指定给按钮的onclick事件: 这提供了javascript和jscript 中的类似功能,函数可以被动态地指定为一个对象的属性。 8. vbscript中的on error goto 0 尽管这个技术早先没有被文档记载,但在现有的vbscript版本中能够使用(有着v b背景并且有好奇心的人可能早已发现这个秘密)。它现在已被记录在文档中,并且在执行on error resume next后能够用来“关闭”页面中的定制错误处理。结果是任何后来的错误将引发一个浏览器级或服务器级的错误及相应的对话框/响应。 jscript 5.0中的新特性 jscript 5.0唯一的改变是引入了错误处理。 java风格的try和catch结构在jscript 5.0中得到了支持。例如: 内建的jscript error对象有3个属性,它们定义了上次的运行期错误。可在catch块中使用它们获得有关错误的更多信息。 假如你想抛出自己的错误,可用一个定制的异常对象引发一个错误(或异常)。然而,由于没有内建的异常对象,必须自己定义一个结构: 这样的对象可用来在页面中引发定制的异常。这通过使用throw关键字,然后检查catch块中的异常类型来实现: 其他的新特性 还有几个新特性已经能够在iis 5.0中使用了。 1. dav(distributed authoring and versioning ) 这个标准由internet engineering task force (ietf)创建,目前为1.0版本。它允许作者在几个不同的位置共同创建和维护we b页和其他的文档。它用于提供上载( upload )和下载访问,并控制版本号使工作过程能够得到相应的管理, ie包含与iis 5.0中的dav的集成的特性。但是,在iete标准和当前的iis 5.0版本中,尚未实现版本控制能力。 2. 引用类型库 在过去,常常使用服务器端的包含文件,把常数从一个类型库(例如脚本对象、ado或msmq )增加到asp页面。这是必须的,因为asp不能像vb那样创建对类型库或组件dll的引用。在iis 5.0中,不必再为常数使用包含文件。可以在<head >部分放一个html注释风格的元素,来直接访问一个组件的类型库。 这将使指定文件中的常量在当前asp页面中都可用(尽管这是iis 5.0中的一个新特性,但在iis 4.0中虽没有记入文档,但已经可以使用了)。 3. ftp 下载续传 ftp服务现在终于提供了下载的续传功能。假如一个文件部分下载后停止,它能够从断点处继续下载。这意味着没有完成下载的文件不需要再次下载整个文件。 4. http压缩 iis现在能够自动实现对静态或动态产生的文件的http数据流压缩并高速缓存压缩的静态文件。在与适当地准备好的客户端通信时,这会提供更快的响应并减少网络的负载。