当前位置:

高性能WEB开发(1) - flush让页面分块,逐步呈现

2012-3-25 13:31  作者:炉石    阅读:2391

 

在处理比较耗时的请求的时候,我们总希望先让用户先看到部分内容,让用户知道系统正在进行处理,而不是无响应。一般大家在处理这种情况,都使用 ajax,先把html输出到客户端,然后再用ajax取加载比较耗时的资源。用ajax麻烦的地方是增加了请求数,而且需要写额外的js代码、和js 用的请求接口。

正对这种情况,还有一种处理方法,就是让response分块编码进行传输。response分块编码,可以先传输一部分不需要处理的html代码到客户端,等其他耗时代码执行完毕后再传输另外的html代码。

分块编码(chunked encoding)

chunked encoding http1.1 才支持编码格式(当然目前没有哪个浏览器不支持1.1)chunked encoding 与一般的响应区别如下:

正常的响应:

HTTP/1.1 200 OK

Cache-Control: private, max-age=60

Content-Length: 75785

Content-Type: text/html; charset=utf-8

..其他response headers

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

 

chunked encoding 响应:

HTTP/1.1 200 OK

Cache-Control: private, max-age=60

Content-Length: 75785

Content-Type: text/html; charset=utf-8

Transfer-Encoding: chunked

..其他response headers

 

chunk #1(这里通常是16进制的数字,标志这个块的大小)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"....

 

chunk #2

<div .....

 

chunk #3

....</body></html>

Asp.net

 

<div>

<img src="http://shop.happycz.com/images/20090812/qs_998_100.gif" />

</div>

<%

Response.Flush();

System.Threading.Thread.Sleep(1000 * 10);

%>

<div>

<img src="http://qiushen.ftgoal.com/images/bd_info_imgg.gif" />

</div>