GZIP是一个将压缩技术使用到HTTP上的技术,GZIP技术目前主流的浏览器都是支持的,这是一个通过消耗服务器性能来节省流量的模式。
说起来很简单,它就是让服务器将文件内容压缩并发给浏览器,浏览器接受之后先解压再用来解析,在这种情况下,节省网络流量开支,浏览器传送的文本是很多的,而文本压缩通常都可以到原来文件的20%,这样,通过这种方式能来提高网页加载速度.
我在测试缓存文件生成的时候,将文本直接压缩为GZIP格式来保存,这样的话,我的缓存文件大小由原来的15K左右变为2-3K,大大的节省了网站的空间,当用户访问该文件的时候,我进行判断,如果浏览器是支持GZIP的,我就直接将缓存文件的字节流返回到浏览器,如果浏览器不支持(这种可能性相当低),我反而需要将该文件解压,将解压后的字节流返回到客户端。
以上可以看出,我确实节省了网站的空间和流量,而且因为现在的浏览器95%以上(保守估计,因为我没有听说哪个不支持)都是支持GZIP的,实际上网站的服务端性能反而有提升,这叫有百利而五一害。
如何判断浏览器是否支持GZIP呢?浏览器在发送HTTP请求的时候,会有一个HEAD字段叫Accept-Encoding,代表浏览器支持的返回编码格式,通常为以下值(deflate代表明文):
Accept-Encoding: gzip, deflate
浏览器又如何判断服务端返回的数据是明文还是GZIP格式的呢?也是通过服务端的HEAD字段,例如:
Content-Encoding: gzip
如果该值不是GZIP,则代表为明文,而且,该字段同时也可能代表文本文件的编码,例如utf-8
以下是我具体使用GZIP的做法,首先是缓存的写入过程:
FileStream fileStream=File.Create(path);//创建缓存文件
Stream writer=new GZipOutputStream(fileStream);//将缓存文件流使用GZIP来写入
XsltArgumentList list=new XsltArgumentList();//我的网站是使用XML+XSLT来生成页面的
xslt.Transform(xml,list,writer,null);//将XSLT生成的内容传递到GZIP压缩程序
writer.Close();//完成写入
fileStream.Close();//关闭文件句秉
其次是读取缓存的过程:
if(acceptEncoding!=null && acceptEncoding.IndexOf("gzip")>=0)//通过请求的http head来判断是否支持GZIP
{//如果支持GZIP,返回gzip格式
Response.AddHeader("Content-Encoding","gzip");//通知浏览器该文件是GZIP压缩过的文件
Response.TransmitFile(path);//直接将该文件返回
}
else
{//返回明文格式,这种情况下我们要从ZIP文件之中解压缩出文件内容,不需要发送Content-Encoding Head,因为默认就是明文的
Stream reader=new GZipInputStream(File.OpenRead(path));//打开该文件
byte[] buffer=new byte[1024];//建立文件读取缓存
int p;
while((p=reader.Read(buffer,0,1024))>0)//每次读取到相应的缓存就返回内容
{
Response.OutputStream.Write(buffer,0,p);
Response.Flush();
}
}