【问题标题】:Compression in IIS 8.5 not successful, stating ALREADY_CONTENT_ENCODINGIIS 8.5 中的压缩不成功,说明 ALREADY_CONTENT_ENCODING
【发布时间】:2016-04-19 18:52:56
【问题描述】:

我正在尝试调试为什么我的页面没有按照 YSLOW 进行 GZIP 压缩或压缩的问题。我最终在服务器上启用了失败的请求日志,并且能够看到它没有压缩的失败原因,它认为它已经被压缩了。

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!

任何帮助将不胜感激。

谢谢,

【问题讨论】:

    标签: .net web-config compression deflate iis-8.5


    【解决方案1】:

    我们在 Windows 2012 R2 服务器上遇到了类似的问题;以下步骤解决了我们的问题:

    1. 选择一个 IIS 站点,然后转到配置编辑器。
    2. 选择“system.web/caching/outputCache”部分,然后将“omitVaryStar”属性设置为“true”
    3. 选择system.webServer,然后选择httpCompression。
    4. 将“staticCompressionIgnoreHitFrequency”属性设置为“true”
    5. iisreset

    【讨论】:

    • 我找不到 system.webserver --> httpCompression,做了其余的,但仍然没有工作。
    • 为第二个参数添加了一张图片
    • 在服务器而不是站点名称下找到它,但是即使进行了这些更改并重新启动 IIS 也没有成功:(
    【解决方案2】:

    无需手动实现 gzip,您可以在 IIS 上中继来为您完成这项工作。如果您的应用程序在集成模式下使用应用程序池,请确保 httpcompression 标签在里面

    &lt;System.WebServer&gt;标签

    还有你需要的 httpCompression 标签

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

    谢谢。删除压缩类并立即检查响应标头

    【讨论】:

    • 我确实验证了应用程序池正在使用集成模式,此外我们确实有 httpcompression 以及 urlcompression true 用于静态和动态压缩。我尝试在不使用我们实现的 gzip 类的情况下运行演示站点,但仍然没有压缩。有趣的是,当我在本地服务器上运行网站时,我看到压缩工作正常,但是一旦有人试图从服务器外部查看它,它就不再被压缩。
    猜你喜欢
    • 1970-01-01
    • 2016-10-23
    • 2017-12-27
    • 2014-02-03
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2014-11-10
    • 2011-04-14
    相关资源
    最近更新 更多