asp可以使用response.flush来输出缓冲,使进度可视化,多用于要输出大量数据的程序里。不过,在使用过程中,flush有时不一定有效,我为此足足研究了半天,最终发现有两个意想不到的原因导致flush无效。
原因一:开头没有设置 Response.Buffer = true
在网页代码的开头处,不要缺少语句:
<% Response.Buffer = true %>
这是声明允许输出缓冲的意思。
我想这个失误一般人都不会犯了,更加可能的原因是后面两个。
原因二:GZip压缩导致Flush无效
如果网站启用了GZip压缩,那么会导致flush不一定有效,但也不一定,这要视乎GZip的配置文件MetaBase.xml如何配置。
MetaBase.xml文件的位置在:C:\WINDOWS\system32\inetsrv\,打开这个文件,查找 IIsCompressionScheme ,这里是设置GZip的地方。
找到 HcDynamicCompressionLevel 这行,它的值默认是0,但是很多人会设为9,因为设为9时压缩率更高一点。然而,当此值为9时,Asp的Flush便变得无效了。此值设为0时,Flush是有效的。
那么0与9对压缩的影响有多大差异?经测试发现,5KB的文件,0时发送到浏览器的体积是0.27KB,9时发送到浏览器的体积是0.19KB。可见设为9时压缩率会大一些,这正是很多人设为9的原因。但如果要想Asp的Flush有效,那么就要牺牲一点压缩率了。
GZip压缩导致Flush无效
如果你的网站没有启用GZip,那就说明你的Asp Response.Flush无效不是这个原因,请看下面的第三个原因吧。
原因三:网页字符太少导致flush不起作用
网页字符太少是什么意思?就是在Flush之前的html字符太少了,也会导致看不到Flush的效果。
这个原因我想大多数人都没有想到,包括我们看到很多范例,程序没有问题,但是就是看不到Flush的效果。
我们看看下面两段代码,第一段代码的Flush是无效的,但第二段代码的Flush就有效了。
代码一:
<% Response.Buffer = true %>
<%
for i = 0 to 50
for n = 0 to 100000
m = n
next
response.write i & "<br>"
response.flush
next
%>
代码二:
<% Response.Buffer = true %>
<div style="display:none">
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
</div>
<%
for i = 0 to 50
for n = 0 to 100000
m = n
next
response.write i & "<br>"
response.flush
next
%>
代码二由于在前面加上了1000个1,即是在前面加上长度为1000字节的字符串,这时Flush的效果就出来了。
为什么要这样?是因为缓冲有一个最少字节数,当网页开头的HTML代码长度达不到最少字节数要求时,用Flush输出缓冲就无效了。
☉asp包含文件#include file和#include virtual有什么区别 (2014-4-14 16:36:56)
☉asp程序定义变量比不定义变量速度快一倍 (2012-5-16 17:29:4)
☉测试发现:.net运行速度比php快70倍 比asp快39倍 (2012-5-15 23:13:55)
☉asp生成utf-8格式文件 (2010-1-12 6:48:39)
☉客户端excel表如何导入远程sql server服务器(asp) (2009-9-12 23:51:46)
☉asp执行ping命令 (2009-9-6 22:49:2)
☉ASP HTTP组件下载、简单介绍、属性方法及使用范例【全】 (2009-8-3 1:40:45)
☉最简单的asp中调用存储过程的实例 (2009-8-1 11:41:50)
☉测试空间是否支持XMLHTTP组件 (2009-7-13 23:8:17)
☉测试空间是否支持ADODB.STREAM的方法 (2009-7-12 12:52:16)
☉asp获取网页源代码并处理乱码的方法 (2009-7-11 22:15:34)
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。