2016-04-19 6 views
3

Я пытаюсь отладить вопрос о том, почему мои страницы не являются GZIP или дефлированы в соответствии с YSLOW. В итоге я включил Failed Request Logs на сервере и смог увидеть неудачную причину того, почему он не сжимает, он считает, что он уже сжат.Сжатие в IIS 8.5 не увенчалось успехом, указав ALREADY_CONTENT_ENCODING

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, теперь составляет 2 МБ!

Любая помощь была бы принята с благодарностью.

Спасибо,

ответ

2

Там нет необходимости вручную осуществлять GZIP и вместо этого вы можете передать на IIS, чтобы сделать работу для вас. Если ваше приложение использует пул приложений в интегрированном режиме, то убедитесь, что httpcompression тег внутри

<System.WebServer> тег

Также вместе с httpCompression теге вам нужно иметь

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

Благодаря его. Удалите класс сжатия и теперь проверьте заголовки ответа

+0

я проверить пул приложений использует интегрированный режим, кроме того у нас есть httpcompression, а также urlcompression истинного для статического и динамического commpression. Я попробовал запустить демонстрационный сайт без использования класса gzip, который мы реализовали, и до сих пор нет сжатия. Забавно, что я вижу, что сжатие работает, когда я запускаю веб-сайт на этом локальном сервере, однако, как только кто-то пытается увидеть его со стороны сервера, он больше не сжимается. – Eliseo

3

У нас была аналогичная проблема на сервере Windows 2012 R2; следующие ниже шаги решены нашей проблемой:

  1. Выберите сайт IIS и перейдите в Редактор конфигурации.
  2. Выберите раздел "system.web/caching/outputCache", затем установите для свойства "omitVaryStar" значение "true"
  3. Выберите system.webServer, а затем выберите httpCompression.
  4. набор свойств «staticCompressionIgnoreHitFrequency» к «истинным» enter image description here
  5. IISReset
+0

Я не могу найти систему.webserver -> httpCompression, сделал все остальное, но все еще не работал. – Eliseo

+0

Добавлен снимок для второго параметра –

+1

нашел его под сервером вместо имени сайта, однако даже после внесения этих изменений и перезапуска IIS не удалось :( – Eliseo