ASP.NET'te GZip sıkıştırması nasıl uygulanır?


81

Asp.net sayfam için (CSS ve JS dosyalarım dahil) GZip sıkıştırmasını uygulamaya çalışıyorum. Aşağıdaki kodu denedim, ancak yalnızca .aspx sayfamı sıkıştırıyor ( YSlow'dan buldum )

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;

Yukarıdaki kod, harici dosyalar olarak dahil edilen CSS ve JS dosyalarını değil, yalnızca .aspx sayfa kodumu (biçimlendirme) sıkıştırıyor. Lütfen bana kodu kullanarak ASP.NET'te GZip sıkıştırmasını nasıl uygulayabilirim (çünkü IIS Sunucusu yapılandırmalarına erişimim olmayan paylaşılan barındırma sunucusundayım). Ve ayrıca yukarıdaki kodda son iki satırı, neden kullanıldığını ve bu satırların amacını alamıyorum. Lütfen açıkla!


Yanıtlar:


28

JS ve CSS dosyalarını sıkıştırmak için, bu dosyalar doğrudan ASP.NET çalışma zamanı olmadan işlendiğinden, aslında bunu IIS düzeyinde işlemeniz gerekir.

IIS'de aspnet_isapi.dll ile bir JSX & CSSX uzantısı eşlemesi yapabilir ve ardından posta kodunuzdan yararlanabilirsiniz, ancak IIS muhtemelen sizin için daha iyi bir iş çıkaracaktır.

İçerik kodlama başlığı, tarayıcıya içeriği oluşturmadan önce sıkıştırmasını açması gerektiğini söyler. Bazı tarayıcılar, içeriğin şekline göre bunu zaten anlayacak kadar akıllıdır, ancak bunu söylemek daha iyidir.

Accept-encoding cache ayarı, gzip'lenmiş içeriğin önbelleğe alınmış bir sürümünün yalnızca text / html isteyen bir tarayıcıya gönderilmemesi için oradadır.


4
Merhaba @Ben, IIS kullanarak dosyalarımı nasıl sıkıştıracağımı, hangi ayarları yapmam gerektiğini söyler misiniz, IIS yapılandırmalarına erişimim olmasa da, ama bunu yapmaya çalışacağım. Lütfen IIS kullanarak dosyaları nasıl sıkıştıracağımı söyle ?? Teşekkürler!
Prashant

4
stackoverflow.com/a/6992948/8479 , IIS7 veya üstü için gereken basit web.config değişikliğinin ayrıntılarını verir.
Rory

47

İşte css ve javascript dosyaları için çözüm. Aşağıdaki kodu web.config dosyanızın içindeki <system.webServer> öğesine ekleyin:

<configuration>
  ...
  <system.webserver>
     ...
      <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>
  ...
<configuration>

Kredi: ASP.NET ve GoDaddy'de GZip Nasıl Yapılır


4
son satır kaldırılmalıdır
JeffT

1
doğru, ancak aslında <system.webServer> açılışını eklerim ... bu yüzden yapılandırmayı nereye koyacağımızı biliyoruz.
Carlos R Balebona

Aynı kodu ekledim ama dosyalar sıkıştırılmıyor
Zeeshan Ahmad Khalil

Başka bir şey eklemem gerekiyor mu?
Zeeshan Ahmad Khalil

16

bu, denemeniz için yararlı olabilir, bu, deflate ve gzip sıkıştırmasını kabul eder.

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

2
Bu kod için çok teşekkürler. IIS konsoluna erişimim olmayan belirli bir sitenin içeriğini gzip / deflate etmem gerekiyordu ve bu bana yardımcı oldu. Yine de bir soru: Bu kod, tüm aspx dosyalarını söndürüyor ve CSS ve ScriptResources'i gzip ediyor gibi görünüyor, ancak herhangi bir .js dosyasını gziplemiyor. Bunu yapmanın bir yolu var mı? Teşekkürler.
Rafael Merlin

Böyle kaliteli eğitim işlememesi gibi bu, yanlıştır: gzip;q=0,deflate. singular.co.nz/2008/07/…
oligofren

11

Yalnızca ASPX dosyanızı sıkıştırmasının nedeni, yazdığınız kodun yalnızca ASPX dosyasına gömülü olmasıdır. Bir ASPX dosyası, içerdiği herhangi bir bağlantılı içerikten ayrı bir istektir. Dolayısıyla, şunları içeren bir ASPX sayfanız varsa:

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

Bu, tarayıcınızdan kaynaklara 2 istek (DNS aramaları) anlamına gelir:

  1. aspx sayfası için ve
  2. aspx sayfasının içerdiği görüntü için.

Her isteğin kendi yanıt buharı vardır. Gönderdiğiniz kod yalnızca ASPX yanıt akışına ekleniyor, bu nedenle yalnızca ASPX sayfanız sıkıştırılıyor. Gönderilen kodunuzun 1. ve 2. satırları, esasen sayfanın normal yanıt akışını devralır ve bu durumda normal çıkış akışını bir GZip akışı ile yiyip sıkıştıran ve bunun yerine kabloya gönderen bazı "orta adam" kodunu enjekte eder.

3. ve 4. satırlar yanıt başlıklarını ayarlıyor. Tüm http istekleri ve yanıtları, içerikten önce gönderilen başlıklara sahiptir. Bunlar, isteği / yanıtı ayarlar, böylece sunucu ve istemci neyin nasıl gönderildiğini bilir.

Bu durumda Satır 3, istemci tarayıcısına yanıt akışının gzip aracılığıyla sıkıştırıldığını ve bu nedenle görüntülenmeden önce istemci tarayıcısı tarafından sıkıştırmasının kaldırılması gerektiğini bildirmektedir.

Ve 4. Satır basitçe yanıtın Accept-Encoding başlığını açıyor. Aksi takdirde bu, yanıtta yer almazdı.

Yazabileceğiniz / edinebileceğiniz, * .js ve * .css gibi diğer MIME türlerini çok parçalı sıkıştırmanıza izin veren takılabilir modüller vardır, ancak yalnızca IIS'nin yerleşik sıkıştırma işlevini kullanmanız daha iyidir.

Hangi IIS versonunu kullandığınızı söylemediniz, ancak IIS 7.0 olsaydı, <system.webserver>web.config dosyanızın bölümüne aşağıdakine benzer bir şey eklemeniz gerekir :

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

..

Richard


Gerçekten harika açıklamalar
Rakeshyadvanshi

3

IIS7'de tüm istekler .net'e gider, bu nedenle bu başlıkları tüm yanıtlara ekleyen bir HttpModule oluşturmanız gerekir.

IIS7 olmadan ve paylaşılan barındırmada, kullanmadığınız (.asmx gibi) bir .net dosyası uzantısını eşleyen bir işleyici oluşturmanız ve web.config dosyasında .asmx dosyalarının ayarlanan HttpHandler'ınıza gideceğini belirtmeniz gerekir. .jpg veya başka bir yere giden yolu yeniden yazmak ve başlığı oraya da ayarlamak için.


2

Son sorunuzu cevaplamak için. Bu iki satır, tarayıcıya geri gönderilen yanıt için HTTP başlıklarını ayarlar. Content-Encodingtarayıcıya yanıtın gzip olarak kodlandığını ve kodunun çözülmesi gerektiğini söyler. Son satır Accept-Encoding, Vary başlığına eklenir . Bununla tarayıcı veya proxy'ler, yanıtın benzersiz olup olmadığını veya belirli diğer başlıklardan etkilenip etkilenmediğini belirleyebilir ve önbelleğe alma ayarlarını ayarlayabilir.


0

.Css veya .js dosyasına .aspx uzantısı ekleyin. Dosyaya doğru MIME türünde sunmak için <% @ Page ContentType = "text / css"%> veya javascript kullanın. & bunu kullanıcı aracısı tarayıcılarından gizlemek için URL Yeniden Yazma'yı kullanın. İçerik kodlama yanıt başlığına gzip'in sıkıştırmayı gerçekleştirmek için kullanılan yöntem olduğunu iletmek için gzip eklenir. Yanıt üstbilgisi Accept-Encoding olarak ayarlandığından, tüm önbelleklerin hangi sayfanın (sıkıştırılmış veya sıkıştırılmamış) sunulması gerektiğini bilmesi, isteğin Accept-Encoding başlığına bağlıdır. Bunu https://stackoverflow.com/a/14509007/1624169 adresinde ayrıntılı olarak açıkladım.


0

Aşağıdaki <system.webServer>öğeyi web.config dosyanıza ekleyebilirsiniz :

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

NOT: IIS'nin daha eski bir sürümünü kullanıyorsanız (v7.5'ten daha az), işlem CPU yoğun olduğundan doDynamicCompression'u false olarak ayarlamak isteyebilirsiniz. Bu sorunlar IIS 7.5'te açıklığa kavuşturuldu.

Referans: https://docs.microsoft.com/en-us/iis/configuration/system.webserver/urlcompression


0

Ya web.config dosyasıyla yapın

<system.webServer>
    <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>

Veya IIS aracılığıyla yapabilirsiniz. JS ve CSS dosyalarını sıkıştırmak için, bu dosyalar doğrudan ASP.NET çalışma zamanı olmadan işlendiğinden, aslında bunu IIS düzeyinde işlemeniz gerekir.

IIS'de aspnet_isapi.dll ile bir JSX & CSSX uzantısı eşlemesi yapabilir ve ardından posta kodunuzdan yararlanabilirsiniz, ancak IIS muhtemelen sizin için daha iyi bir iş çıkaracaktır.

İçerik kodlama başlığı, tarayıcıya içeriği oluşturmadan önce sıkıştırmasını açması gerektiğini söyler. Bazı tarayıcılar, içeriğin şekline göre bunu zaten anlayacak kadar akıllıdır, ancak bunu söylemek daha iyidir.

Accept-encoding cache ayarı, gzip'lenmiş içeriğin önbelleğe alınmış bir sürümünün yalnızca text / html isteyen bir tarayıcıya gönderilmemesi için oradadır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.