【问题标题】:GZIP Compression causing web page expirationGZIP 压缩导致网页过期
【发布时间】:2010-12-18 05:18:52
【问题描述】:

我已经在我的一些 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 上运行,因此目前性能不是大问题。

【问题讨论】:

  • 为什么不在 IIS 中打开它? weblogs.asp.net/owscott/archive/2004/01/12/57916.aspx
  • @ck:并非总是可以访问 IIS 控制台,例如您在网络酒店上托管您的网站,或者您正在开发一个由其他公司托管的网站,但您并不真正相信他们会知道如何设置 IIS。
  • 很遗憾,我没有对服务器的完全管理员访问权限。

标签: asp.net gzip


【解决方案1】:

See this article Vary 标头和 WinInet/MSIE

看来您应该发送 Vary: Accept-Encoding 而不是 Vary: Content-Encoding,因为响应会因 request 标头而异。

【讨论】:

  • 我是否应该忽略 IE6 的 Accept-Encoding 请求标头?
  • 其实想想,应该没关系,因为IE6根本不知道页面可以GZIP压缩。
  • 不,没关系。 Accept-Encoding 的意思是“我可以处理这些编码”,但您可以随意忽略此功能并提供普通版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多