<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[静怡家园]]></title> 
<link>http://www.zhanghaijun.com/index.php</link> 
<description><![CDATA[书山有路勤为径，学海无涯苦作舟！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[静怡家园]]></copyright>
<item>
<link>http://www.zhanghaijun.com/post//</link>
<title><![CDATA[ASP技巧集锦（官方权威版）-6]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[Web开发]]></category>
<pubDate>Sun, 24 Jun 2007 17:49:17 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//</guid> 
<description>
<![CDATA[ 
	技巧 16：在开始长时间的任务之前先使用 Response.IsClientConnected <br/>　　如果用户失去耐心，他们可以在开始执行他们的请求之前放弃 ASP 页。如果他们单击了 Refresh 或跳转到服务器的其他页上，在 ASP 请求队列的末尾将有一个新的请求，而在队列的中间有一个断开连接的请求。这通常发生在服务器处于高负荷的情况下（它有一个很长的请求队列，相应的响应时间也很长），这只能使情况更糟。如果用户不再连接，将没有执行 ASP 页的点（特别是低速、重量级的 ASP 页）。可以使用 Response.IsClientConnected 属性检查这种情况。如果它返回 False，则应调用 Response.End 并放弃该页的剩余内容。实际上，每当 ASP 要执行新的请求时，IIS 5.0 便将该方法编码，来检查队列中的请求有多长。如果在那里超过了 3 秒钟，ASP 会检查客户是否仍然连接着，如果客户已断开连接，就立即结束该请求。您可以使用 metabase 中的 AspQueueConnectionTestTime 设置，调整这 3 秒的超时时间。<br/>　　如果有某页执行了很长时间，您可能还想按一定的时间间隔检查 Response.IsClientConnected。在启用响应缓冲之后，按一定的时间间隔执行 Response.Flush，告诉用户正在进行的是哪些事情，是个好办法。<br/>　　注意 在 IIS 4.0 中，Response.IsClientConnected 将不能正常工作，除非首先执行 Response.Write。如果启用了缓冲，也需要执行 Response.Flush。在 IIS 5.0 中则不必如此 - Response.IsClientConnected 工作得很好。在任何情况下，Response.IsClientConnected 都要有些开销，所以，只有在执行至少要用 500 毫秒（如果想维持每秒几十页的吞吐量，这是一个很长的时间了）的操作前才使用它。作为通常的规则，不要在紧密循环的每次迭代中调用它，例如当绘制表中的行，可能每 20 行或每 50 行调用一次。<br/>　　<br/>　　技巧 17：使用 &lt;OBJECT&gt; 标记实例化对象 <br/>　　如果需要引用不能在所有代码路径中使用的对象（尤其是服务器 - 或应用程序 - 作用域的对象），则使用 Global.asa 中的 &lt;object runat=server id=objname&gt; 标记来声明它们，而不是使用 Server.CreateObject 方法。Server.CreateObject 立刻创建对象。如果以后不使用那个对象，就不要浪费资源。&lt;object id=objname&gt; 标记声明了 objname，但实际上 objname 此时并没有创建，直到它的方法或属性第一次被使用时才创建。<br/>　　这是迟缓计算的另一个例子。<br/>　　<br/>　　技巧 18：使用 ADO 对象和其他组件的 TypeLib 声明 <br/>　　当使用 ADO 时，开发人员经常包含 adovbs.txt 来获得对 ADO 不同常量的访问权。该文件必须包含在要使用这些常量的每一页中。该常量文件非常大，给每个 ASP 页增加了很多编译时间和脚本大小方面的开销。<br/>　　IIS 5.0 提供了绑定到组件类型库的能力。允许您在每个 ASP 页上引用一次类型库并使用它。每页不需要为编译常量文件付出代价，并且组件开发人员不必为在 ASP 中的使用而生成 VBScript #include 文件。<br/>　　要访问 ADO 类型库，请将下列语句之一放入 Global.asa 中。<br/>　　&lt;!-- METADATA NAME=&quot;Microsoft ActiveX Data Objects 2.5 Library&quot; TYPE=&quot;TypeLib&quot; UUID=&quot;{00000205-0000-0010-8000-00AA006D2EA4}&quot; --&gt; <br/>　　或者<br/>　　&lt;!-- METADATA TYPE=&quot;TypeLib&quot; FILE=&quot;C:&#92;Program Files&#92;Common Files&#92;system&#92;ado&#92;msado15.dll&quot; --&gt;<br/>　　<br/>　　技巧 19：利用浏览器的验证能力 <br/>　　流行的浏览器具有对以下功能的高级支持，例如 XML、DHTML、Java 小程序以及远程数据服务。请尽量利用这些功能。所有这些技术，都可以通过执行客户端的验证和数据缓存，减少了与 Web 服务器之间的往返。如果您正在运行智能浏览器，该浏览器可以为您进行一些验证（例如，在运行 POST 之前检查信用卡的校验和否有效）。重申一次，请尽量使用这些功能。由于削减了客户端到服务器的往返路程，将减少对 Web 服务器的压力，并且削减了网络通信量（虽然发送给浏览器的初始页面可能更大），服务器访问的所有后端资源也削减了。而且用户不必经常提取新页，使用户的感受好一些。这并不减轻对服务器端验证的需要。还是应该经常进行服务器端的验证。这样能够防止由于某些原因从客户端来的坏数据，例如黑客，或者不运行客户端验证程序的浏览器。<br/>　　许多站点由独立于浏览器创建的 HTML 组成。这一点经常阻碍开发人员利用可以提高性能的流行浏览器功能。对于真正高性能的、必须关心浏览器的站点，良好的策略是针对流行的浏览器优化您的页面。在 ASP 中使用“浏览器性能组件”，很容易检测到浏览器的功能。诸如 Microsoft FrontPage 等工具，能帮助您设计使用所希望的目标浏览器和 HTML 版本的代码。更详细的讨论，请查看 When is Better Worse? Weighing the Technology Trade-Offs（英文）。<br/>　　<br/>　　技巧 20：在循环中避免字符串串联 <br/>　　许多人在循环中创建类似这样的字符串：<br/>　　s = &quot;&lt;table&gt;&quot; &amp; vbCrLf<br/>　　For Each fld in rs.Fields<br/>　　 s = s &amp; &quot; &lt;th&gt;&quot; &amp; fld.Name &amp; &quot;&lt;/th&gt; &quot;<br/>　　Next<br/>　　While Not rs.EOF<br/>　　 s = s &amp; vbCrLf &amp; &quot; &lt;tr&gt;&quot;<br/>　　 For Each fld in rs.Fields<br/>　　 s = s &amp; &quot; &lt;td&gt;&quot; &amp; fld.Value &amp; &quot;&lt;/td&gt; &quot;<br/>　　 Next<br/>　　 s = s &amp; &quot; &lt;/tr&gt;&quot;<br/>　　 rs.MoveNext<br/>　　Wend<br/>　　s = s &amp; vbCrLf &amp; &quot;&lt;/table&gt;&quot; &amp; vbCrLf<br/>　　Response.Write s<br/>　　这种方法有几个问题。首先，重复连接字符串所花费的时间，以二次方曲线的速率增长；粗略地计算，运行循环所花费的时间，与记录数乘以字段数的平方成正比。举一个简单的例子，便能清楚地说明这一点。<br/>　　s = &quot;&quot;<br/>　　For i = Asc(&quot;A&quot;) to Asc(&quot;Z&quot;)<br/>　　 s = s &amp; Chr(i)<br/>　　Next<br/>　　在第一次迭代中，得到一个字符的字符串“A”。在第二次迭代中，VBScript 必须重新分配字符串并复制两个字符“AB”到 s。在第三次迭代中，它必须再次重新分配 s，并复制三个字符到 s。在第 N 次（26 次）迭代中，它必须重新分配并复制 N 个字符到 s。就是 1+2+3+...+N 的和，为 N*(N+1)/2 次复制。<br/>　　在以上记录集的例子中，如果有 100 条记录和 5个字段，则内部的循环将执行 100*5 = 500 次，并且完成所有复制和重新分配所花费时间，将与 500*500 = 250,000 成正比。对一个大小适度的记录集，将有很多次复制。<br/>　　在该例子中，代码可以改进：字符串的连接将被 Response.Write() 或内嵌脚本 (&lt;% = fld.Value %&gt;) 所替代。如果打开响应缓冲，这个操作将会很快，因为 Response.Write 仅仅将数据添加到响应缓冲的末尾。不再重新分配，因而非常有效。<br/>　　特别是在将 ADO 记录集转换到 HTML 表时，请考虑使用 GetRows 或 GetString。<br/>　　如果用 JScript 连接字符串，强烈建议使用 += 操作符；即用 s += &quot;某字符串&quot;， 而不是 s = s + &quot;某字符串&quot;。 
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post//#blogcomment</link>
<title><![CDATA[[评论] ASP技巧集锦（官方权威版）-6]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>