2014-02-07 8 views
1

Я слабо попытался включить сжатие для () веб-сайта, над которым я работаю. Я думал, что у меня все работает, но когда я добрался до динамической загрузки файлов и , они попадают в сжатый формат, поэтому страница либо не загружает контент, который полагается на вышеупомянутые файлы, либо (при отладке) ломается с бесчисленным javascript исключения времени выполнения, т.е. неправильный символ.ASP.NET, GZip и .AXD динамические файлы не играют хорошо

Здесь находится (часть) моего кода Global.ascx.cs, явно связанного с событием PostReleaseRequestState.

void OnGlobalPostReleaseRequestState(object sender, EventArgs e) 
{  
     string contentType = Response.ContentType; 

     // Compress only html, style-sheet, and javascript documents. 
     switch (contentType) 
     { 
      case "application/x-javascript": 
      case "text/javascript": 
      case "text/css": 
      case "text/html": 
       { 
        // Get the Accept-Encoding header value to know whether zipping is supported by the browser or not. 
        string acceptEncoding = Request.Headers["Accept-Encoding"]; 
        if (string.IsNullOrEmpty(acceptEncoding)) return; 

        // If gzip is supported then gzip it else if deflate compression is supported then compress in that technique. 
        if (acceptEncoding.Contains("gzip")) 
        { 
         // Compress and set Content-Encoding header for the browser to indicate that the document is zipped. 
         Response.Filter = new GZipStream(Response.Filter, CompressionMode.Compress); 
         Response.AppendHeader("Content-Encoding", "gzip"); 
        } 
        else if (acceptEncoding.Contains("deflate")) 
        { 
         // Compress and set Content-Encoding header for the browser to indicate that the document is zipped. 
         Response.Filter = new DeflateStream(Response.Filter, CompressionMode.Compress); 
         Response.AppendHeader("Content-Encoding", "deflate"); 
        } 
       } 
       break; 
     } 
    } 

И мой web.config с разделами релевантности.

<!-- language-all: lang-xml --> 
<staticContent> 
    <!-- Override IIS default, thus allowing JavaScript compression --> 
    <remove fileExtension=".js" /> 
    <mimeMap fileExtension=".js" mimeType="text/javascript" /> 
</staticContent> 
<httpCompression directory="%SystemDrive%\websites\_compressed" minFileSizeForComp="256"> 
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" /> 
    <staticTypes> 
    <add mimeType="text/*" enabled="true" /> 
    <add mimeType="message/*" enabled="true" /> 
    <add mimeType="application/javascript" enabled="true" /> 
    <add mimeType="application/json" enabled="true" /> 
    <add mimeType="*/*" enabled="false" /> 
    </staticTypes> 
    <dynamicTypes> 
    <add mimeType="text/*" enabled="true" /> 
    <add mimeType="message/*" enabled="true" /> 
    <add mimeType="application/x-javascript" enabled="false" /> 
    <add mimeType="*/*" enabled="false" /> 
    </dynamicTypes> 
</httpCompression> 
<urlCompression doStaticCompression="true" doDynamicCompression="true" dynamicCompressionBeforeCache="false" /> 
<httpProtocol> 
    <customHeaders> 
    <add name="Content-Encoding" value="gzip" /> 
    <add name="X-UA-Compatible" value="IE=9" /> 
    </customHeaders> 
</httpProtocol> 

Мне нужно либо отключить сжатие (* .axd), либо заставить его распаковываться на клиенте. Пожалуйста, помогите ...

ответ

3

Хорошо, поэтому я понял ответ на свой вопрос ... Очевидно, задавая вопрос, все, что мне нужно было сделать, самому ответить. Прежде всего, IE отстой с точки зрения определения кэширования динамических (* .axd) файлов, в результате мне просто пришлось очистить кеш (и историю) IE и добавить простую проверку против запроса, как показано ниже.

void OnGlobalPostReleaseRequestState(object sender, EventArgs e) 
{ 
    if (Request.RawUrl.Contains("ScriptResource.axd", StringComparison.OrdinalIgnoreCase)) 
    { 
     return; 
    } 

    string contentType = Response.ContentType; 

    // Compress only html, style-sheet, and javascript documents. 
    switch (contentType) 
    { 
     case "application/x-javascript": 
     case "text/javascript": 
     case "text/css": 
     case "text/html": 
      { 
       // Get the Accept-Encoding header value to know whether zipping is supported by the browser or not. 
       string acceptEncoding = Request.Headers["Accept-Encoding"]; 
       if (string.IsNullOrEmpty(acceptEncoding)) return; 

       // If gzip is supported then gzip it else if deflate compression is supported then compress in that technique. 
       if (acceptEncoding.Contains("gzip")) 
       { 
        // Compress and set Content-Encoding header for the browser to indicate that the document is zipped. 
        Response.Filter = new GZipStream(Response.Filter, CompressionMode.Compress); 
        Response.AppendHeader("Content-Encoding", "gzip"); 
       } 
       else if (acceptEncoding.Contains("deflate")) 
       { 
        // Compress and set Content-Encoding header for the browser to indicate that the document is zipped. 
        Response.Filter = new DeflateStream(Response.Filter, CompressionMode.Compress); 
        Response.AppendHeader("Content-Encoding", "deflate"); 
       } 
      } 
      break; 
    } 
} 

Как подробно here - ScriptResource.axd автоматически сжимаются, зная, что это теперь я могу отфильтровать и все запросы, которые содержат как часть их URL Raw.

Использование fiddler Я смог увидеть, что файлы (ScriptResource.axd) имели два «Content-Encoding» из «gzip» в своих заголовках, которые произошли автоматически, и один, который я добавлял.

Двойное сжатие == основные головные боли! :)

+0

Это была моя же проблема. После включения gzip ответы ScriptResource были двойными. Ваше решение отлично работает. – rocketsarefast

+0

@DavidPine Я нахожу невозможным доставить сжатые ресурсы gzip, будь то .css или .axd. Еще более разочаровывает тот факт, что когда я смотрю на сжатую папку IIS, я вижу, что файлы там сжаты, но я не получаю Contact Encoding: GZip в заголовках ответов. В вашем коде выше вы вручную добавляете этот заголовок ... почему? Разве IIS не сделает это автоматически? И, ваш код GlobalAsax выше необходим для обеспечения сжатия ресурсов AXD, т. Е. Вы не можете сделать это через web.config – Jacques

+0

@ Якес, я честно не помню. Это было давно, и детали с тех пор покинули мое воспоминание. Я предлагаю вам задать этот вопрос как новый вопрос и не стесняйтесь ссылаться на этот вопрос в своем новом вопросе. Извините, я не могу больше помочь. –

Смежные вопросы