【问题标题】:Compression is not working压缩不起作用
【发布时间】:2012-06-22 05:36:05
【问题描述】:

我需要压缩我的数据导出站点的所有动态内容。
我尝试了很多方法,没有任何效果。 Chrome 显示内容未压缩,并且“Content-Encoding”标头不存在。

尝试这样做作为最后的手段(在写任何响应之前):

        context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress);
        context.Response.AppendHeader("Content-Encoding", "deflate");

日志显示此代码已正确执行。 但是,Chrome 再次显示内容未压缩。

当使用 IIS 内置压缩时,UPD 似乎可以工作并且请求跟踪显示“DYNAMIC_COMPRESSION_SUCCESS”。但是,IE 仍然显示响应没有被压缩。当我使用本地主机名称从服务器本身请求页面时也是如此。

有什么想法吗?

【问题讨论】:

  • 你是在服务器端测试吗?
  • @rikitikitik,你读过这个问题,不是吗?
  • 正如 ZiyaSAL 指出的,浏览器必须首先表明它接受压缩内容。您是否检查过从浏览器发送到服务器的标头?这个相关问题可能会有所帮助:stackoverflow.com/q/897989/64096
  • @Marnix van Valen,显然我确实检查过这个。

标签: asp.net http iis compression


【解决方案1】:

如果您想手动执行此操作,请先检查是否支持压缩,

public static bool IsGZipSupported()
{
    string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];
    if (!string.IsNullOrEmpty(AcceptEncoding) &&
            (AcceptEncoding.Contains("gzip") || AcceptEncoding.Contains("deflate")))
        return true;
    return false;
}

并压缩您的响应,

public static void GZipEncodePage()
{
            if (IsGZipSupported()) {
                HttpResponse Response = HttpContext.Current.Response;

                string AcceptEncoding = HttpContext.Current.Request.Headers("Accept-Encoding");
                if (AcceptEncoding.Contains("gzip")) {
                    Response.Filter = new System.IO.Compression.GZipStream(Response.Filter, System.IO.Compression.CompressionMode.Compress);
                    Response.AppendHeader("Content-Encoding", "gzip");
                } else {
                    Response.Filter = new System.IO.Compression.DeflateStream(Response.Filter, System.IO.Compression.CompressionMode.Compress);


            Response.AppendHeader("Content-Encoding", "deflate");
}

您可以在将标头发送到客户端之前检查是否附加了过滤器

protected void Application_PreSendRequestHeaders()
{
    HttpResponse response = HttpContext.Current.Response;
    if (response.Filter is GZipStream && response.Headers["Content-encoding"] != "gzip")
        response.AppendHeader("Content-encoding", "gzip");
    else if (response.Filter is DeflateStream && response.Headers["Content-encoding"] != "deflate")
        response.AppendHeader("Content-encoding", "deflate");
}

有关更多信息,请查看此帖子;

【讨论】:

    【解决方案2】:

    我不会尝试手动执行此操作,而是依靠 IIS 中内置的预先编写(和测试)的 Microsoft 代码来为您执行此操作:

    安装 Dynamic Content Compression on the machine(链接中的第 5 条)和 enable it in IIS。 IIS 现在将处理静态和动态内容的压缩。更少需要维护的代码(并且总是有错误)总是一件好事!

    【讨论】:

      【解决方案3】:

      如果您使用的是 IIS7+,则有一个压缩选项。导航到您的站点,在右侧主窗口中,单击“压缩”,然后选中所有 2 个复选框:

      1. 启用动态内容压缩
      2. 启用静态内容压缩

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-09
        • 1970-01-01
        • 2017-03-20
        • 2018-04-19
        相关资源
        最近更新 更多