IIS 8.5中的压缩失败,提示ALREADY_CONTENT_ENCODING。

3

我试图调试为什么我的页面没有被YSLOW压缩或解压缩,最终我在服务器上启用了“失败请求日志”,并能够看到它未能压缩的原因,它认为该文件已经被压缩。

DYNAMIC_COMPRESSION_NOT_SUCCESS Reason="ALREADY_CONTENT_ENCODING"

我已经在IIS中启用了动态和静态压缩,并修改了web.config文件以包含以下内容。

<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
  <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" />
  <dynamicTypes>
    <add mimeType="text/*" enabled="true" />
    <add mimeType="message/*" enabled="true" />
    <add mimeType="application/x-javascript" enabled="true" />
    <add mimeType="application/json" enabled="true" />
    <add mimeType="*/*" enabled="false" />
  </dynamicTypes>
  <staticTypes>
    <add mimeType="text/*" enabled="true" />
    <add mimeType="message/*" enabled="true" />
    <add mimeType="application/x-javascript" enabled="true" />
    <add mimeType="application/atom+xml" enabled="true" />
    <add mimeType="application/xaml+xml" enabled="true" />
    <add mimeType="*/*" enabled="false" />
  </staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true"/>

此外,在我的aspx页面上,我有一个方法,在每个页面之前(在页面加载时)调用该方法来运行gzip压缩(这可能是导致错误的原因)。

以下是我从页面加载中调用该方法的方式。

//compress page
Compression.GZipEncodePage();

这是压缩页面的方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace InitialDataEntry
{
    public static class Compression
    {
        /// <summary>
        /// Sets up the current page or handler to use GZip through a Response.Filter
        /// IMPORTANT:  
        /// You have to call this method before any output is generated!
        /// </summary>
        public static void GZipEncodePage()
        {
            HttpResponse Response = HttpContext.Current.Response;
        if (IsGZipSupported())
        {
            string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];
            if (AcceptEncoding.Contains("deflate"))
            {
                Response.Filter = new System.IO.Compression.DeflateStream(Response.Filter,
                                           System.IO.Compression.CompressionMode.Compress);
                Response.AppendHeader("Content-Encoding", "deflate");
            }
            else
            {
                Response.Filter = new System.IO.Compression.GZipStream(Response.Filter,
                                          System.IO.Compression.CompressionMode.Compress);
                Response.AppendHeader("Content-Encoding", "gzip");
            }
        }

        // Allow proxy servers to cache encoded and unencoded versions separately
        Response.AppendHeader("Vary", "Content-Encoding");
    }

    /// <summary>
    /// Determines if GZip is supported
    /// </summary>
    /// <returns></returns>
    public static bool IsGZipSupported()
    {
        string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];
        string IsPartial = HttpContext.Current.Request.Headers["x-microsoftajax"];

        if (!string.IsNullOrEmpty(AcceptEncoding) &&
             AcceptEncoding.Contains("gzip") || AcceptEncoding.Contains("deflate"))

            //Just checking to see if this is a partial page update
            if (string.Compare("Delta=true", IsPartial, true) == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        else
        {
            return false;
        }
    }
}
}

顺便提一下,这个曾经是有效的,但不确定何时停止,然而我的用户意识到了这个问题,因为页面的大小变得越来越大,以前的500k现在已经变成了2mb!

非常感谢任何帮助。

谢谢,

2个回答

3
我们在 Windows 2012 R2 服务器上遇到了类似的问题,按照以下步骤解决了我们的问题:
  1. 选择一个 IIS 网站,然后进入配置编辑器。
  2. 选择 "system.web/caching/outputCache" 部分,将 "omitVaryStar" 属性设置为 "true"。
  3. 选择 system.webServer,然后选择 httpCompression。
  4. 将 "staticCompressionIgnoreHitFrequency" 属性设置为 "true"。 输入图像描述
  5. iisreset

我找不到system.webserver --> httpCompression,其他都做了但还是不行。 - Eliseo
为第二个参数添加了一张图片。 - Hakan Gümüş
2
找到它在服务器下而不是站点名称下,但即使进行了更改并重新启动了IIS,仍然没有成功 :( - Eliseo

2

您无需手动实现gzip,而是可以依靠IIS来完成这项工作。如果您的应用程序使用集成模式下的应用程序池,则确保httpcompression标记位于

<System.WebServer>标记

此外,与httpCompression标记一起,您需要拥有

<urlCompression doStaticCompression="true" doDynamicCompression="true" />

感谢 IT。现在请删除压缩类并检查响应头。


我已经验证了应用程序池正在使用集成模式,此外我们还对静态和动态压缩启用了httpcompression以及urlcompression。我尝试运行一个演示站点,没有使用我们实现的gzip类,但仍然没有压缩。有趣的是,当我在本地服务器上运行网站时,我看到压缩正在工作,但是一旦有人试图从服务器外部查看它,它就不再被压缩了。 - Eliseo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接