asp可以使用response.flush來輸出緩沖,使進度可視化,多用于要輸出大量數(shù)據(jù)的程序里。不過,在使用過程中,flush有時不一定有效,我為此足足研究了半天,最終發(fā)現(xiàn)有兩個意想不到的原因導致flush無效。
原因一:開頭沒有設置 Response.Buffer = true
在網(wǎng)頁代碼的開頭處,不要缺少語句:
<% Response.Buffer = true %>
這是聲明允許輸出緩沖的意思。
我想這個失誤一般人都不會犯了,更加可能的原因是后面兩個。
原因二:GZip壓縮導致Flush無效
如果網(wǎng)站啟用了GZip壓縮,那么會導致flush不一定有效,但也不一定,這要視乎GZip的配置文件MetaBase.xml如何配置。
MetaBase.xml文件的位置在:C:\WINDOWS\system32\inetsrv\,打開這個文件,查找 IIsCompressionScheme ,這里是設置GZip的地方。
找到 HcDynamicCompressionLevel 這行,它的值默認是0,但是很多人會設為9,因為設為9時壓縮率更高一點。然而,當此值為9時,Asp的Flush便變得無效了。此值設為0時,F(xiàn)lush是有效的。
那么0與9對壓縮的影響有多大差異?經(jīng)測試發(fā)現(xiàn),5KB的文件,0時發(fā)送到瀏覽器的體積是0.27KB,9時發(fā)送到瀏覽器的體積是0.19KB??梢娫O為9時壓縮率會大一些,這正是很多人設為9的原因。但如果要想Asp的Flush有效,那么就要犧牲一點壓縮率了。
GZip壓縮導致Flush無效
如果你的網(wǎng)站沒有啟用GZip,那就說明你的Asp Response.Flush無效不是這個原因,請看下面的第三個原因吧。
原因三:網(wǎng)頁字符太少導致flush不起作用
網(wǎng)頁字符太少是什么意思?就是在Flush之前的html字符太少了,也會導致看不到Flush的效果。
這個原因我想大多數(shù)人都沒有想到,包括我們看到很多范例,程序沒有問題,但是就是看不到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字節(jié)的字符串,這時Flush的效果就出來了。
為什么要這樣?是因為緩沖有一個最少字節(jié)數(shù),當網(wǎng)頁開頭的HTML代碼長度達不到最少字節(jié)數(shù)要求時,用Flush輸出緩沖就無效了。