我已经在一些ASP.NET页面上实现了GZIP压缩,使用了一个继承自System.Web.UI.Page的类,并实现了OnLoad方法来进行压缩,如下所示:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (Internet.Browser.IsGZIPSupported())
{
base.Response.Filter = new GZipStream(base.Response.Filter, CompressionMode.Compress, true);
base.Response.AppendHeader("Content-encoding", "gzip");
base.Response.AppendHeader("Vary", "Content-encoding");
}
else if (Internet.Browser.IsDeflateSupported())
{
base.Response.Filter = new DeflateStream(base.Response.Filter, CompressionMode.Compress, true);
base.Response.AppendHeader("Content-encoding", "deflate");
base.Response.AppendHeader("Vary", "Content-encoding");
}
}
IsGZIPSupported方法仅确定浏览器是否支持GZIP,查看Accept-encoding请求标头以及浏览器的用户代理(IE5-6是否从GZIP压缩中排除)。但是,使用此代码,我在IE中获取网页已过期消息,当我从页面回发并尝试使用后退按钮时。将缓存控制设置为私有似乎可以解决问题:
base.Response.Cache.SetCacheability(HttpCacheability.Private);
但我不确定为什么,或者这是否会导致其他问题。我没有为站点中的任何其他页面设置任何缓存,并且该站点在只有十几个并发用户的Intranet上运行,因此性能目前不是一个大问题。
答案 0 :(得分:2)
Vary
标题上的See this article和WinInet / MSIE
您似乎应该发送Vary: Accept-Encoding
而不是Vary: Content-Encoding
,因为响应会因请求标头而异。