2016-04-19 7 views
3

Ich versuche, das Problem zu debuggen, warum meine Seiten nicht GZIP'd oder deflationiert werden gemäß YSLOW. Ich habe am Ende fehlgeschlagene Anforderungsprotokolle auf dem Server aktiviert und konnte den fehlgeschlagenen Grund sehen, warum es nicht komprimiert wird. Es wird angenommen, dass es bereits komprimiert ist.Komprimierung in IIS 8.5 nicht erfolgreich, mit ALREADY_CONTENT_ENCODING

DYNAMIC_COMPRESSION_NOT_SUCCESS Reason="ALREADY_CONTENT_ENCODING" 

Ich habe die dynamische und statische Komprimierung in IIS aktiviert, ich habe auch die Datei web.config so geändert, dass sie Folgendes enthält.

<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"/> 

Zusätzlich auf meiner aspx Seite ich eine Methode, die ich vor jeder Seite aufrufen müssen (auf Seite Last) gzip-Komprimierung ausführen (dies könnte sein, warum es den Fehler verursacht). Diese

ist, wie ich die Methode von der Seite zu laden, rufen

//compress page 
Compression.GZipEncodePage(); 

Und das ist die Methode, die die Seite

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; 
     } 
    } 
} 
} 

Das verwendete komprimiert durch die Art und Weise zu arbeiten, aber nicht sicher, wann Es hörte auf, aber meine Benutzer erkannten das Problem, als die Seiten aufgebläht wurden und was früher 500k war, ist jetzt 2mb!

Jede Hilfe würde sehr geschätzt werden.

Danke,

Antwort

2

Es gibt keine Notwendigkeit, manuell die gzip zu implementieren und stattdessen können Sie auf IIS-Relais für Sie den Job zu erledigen. Wenn Ihre Anwendung app-Pool im integrierten Modus verwenden, dann stellen Sie sicher, den httpcompression Tag innen

<System.WebServer> Tag

auch zusammen mit dem httpCompression Tag Sie

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

Dank ihn haben müssen. Entfernen Sie die Komprimierungsklasse und überprüfen Sie jetzt die Antwortheader

+0

Ich habe die app-Pool überprüfen wird mit integrierten Modus, zusätzlich haben wir httpcompression sowie die urlCompression gilt für statische und dynamische haben Druck. Ich habe versucht, eine Demo-Site zu betreiben, ohne die von uns implementierte gzip-Klasse zu verwenden und immer noch keine Komprimierung. Es ist lustig, dass ich Kompression sehe, wenn ich die Website auf diesem lokalen Server laufe, aber sobald jemand versucht, es von außerhalb des Servers zu sehen, wird es nicht mehr komprimiert. – Eliseo

3

Wir hatten ein ähnliches Problem auf Windows 2012 R2 Server; Die folgenden Schritte haben unser Problem gelöst:

  1. Wählen Sie eine IIS-Site und gehen Sie zum Konfigurationseditor.
  2. Wählen Sie den Abschnitt "system.web/caching/outputCache" aus und legen Sie dann die Eigenschaft "omitVaryStar" auf "true" fest
  3. Wählen Sie system.webServer aus, und wählen Sie dann httpCompression
  4. set „staticCompressionIgnoreHitFrequency“ Eigenschaft auf „true“ enter image description here
  5. Iisreset
+0

Ich kann das System nicht finden.Webserver -> httpCompression, tat den Rest aber immer noch nicht funktioniert. – Eliseo

+0

Ein Bild für den zweiten Parameter hinzugefügt –

+1

fand es unter dem Server statt der Site-Name, aber auch nach dem Vornehmen dieser Änderungen und Neustart von IIS kein Erfolg :( – Eliseo