日期:2012-10-24  浏览次数:21022 次

技巧 19: 利用浏览器的验证功能


现今的浏览器对一些高级功能如 XML、DHTML、Java 小程序和远程数据服务提供支持。尽可能使用这些功能。所有这些技术都可以执行客户机端验证和数据缓存,免去了到 Web 服务器的往返。如果您在运行一个智能浏览器,那么浏览器就能为您进行一些验证(例如,在执行 POST 之前,检查信用卡校验和是否有效)。尽可能使用这一功能。通过减少客户-服务器之间的往返,可降低 Web 服务器上的负载,并能减少网络通信量(虽然发送到浏览器的第一个页面可能比较大)以及服务器访问的任何后端资源。此外,用户不必像住常一样读取新页,从而用户的感觉会好一些。这样做并不意味着您可以不进行服务器端验证 - 您还应始终进行服务器端验证。这可以防止由于某种原因(如黑客,或浏览器不运行客户机端验证例程)客户机产生错误的数据。
人们已经进行了大量的工作,开发“独立于浏览器”的 HTML。正是由于这种忧虑,开发人员不愿再使用流行的浏览器功能,但这些功能本可以改善性能。对于一些真正的高性能站点,必须关心浏览器“访问”问题,一个好的策略是优化页面,使其适应流行的浏览器。使用浏览器功能组件,可以在 ASP 中方便地检测到浏览器功能。Microsoft FrontPage 等工具有助于设计适合于浏览器和指定 HTML 版本的代码。参见 When is Better Worse?Weighing the Technology Trade-Offs,以了解更进一步的讨论。

技巧 20:避免在循环语句中使用字符串串联


许多人在循环语句中建立一个字符串,如下所示:
s = ?<table>? & vbCrLf
For Each fld in rs.Fields
s = s & ? <th>? & fld.Name & ?</th> ?
Next

While Not rs.EOF
s = s & vbCrLf & ? <tr>?
For Each fld in rs.Fields
s = s & ? <td>? & fld.Value & ?</td> ?
Next
s = s & ? </tr>?
rs.MoveNext
Wend

s = s & vbCrLf & ?</table>? & vbCrLf
Response.Write s

采用这种方法会出现一些问题。第一个问题是反复串联字符串需要花两次方的时间,更通俗地说,运行这种循环语句所花的时间与记录数乘以字段数所得值的平方成正比。举一个更简单的例子,就可以更清楚地说明这一问题。
s = ??
For i = Asc(?A?) to Asc(?Z?)
s = s & Chr(i)
Next

在第一次迭代中,您获得了一个字符的字符串 ?A?。在第二次迭代中,VBScript 必须重新分配字符串并将两个字符 (?AB?) 复制到 s 中。在第三次迭代中,它还必须再次重新分配 s 并将三个字符复制到 s 中。在 N 次(第 26 次)迭代中,它必须重新分配并将 N 个字符复制到 s 中。总共就是 1+2+3+...+N,即 N*(N+1)/2 次复制。
在上面的记录集举例中,如果有 100 个记录和 5 个字段,内循环将执行 100*5 = 500 次,所有的复制和重新分配所花的时间与 500*500 = 250,000 成正比。这对于中等大小的记录集来说复制操作太多了。
在本例中,代码可以用 Response.Write() 或内嵌脚本 (<% = fld.Value %>) 替代字符串串联来改进。如果启用了响应缓冲的话(应该的),这样做就会更快,因为 Response.Write 只将数据附加到响应缓冲的末尾。并不涉及重新分配,因此效率很高。
在将 ADO 记录集转换为 HTML 表的特定情况下,应考虑使用 GetRows 或 GetString。
如果在 JScript 中串联字符串,特别建议使用 += 运算符,即,使用 s += ?某字符串?,而不使用 s = s + ?某字符串?。

技巧 21:启用浏览器和代理缓存


在默认情况下,ASP 禁止在浏览器和代理中进行缓存。这是有意义的,因为就实质而言 ASP 页面是动态的,上面有随时间不断变化的潜在信息。如果页面不要求在每个视图上进行刷新,您应启用浏览器和代理缓存。这可使浏览器和代理在一定的时间内使用页面的“缓存”副本,您可以控制时间的长短。缓存可以大大减轻服务器上的负载,缩短用户的等待时间。
哪一种动态页面可作为要缓存的页面呢?下面举一些例子:
  • 天气预报页面,在此页面上,每隔 5 分钟更新一次天气预报。
  • 列出新闻条目或新闻稿的主页,它一天更新两次。
  • 共同基金业绩列表,在此列表中,基本统计信息每隔几小时更新一次。

注意,在使用浏览器或代理缓存的情况下,Web 服务器上记录的访问次数减少了。如果您想准确地测量所有页面视图或张帖公布,您就不希望使用浏览器和代理缓存。
浏览器缓存由 HTTP“过期”报头控制,该报头由 Web 服务器发送给浏览器。ASP 提供两个简单的机制发送此报头。要设置页面使其过多少分钟后到期,则应设置 Response.Expires 属性。下面的例子告诉浏览器内容在 10 分钟内过期:
<% Response.Expires = 10 %>

若将 Response.Expires 设置为负数或 0,则禁用缓存。一定要使用大的负数,如 -1000(略多于一天),以避免服务器和浏览器时钟之间的不匹配。第二个属性 Response.ExpiresAbsolute 将使您设置内容过期的具体时间:
<% Response.ExpiresAbsolute = #May 31,2001 13:30:15# %>

您可以不使用 Response 对象设置过期时间,而将 <META> 标记写进 HTML,通常写在 HTML 文件的 <HEAD> 部分。一些浏览器将遵照此指令,而代理则不然。
<META HTTP-EQUIV=?Expires? VALUE=?May 31,2001 13:30:15?>

最后,您可以使用 Response.CacheControl 属性,指示其内容是否可以让 HTTP 代理缓存。若将此属性设置为“Public”,代理就可以缓存此内容。
<% Response.CacheControl = ?Public? %>

在默认情况下,此属性被设置为“Private”。注意,对于显示某用户特定数据的页面,不应启用代理缓存,因为代理可能给用户提供属于其他用户的页面。

技巧 22:尽可能使用 Server.Transfer 代替 Response.Redirect


Response.Redirect 让浏览器请求另一个页面。此函数常用来将用户重定向到一个登录或错误页面。因为重定向强制请求新页面,结果是浏览器必须到 Web 服务器往返两次,且 Web 服务器必须多处理一个请求。IIS 5.0 引入了一个新的函数 Server.Transfer,它将执行转移到同一台服务器上的另一个 ASP 页。这样就避免多余的浏览器-Web-服务器的往返,从而改善了总体系统性能以及缩短了用户的响应时间。检查“重定向”中的“新的方向”,上面应该是 Server.Transfer 和 Server.Execute。
另请参见 Leveraging ASP in IIS 5.0,了解 IIS 5.0 和 ASP 3.0 新功能的完整列表。

技巧 23:在目录 URL 中使用后斜杠


一个相关的技巧是确保在指向目录的 URL 中使用后斜杠 (/)。如果您省略了后斜杠,浏览器就会向服务器发出请求,只是为了告诉服务器,它在请求目录。浏览器就会发出第二个请求,将斜杠附加到 URL 后面,只有此后,服务器才能以该目录的默认文档或目录列表(如果没有默认文档且启用了目录浏览的话)响应。附加斜杠可省去第一个、无用的住返。为便于用户阅读,可以省略显示名称中的后斜杠。
例如,写:
<a href=?http://msdn.microsoft.com/workshop/? title=?MSDN Web
Workshop?>http://msdn.microsoft.com/workshop</a>

这也适用于指向 Web 站点上主页的 URL:使用下面的:<a href=?http://msdn.microsoft.com/?&