2009-02-16 107 views
72

我想爲我的asp.net頁面(包括我的CSS和JS文件)實現GZip壓縮。我試着下面的代碼,但它只是我的壓縮.aspx頁面中(從YSlow發現)如何在ASP.NET中實現GZip壓縮?

HttpContext context = HttpContext.Current; 
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress); 
HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip"); 
HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true; 

上面的代碼只是壓縮它包含我的.aspx頁面代碼(標記),而不是CSS和JS文件作爲外部文件。 請告訴我如何在ASP.NET中使用代碼實現GZip壓縮(因爲我在共享主機服務器上,無法訪問IIS服務器配置)。而且在上面的代碼中,我沒有得到最後兩行,爲什麼使用它們,以及這些行的目的是什麼。請解釋!

感謝

回答

26

壓縮JS & CSS文件,你實際上必須處理在IIS的水平,因爲這些文件直接呈現,而不ASP.NET運行時。

你可以製作一個JSX & IIS中的CSSX擴展映射到aspnet_isapi.dll,然後利用你的郵政編碼,但IIS可能會爲你做得更好。

內容編碼標頭告訴瀏覽器在渲染前需要解壓縮內容。根據內容的形狀,某些瀏覽器無論如何都足夠聰明,無論如何,只要告訴它就更好。

Accept-encoding緩存設置存在,因此gzip內容的緩存版本將不會發送到僅請求text/html的瀏覽器。

+4

Hi @Ben,你能告訴我如何使用IIS壓縮我的文件,我必須執行的所有設置,雖然我沒有訪問IIS配置,但我'我會盡力去做。請告訴我如何使用IIS壓縮文件?謝謝! – Prashant 2009-02-16 06:15:41

+3

http://stackoverflow.com/a/6992948/8479詳細介紹了IIS7或更高版本所需的web.config的簡單更改。 – Rory 2013-01-08 14:32:02

2

回答你最後一個問題。這兩行爲發送回瀏覽器的響應設置HTTP標頭。 Content-Encoding告訴瀏覽器該響應被編碼爲gzip並且需要解碼。最後一行將Accept-Encoding添加到Vary header。通過這種方式,瀏覽器或代理可以確定響應是唯一的還是受到某些其他頭文件的影響並調整其緩存。

3

在IIS7中,所有請求都轉到.net,所以您將不得不創建一個HttpModule,將這些標題添加到所有響應中。

如果沒有IIS7,並且在共享主機上,您將不得不創建映射.net文件擴展名的處理程序(您不使用(如.asmx)),並在web.config中指定.asmx文件轉到您的HttpHandler被設置爲將路徑重寫爲.jpg或其他內容,並在其中設置標題。

11

它只是壓縮你的ASPX文件的原因是你寫的代碼只是嵌入在ASPX文件中。 ASPX文件是它包含的任何鏈接內容的單獨請求。所以,如果你有一個ASPX頁面,包含:

<img src="www.example.com\exampleimg.jpg" alt="example" /> 

這等於2名的請求從瀏覽器(DNS查詢除外)的資源:

  1. 的aspx頁面和
  2. 爲aspx頁面中包含的圖像。

每個請求都有它自己的響應蒸汽。您發佈的代碼僅附加到ASPX響應流,這就是爲什麼只有您的ASPX頁面被壓縮。第1行&您的發佈代碼基本上接管了頁面的正常響應流,並注入了一些「中間人」代碼,在此情況下,該代碼使用GZip流進行正常輸出流的壓縮和壓縮,然後將其發送到電線上。

第3行& 4正在設置響應標頭。所有http請求和響應都有在內容之前發送的標題。這些設置請求/響應,以便服務器和客戶端知道正在發送什麼以及如何發送。

在這種情況下,第3行通知客戶端瀏覽器響應流是通過gzip壓縮的,因此需要在顯示之前由客戶端瀏覽器解壓縮。

而第4行只是打開響應的Accept-Encoding標頭。否則,這種情況將不會出現在答覆中。

有可插拔的模塊,您可以編寫/獲取,允許您壓縮多個其他MIME類型,如* .js和* .css,但最好使用IIS的內置壓縮功能。

你還沒說你正在使用的IIS的VERSON但如果它是IIS 7.0,它會要求你包括像下面進入你的<system.webserver>部分web.config文件:

<httpCompression> 
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" /> 
<staticTypes> 
     <add mimeType="text/*" enabled="true" /> 
     </staticTypes> 
</httpCompression> 
<urlCompression doStaticCompression="true" /> 

..

理查德

+0

真的很簡單的描述 – Rakeshyadvanshi 2016-02-24 18:07:06

37

這裏是CSS和JavaScript文件的解決方案

<httpCompression> 
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/> 
    <dynamicTypes> 
     <add mimeType="text/*" enabled="true"/> 
     <add mimeType="message/*" enabled="true"/> 
     <add mimeType="application/javascript" enabled="true"/> 
     <add mimeType="*/*" enabled="false"/> 
    </dynamicTypes> 
    <staticTypes> 
     <add mimeType="text/*" enabled="true"/> 
     <add mimeType="message/*" enabled="true"/> 
     <add mimeType="application/javascript" enabled="true"/> 
     <add mimeType="*/*" enabled="false"/> 
    </staticTypes> 
    </httpCompression> 
    <urlCompression doStaticCompression="true" doDynamicCompression="true"/> 
</system.webServer> 

貸:How to GZip on ASP.NET and GoDaddy

+0

這一個工程.. – 2013-06-11 06:08:34

11

這可能是有用的,你試試看,這接受deflate和gzip壓縮。

void Application_PreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     HttpApplication app = sender as HttpApplication; 
     string acceptEncoding = app.Request.Headers["Accept-Encoding"]; 
     Stream prevUncompressedStream = app.Response.Filter; 

     if (app.Context.CurrentHandler == null) 
      return; 

     if (!(app.Context.CurrentHandler is System.Web.UI.Page || 
      app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") || 
      app.Request["HTTP_X_MICROSOFTAJAX"] != null) 
      return; 

     if (acceptEncoding == null || acceptEncoding.Length == 0) 
      return; 

     acceptEncoding = acceptEncoding.ToLower(); 

     if (acceptEncoding.Contains("deflate") || acceptEncoding == "*") 
     { 
      // deflate 
      app.Response.Filter = new DeflateStream(prevUncompressedStream, 
       CompressionMode.Compress); 
      app.Response.AppendHeader("Content-Encoding", "deflate"); 
     } 
     else if (acceptEncoding.Contains("gzip")) 
     { 
      // gzip 
      app.Response.Filter = new GZipStream(prevUncompressedStream, 
       CompressionMode.Compress); 
      app.Response.AppendHeader("Content-Encoding", "gzip"); 
     } 
    } 
0

將.aspx擴展名添加到.css或.js文件。在文件中使用<%@ Page ContentType =「text/css」%>或javascript來爲它提供正確的MIME類型。 &使用URL重寫來隱藏用戶代理瀏覽器。內容編碼響應頭附加了gzip以表明gzip是用於執行壓縮的方法。將響應頭設置爲Accept-Encoding,以便所有高速緩存都知道應該提供哪個頁面(壓縮或未壓縮)取決於請求的Accept-Encoding頭。我已詳細闡述了這一點在https://stackoverflow.com/a/14509007/1624169