ASP.NET Core 'de yanıt sıkıştırması

Ağ bant genişliği sınırlı bir kaynaktır. Yanıt boyutunu azaltmak genellikle önemli ölçüde önemli ölçüde bir uygulamanın yanıt hızını artırır. Yük boyutlarını azaltmanın bir yolu, uygulamanın yanıtlarını sıkıştırmaktır.

Örnek kodu görüntüleme veya indirme (nasıl indirileceği)

Yanıt sıkıştırma ara yazılımı ne zaman kullanılır?

IIS, Apache veya NGINX 'te sunucu tabanlı yanıt sıkıştırma teknolojilerini kullanın. Ara yazılım performansı büyük olasılıkla sunucu modülleriyle eşleşmemelidir. HTTP.sys Server Server ve Kestrel Server şu anda yerleşik sıkıştırma desteği sunmaz.

Şu durumlarda yanıt sıkıştırma ara yazılımını kullanın:

Yanıt sıkıştırma

Genellikle, yerel olarak sıkıştırılmamış herhangi bir yanıt, yanıt sıkıştırmasından faydalanabilir. Yerel olarak sıkıştırılan yanıtlar genellikle şunlardır: CSS, JavaScript, HTML, XML ve JSON. PNG dosyaları gibi yerel olarak sıkıştırılan varlıkları sıkıştırmamanız gerekir. Yerel olarak sıkıştırılan bir yanıtı daha fazla sıkıştırmaya çalışırsanız, boyut ve iletim süresi bakımından küçük bir ek azaltma büyük olasılıkla sıkıştırmayı işlemek için geçen süre kadar fazla gölgelenir. 150-1000 bayttan daha küçük dosyaları sıkıştırmayın (dosyanın içeriğine ve sıkıştırma verimliliğine bağlı olarak). Küçük dosyaları sıkıştırma ek yükü sıkıştırılmamış dosyadan daha büyük bir sıkıştırılmış dosya üretebilir.

Bir istemci sıkıştırılmış içeriği işleyebilir, istemci, Accept-Encoding üst bilgiyi istekle birlikte göndererek yeteneklerini bilgilendirmelidir. Bir sunucu sıkıştırılmış içerik gönderdiğinde, Content-Encoding sıkıştırılan yanıtın kodlanmasının üst bilgisine bilgi içermelidir. Ara yazılım tarafından desteklenen içerik kodlama göstergeleri aşağıdaki tabloda gösterilmiştir.

Accept-Encoding üst bilgi değerleri Desteklenen ara yazılım Description
br Evet (varsayılan) Brotli sıkıştırılmış veri biçimi
deflate No Sıkıştırılmış veri biçimini söndür
exi No W3C verimli XML değişim
gzip Yes Gzip dosya biçimi
identity Yes "Kodlama yok" tanımlayıcısı: Yanıt kodlanmamalıdır.
pack200-gzip No Java arşivleri için ağ aktarım biçimi
* Yes Tüm kullanılabilir içerik kodlamaları açıkça istenmedi

Daha fazla bilgi için, IANA resmi Içerik kodlama listesinebakın.

Ara yazılım, özel üst bilgi değerleri için ek sıkıştırma sağlayıcıları eklemenize olanak tanır Accept-Encoding . Daha fazla bilgi için aşağıdaki özel sağlayıcılar bölümüne bakın.

Ara yazılım, q sıkıştırma düzenlerini önceliklendirmek için istemci tarafından gönderildiğinde kalite değeri (qvalue,) ağırlığa yeniden davranıyor. Daha fazla bilgi için bkz. RFC 7231: Accept-Encoding.

Sıkıştırma algoritmaları, sıkıştırma hızı ve sıkıştırmanın verimliliği arasında bir zorunluluğunu getirir tabidir. Bu bağlamdaki verimlilik , sıkıştırmadan sonra çıkışın boyutunu ifade eder. En en uygun sıkıştırma, en iyi boyut ile elde edilir.

Sıkıştırılmış içerik isteme, gönderme, önbelleğe alma ve alma ile ilgili üstbilgiler aşağıdaki tabloda açıklanmıştır.

Üst bilgi Rol
Accept-Encoding İstemci için kabul edilebilir içerik kodlama düzenlerini göstermek üzere istemciden sunucusuna gönderilir.
Content-Encoding Yük içindeki içeriğin kodlamasını göstermek için sunucudan istemciye gönderilir.
Content-Length Sıkıştırma gerçekleştiğinde, Content-Length Yanıt sıkıştırıldığında gövde içeriği değiştiği için başlık kaldırılır.
Content-MD5 Sıkıştırma gerçekleştiğinde, Content-MD5 gövde içeriği değiştiğinden ve karma artık geçerli olmadığından başlık kaldırılır.
Content-Type İçeriğin MIME türünü belirtir. Her yanıt, değerini belirtmelidir Content-Type . Ara yazılım, yanıtın sıkıştırılıp sıkıştırılmadığını belirlemede bu değeri denetler. Ara yazılım, kodlayamadığı bir dizi varsayılan MIME türünü belirtir, ancak MIME türlerini değiştirebilir veya ekleyebilirsiniz.
Vary Sunucu tarafından Accept-Encoding istemciler ve proxy 'ler için bir değere sahip olduğunda, Vary üst bilgi, isteğin üst bilgisinin değerine göre önbelleğe alma (değişiklik) gereken yanıtı istemciye veya proxy 'ye bildirir Accept-Encoding . Üst bilgiyle içerik döndürmesinin sonucu, Vary: Accept-Encoding hem sıkıştırılmış hem de sıkıştırılmamış yanıtların ayrı olarak önbelleğe alınma sonucudur.

Örnek uygulamaylayanıt sıkıştırma ara yazılımı 'nın özelliklerini gezin. Örnek şunu gösterir:

  • Gzip ve özel sıkıştırma sağlayıcıları kullanılarak uygulama yanıtlarının sıkıştırılması.
  • Sıkıştırma için varsayılan MIME türleri listesine MIME türü ekleme.

Paket

yanıt sıkıştırma ara yazılımı, ASP.NET Core uygulamalarında örtük olarak bulunan Microsoft. aspnetcore. responsecompression paketi tarafından sağlanır.

Yapılandırma

Aşağıdaki kod, varsayılan MIME türleri ve sıkıştırma sağlayıcıları için yanıt sıkıştırma ara yazılımı 'nın nasıl etkinleştirileceğini gösterir (Brotli ve gzip):

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddResponseCompression();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseResponseCompression();
    }
}

Notlar:

  • app.UseResponseCompression yanıtları sıkıştıran herhangi bir ara yazılım önce çağrılmalıdır. Daha fazla bilgi için bkz. ASP.NET Core Middleware.
  • İstek üst bilgisini ayarlamak ve yanıt üst bilgilerini, boyutunu ve gövdesini incelemek için Fiddler, Firefox tarayıcı geliştiricisiveya Postman gibi bir araç kullanın Accept-Encoding .

Üstbilgi olmadan örnek uygulamaya bir istek gönderir Accept-Encoding ve yanıtın sıkıştırılmamış olduğunu gözlemleyin. Content-EncodingVe Vary başlıkları yanıtta yok.

Accept-Encoding üstbilgisi olmayan bir isteğin sonucunu gösteren Fiddler penceresi. Yanıt sıkıştırılmaz.

Üstbilgi (Brotli Compression) ile örnek uygulamaya bir istek gönderir Accept-Encoding: br ve yanıtın sıkıştırıldığını gözlemleyin. Content-EncodingVe Vary üstbilgileri yanıtta mevcuttur.

Accept-Encoding üst bilgisi ve br değeri olan bir isteğin sonucunu gösteren Fiddler penceresi. Değişiklik ve Içerik kodlama üstbilgileri yanıta eklenir. Yanıt sıkıştırıldı.

Sağlayıcılar

Brotli sıkıştırma sağlayıcısı

BrotliCompressionProvider Brotli sıkıştırılmış veri biçimiyleyanıtları sıkıştırmak için öğesini kullanın.

Hiçbir sıkıştırma sağlayıcısı açıkça öğesine eklenmemişse CompressionProviderCollection :

  • Brotli sıkıştırma sağlayıcısı, gzip sıkıştırma sağlayıcısıylabirlikte, varsayılan olarak sıkıştırma sağlayıcılarının dizisine eklenir.
  • Brotli sıkıştırılmış veri biçimi istemci tarafından desteklenerek sıkıştırma varsayılan olarak Brotli Compression. Brotli istemci tarafından desteklenmiyorsa, istemci gzip sıkıştırmasını destekliyorsa sıkıştırma varsayılan olarak gzip olur.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Tüm sıkıştırma sağlayıcıları açıkça eklendiğinde Brotli sıkıştırma sağlayıcısı eklenmelidir:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

Sıkıştırma düzeyini ile ayarlayın BrotliCompressionProviderOptions . Brotli sıkıştırma sağlayıcısı, en hızlı sıkıştırma düzeyi (CompressionLevel. en hızlı) olarak varsayılan olarak en verimli sıkıştırmayı oluşturmayabilir. En verimli sıkıştırma isteniyorsa, ara yazılımı en uygun sıkıştırma için yapılandırın.

Sıkıştırma düzeyi Description
CompressionLevel.Fastest Elde edilen çıkış en iyi şekilde sıkıştırılmış olsa bile sıkıştırmanın mümkün olan en kısa sürede tamamlanması gerekir.
CompressionLevel.NoCompression Sıkıştırma gerçekleştirilene bir işlem gerçekleştirin.
CompressionLevel.Optimal Sıkıştırmanın tamamlanması daha uzun sürerse bile yanıtlar en iyi şekilde sıkıştırılır.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<BrotliCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

Gzip Sıkıştırma Sağlayıcısı

Yanıtları GzipCompressionProvider Gzip dosya biçimiyle sıkıştırmak için kullanın.

hiçbir sıkıştırma sağlayıcısı açıkça 'ye CompressionProviderCollection eklenmezse:

  • Gzip Sıkıştırma Sağlayıcısı, BrotliSıkıştırma Sağlayıcısı ile birlikte sıkıştırma sağlayıcıları dizisine varsayılan olarak eklenir.
  • İstemci, Brotli sıkıştırılmış veri biçimi desteklene zaman sıkıştırma varsayılan olarak Brotli sıkıştırması olur. Brotli istemci tarafından desteklenmiyorsa, istemci Gzip sıkıştırmasını desteklediğinde sıkıştırma varsayılan olarak Gzip'i kullanır.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Herhangi bir sıkıştırma sağlayıcısı açıkça ekleniyor olduğunda Gzip Sıkıştırma Sağlayıcısı ek gerekir:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

ile sıkıştırma düzeyini GzipCompressionProviderOptions ayarlayın. Gzip Sıkıştırma Sağlayıcısı varsayılan olarak en hızlı sıkıştırma düzeyini (CompressionLevel.Fastest) kullanır ve bu da en verimli sıkıştırmayı üretemeye devam eder. En verimli sıkıştırma istenirse ara yazılımı en iyi sıkıştırma için yapılandırabilirsiniz.

Sıkıştırma Düzeyi Description
CompressionLevel.Fastest Elde edilen çıkış en iyi şekilde sıkıştırılmış olsa bile sıkıştırmanın mümkün olan en kısa sürede tamamlanması gerekir.
CompressionLevel.NoCompression Sıkıştırma gerçekleştirilene bir işlem gerçekleştirin.
CompressionLevel.Optimal Sıkıştırmanın tamamlanması daha uzun sürerse bile yanıtlar en iyi şekilde sıkıştırılır.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<GzipCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

Özel sağlayıcılar

ile özel sıkıştırma uygulamaları ICompressionProvider oluşturun. , EncodingName bunun ürettiği içerik kodlamasını temsil ICompressionProvider eder. Ara yazılım, isteğin üst bilgisinde belirtilen listeye göre sağlayıcıyı seçmek Accept-Encoding için bu bilgileri kullanır.

İstemci, örnek uygulamayı kullanarak üst bilgiyle bir istek Accept-Encoding: mycustomcompression göndertir. Ara yazılım özel sıkıştırma uygulamasını kullanır ve yanıtı bir üst bilgiyle Content-Encoding: mycustomcompression döndürür. Özel bir sıkıştırma uygulamasının çalışması için istemcinin özel kodlamayı sıkıştırmasını ala çalışması gerekir.

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public class CustomCompressionProvider : ICompressionProvider
{
    public string EncodingName => "mycustomcompression";
    public bool SupportsFlush => true;

    public Stream CreateStream(Stream outputStream)
    {
        // Create a custom compression stream wrapper here
        return outputStream;
    }
}

Üst bilgi ile örnek uygulamaya bir istek Accept-Encoding: mycustomcompression gönderin ve yanıt üst bilgilerini gözlemler. yanıtta Vary Content-Encoding ve üst bilgileri mevcuttur. Yanıt gövdesi (gösterilmez) örnek tarafından sıkıştırılır. Örneğin sınıfında bir sıkıştırma CustomCompressionProvider uygulaması yok. Ancak örnek, bu tür bir sıkıştırma algoritmasını nerede uygulayan bir örnek olduğunu gösterir.

Accept-Encoding üst bilgisine ve mycustomcompression değerine sahip istek sonucu gösteren Fiddler penceresi. Yanıta Vary ve Content-Encoding üst bilgileri eklenir.

MIME türleri

Ara yazılım sıkıştırma için varsayılan bir MIME türleri kümesi belirtir:

  • application/javascript
  • application/json
  • application/xml
  • text/css
  • text/html
  • text/json
  • text/plain
  • text/xml

MIME türlerini Yanıt Sıkıştırma Ara Yazılımı seçenekleriyle değiştirin veya ekin. gibi joker karakter MIME türlerinin text/* desteklenemey olduğunu unutmayın. Örnek uygulama için bir MIME türü ekler ve sıkıştırır ve ASP.NET Core image/svg+xml görüntüsünü (banner.svg) görüntüler.

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

Güvenli protokol ile sıkıştırma

Güvenli bağlantılar üzerinden sıkıştırılmış yanıtlar seçeneğiyle EnableForHttps denetlenerek varsayılan olarak devre dışı bırakılır. Dinamik olarak oluşturulan sayfalarla sıkıştırma kullanmak, CRIME ve BREACH saldırıları gibi güvenlik sorunlarına yol açabilir.

Vary üst bilgisi ekleme

Yanıtları üst bilgiye göre sıkıştırırken, yanıtın birden çok sıkıştırılmış sürümü Accept-Encoding ve sıkıştırılmamış bir sürümü olabilir. İstemci ve ara sunucu önbelleklerine birden çok sürümün mevcut olduğunu ve depolanmış olması gerektiğinin talimatı için üst Vary bilgisi bir değerle Accept-Encoding eklenir. 2.0 veya ASP.NET Core ara yazılım, yanıt sıkıştırılırken Vary üst bilgiyi otomatik olarak ekler.

Nginx ters ara sunucusunun arkasında ara yazılım sorunu

Bir istek Nginx tarafından yükseltilğinde Accept-Encoding üst bilgi kaldırılır. Üst Accept-Encoding bilginin kaldırılması ara yazılımın yanıtı sıkıştırmasını önler. Daha fazla bilgi için bkz. NGINX: Sıkıştırma ve Sıkıştırmayı Sıkıştırma. Bu sorun Nginx için geçiş sıkıştırması (aspnet/BasicMiware #123) ile izlandı.

IIS dinamik sıkıştırma ile çalışma

Bir uygulama için devre dışı bırakmak istediğiniz sunucu düzeyinde yapılandırılmış etkin bir IIS Dinamik Sıkıştırma Modülü'dür, modülünü devre dışı bırakmak içinweb.config gerekir. Daha fazla bilgi için bkz. IIS modüllerini devre dışı bırakma.

Sorun giderme

İstek üst bilgisini ayarp yanıt üst bilgilerini, boyutunu ve gövdesini incelemeniz için Fiddler, Firefox Browser Developerveya Postmangibi bir Accept-Encoding araç kullanın. Varsayılan olarak, Yanıt Sıkıştırma Ara Yazılımı aşağıdaki koşulları karşılamaya uygun yanıtları sıkıştırır:

  • Üst bilgi, sizin kurduğunız bir özel sıkıştırma sağlayıcısıyla eşleşen , , veya özel kodlama Accept-Encoding br gzip * değeriyle birlikte mevcuttur. Değerin kalite değeri identity (qvalue, ) q ayarı 0 (sıfır) olmalıdır veya olmalıdır.
  • MIME türü ( Content-Type ) ayar olmalı ve üzerinde yapılandırılmış bir MIME türüyle eşleşmeli. ResponseCompressionOptions
  • İstek üst bilgi Content-Range içermeli.
  • Yanıt Sıkıştırma Ara Yazılımı seçeneklerinde güvenli protokol (https) yapılandırılmadıkça isteğin güvenli olmayan protokolü (http) kullanması gerekir. Güvenli içerik sıkıştırmayı etkinleştirerek yukarıda açıklanan tehlikeyi unutmayın.

Ek kaynaklar

Ağ bant genişliği sınırlı bir kaynaktır. Yanıtın boyutunun azaltılması genellikle bir uygulamanın yanıt hızını önemli ölçüde artırır. Yük boyutlarını azaltmanın bir yolu, bir uygulamanın yanıtlarını sıkıştırmaktır.

Örnek kodu görüntüleme veya indirme ( nasılindir)

Yanıt Sıkıştırma Ara Yazılımı ne zaman kullanılır?

IIS, Apache veya Nginx'te sunucu tabanlı yanıt sıkıştırma teknolojilerini kullanın. Ara yazılımların performansı büyük olasılıkla sunucu modüllerinin performansıyla eşleşmez. HTTP.sys sunucusu ve Kestrel sunucusu şu anda yerleşik sıkıştırma desteği sunmaz.

Aşağıdakiler için Yanıt Sıkıştırma Ara Yazılımı kullanın:

Yanıt sıkıştırma

Genellikle, yerel olarak sıkıştırılan tüm yanıtlar yanıt sıkıştırmadan yararlanabilir. Yerel olarak sıkıştırılan yanıtlar genellikle şunları içerir: CSS, JavaScript, HTML, XML ve JSON. PNG dosyaları gibi yerel olarak sıkıştırılmış varlıkları sıkıştırmama gerekir. Yerel olarak sıkıştırılmış bir yanıtı daha fazla sıkıştırmayı denersanız, sıkıştırmanın işlemesi için geçen süre büyük olasılıkla boyut ve iletim süresinde küçük bir ek azalmaya gölgeılır. Yaklaşık 150-1000 bayttan küçük dosyaları sıkıştırmayın (dosyanın içeriğine ve sıkıştırma verimliliğine bağlı olarak). Küçük dosyaları sıkıştırma yükü sıkıştırılmamış dosyadan daha büyük sıkıştırılmış bir dosya üretebilir.

Bir istemci sıkıştırılmış içeriği işleyene zaman, istemcinin istekle birlikte üst bilgi göndererek Accept-Encoding sunucuya özelliklerini bildirmesi gerekir. Bir sunucu sıkıştırılmış içerik gönderdiğinde, sıkıştırılmış yanıtın nasıl Content-Encoding kodlanmasıyla ilgili bilgileri üst bilgiye dahil etmek gerekir. Ara yazılım tarafından desteklenen içerik kodlaması atamaları aşağıdaki tabloda gösterilmiştir.

Accept-Encoding üst bilgi değerleri Desteklenen Ara Yazılım Description
br Evet (varsayılan) Brotli sıkıştırılmış veri biçimi
deflate No DEFLATE sıkıştırılmış veri biçimi
exi No W3C Verimli XML Değişim
gzip Yes Gzip dosya biçimi
identity Yes "Kodlama yok" tanımlayıcısı: Yanıt kodlanmamış olmalıdır.
pack200-gzip No Java Arşivleri için Ağ Aktarım Biçimi
* Yes Açıkça istenen kullanılabilir içerik kodlaması

Daha fazla bilgi için bkz. IANA Resmi İçerik Kodlama Listesi.

Ara yazılım, özel üst bilgi değerleri için ek sıkıştırma sağlayıcıları Accept-Encoding eklemenize olanak sağlar. Daha fazla bilgi için aşağıdaki Özel Sağlayıcılar'a bakın.

Ara yazılım, sıkıştırma düzenlerini önceliklendirmek için istemci tarafından gönderilen kalite değerine (qvalue, ) ağırlık verme q özelliğine sahiptir. Daha fazla bilgi için bkz. RFC 7231: Accept-Encoding.

Sıkıştırma algoritmaları, sıkıştırma hızı ile sıkıştırmanın etkinliği arasında bir takasa tabi olur. Bu bağlamdaki etkililik, sıkıştırma sonrasında çıkışın boyutunu ifade eder. En küçük boyut, en uygun sıkıştırma ile elde edilir.

Sıkıştırılmış içerik isteğinde, göndermede, önbelleğe almada ve almada yer alan üst bilgiler aşağıdaki tabloda açıklanmıştır.

Üst bilgi Rol
Accept-Encoding İstemci tarafından kabul edilebilir içerik kodlama düzenlerini belirtmek için istemciden sunucuya gönderilir.
Content-Encoding Yükteki içeriğin kodlamasını göstermek için sunucudan istemciye gönderilir.
Content-Length Sıkıştırma oluştuğunda, Content-Length yanıt sıkıştırılırken gövde içeriği değiştiklerinden üst bilgi kaldırılır.
Content-MD5 Sıkıştırma oluştuğunda gövde içeriği değişti ve karma artık geçerli olmadığı için Content-MD5 üst bilgi kaldırılır.
Content-Type İçeriğin MIME türünü belirtir. Her yanıt kendi Content-Type belirterek. Ara yazılım, yanıtın sıkıştırılmış olup olmadığını belirlemek için bu değeri denetler. Ara yazılım, kodlayabilir varsayılan MIME türleri kümesi belirtir, ancak MIME türlerini değiştirebilir veya ekleyin.
Vary sunucu tarafından istemcilere ve ara sunuculara değeriyle göndererek, üst bilgisi istemciye veya ara sunucuya, isteğin üst bilgi değerine bağlı olarak yanıtları önbelleğe ala (farklılık Accept-Encoding Vary Accept-Encoding gösterir) gösterir. Üst bilgiyle içerik döndüren Vary: Accept-Encoding sonuç, hem sıkıştırılmış hem de sıkıştırılmamış yanıtların ayrı olarak önbelleğe alınmalarıdır.

Örnek uygulamasıyla Yanıt Sıkıştırma Ara Yazılımı'nın özelliklerini keşfedin. Örnek şunları göstermektedir:

  • Gzip ve özel sıkıştırma sağlayıcıları kullanılarak uygulama yanıtlarının sıkıştırımı.
  • Sıkıştırma için varsayılan MIME türleri listesine MIME türü ekleme.

Paket

Ara yazılımı projeye eklemek için, Microsoft.AspNetCore.ResponseCompression paketini içeren Microsoft.AspNetCore.App metapaketine bir başvuru ekleyin.

Yapılandırma

Aşağıdaki kod, varsayılan MIME türleri ve sıkıştırma sağlayıcıları(Brotli ve Gzip)için Yanıt Sıkıştırma Ara Yazılımını etkinleştirmeyi gösterir:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddResponseCompression();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseResponseCompression();
    }
}

Notlar:

  • app.UseResponseCompression yanıtları sıkıştıran ara yazılımlardan önce çağrılmaları gerekir. Daha fazla bilgi için bkz. ASP.NET Core Middleware.
  • İstek üst bilgisini ayarlamak ve yanıt üst bilgileri, boyutu ve gövdesi üzerinde çalışmak için Fiddler, Firefox Browser Developerveya Postman gibi Accept-Encoding bir araç kullanın.

Üst bilgisi olmadan örnek uygulamaya bir istek Accept-Encoding gönderin ve yanıtın sıkıştırılmamış olduğunu gözlemler. Content-EncodingYanıtta Vary ve üst bilgileri mevcut değil.

üst bilgisi olmayan bir isteğin sonucu gösteren Fiddler Accept-Encoding. Yanıt sıkıştırılmış değil.

Üst bilgi (Brotli sıkıştırması) ile örnek uygulamaya bir istek gönderin Accept-Encoding: br ve yanıtın sıkıştırılmış olduğunu gözlemler. yanıtta Content-Encoding Vary ve üst bilgileri mevcuttur.

Accept-Encoding üst bilgisi ve br değerinin yer Accept-Encoding isteğin sonucu gösteren Fiddler penceresi. Yanıta Vary ve Content-Encoding üst bilgileri eklenir. Yanıt sıkıştırılır.

Sağlayıcılar

Brotli Sıkıştırma Sağlayıcısı

Yanıtları BrotliCompressionProvider Brotli sıkıştırılmış veri biçimiyle sıkıştırmak için kullanın.

hiçbir sıkıştırma sağlayıcısı açıkça 'ye CompressionProviderCollection eklenmezse:

  • Brotli Sıkıştırma Sağlayıcısı, Gzip sıkıştırma sağlayıcısı ile birlikte sıkıştırma sağlayıcıları dizisine varsayılan olarak eklenir.
  • İstemci, Brotli sıkıştırılmış veri biçimi desteklene zaman sıkıştırma varsayılan olarak Brotli sıkıştırması olur. Brotli istemci tarafından desteklenmiyorsa, istemci Gzip sıkıştırmasını desteklediğinde sıkıştırma varsayılan olarak Gzip'i kullanır.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Herhangi bir sıkıştırma sağlayıcısı açıkça ekleniyor olduğunda Brotli Sıkıştırma Sağlayıcısı ekleniyor:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

ile sıkıştırma düzeyini BrotliCompressionProviderOptions ayarlayın. Brotli Sıkıştırma Sağlayıcısı varsayılan olarak en hızlı sıkıştırma düzeyini (CompressionLevel.Fastest) kullanır ve bu da en verimli sıkıştırmayı üretmez. En verimli sıkıştırma istenirse ara yazılımı en iyi sıkıştırma için yapılandırabilirsiniz.

Sıkıştırma Düzeyi Description
CompressionLevel.Fastest Elde edilen çıkış en iyi şekilde sıkıştırılmış olsa bile sıkıştırmanın mümkün olan en kısa sürede tamamlanması gerekir.
CompressionLevel.NoCompression Sıkıştırma gerçekleştirilene bir işlem gerçekleştirin.
CompressionLevel.Optimal Sıkıştırmanın tamamlanması daha uzun sürerse bile yanıtlar en iyi şekilde sıkıştırılır.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<BrotliCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

Gzip Sıkıştırma Sağlayıcısı

Yanıtları GzipCompressionProvider Gzip dosya biçimiyle sıkıştırmak için kullanın.

hiçbir sıkıştırma sağlayıcısı açıkça 'ye CompressionProviderCollection eklenmezse:

  • Gzip Sıkıştırma Sağlayıcısı, BrotliSıkıştırma Sağlayıcısı ile birlikte sıkıştırma sağlayıcıları dizisine varsayılan olarak eklenir.
  • İstemci, Brotli sıkıştırılmış veri biçimi desteklene zaman sıkıştırma varsayılan olarak Brotli sıkıştırması olur. Brotli istemci tarafından desteklenmiyorsa, istemci Gzip sıkıştırmasını desteklediğinde sıkıştırma varsayılan olarak Gzip'i kullanır.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Herhangi bir sıkıştırma sağlayıcısı açıkça ekleniyor olduğunda Gzip Sıkıştırma Sağlayıcısı ek gerekir:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

ile sıkıştırma düzeyini GzipCompressionProviderOptions ayarlayın. Gzip Sıkıştırma Sağlayıcısı varsayılan olarak en hızlı sıkıştırma düzeyini (CompressionLevel.Fastest) kullanır ve bu da en verimli sıkıştırmayı üretemeye devam eder. En verimli sıkıştırma istenirse ara yazılımı en iyi sıkıştırma için yapılandırabilirsiniz.

Sıkıştırma Düzeyi Description
CompressionLevel.Fastest Elde edilen çıkış en iyi şekilde sıkıştırılmış olsa bile sıkıştırmanın mümkün olan en kısa sürede tamamlanması gerekir.
CompressionLevel.NoCompression Sıkıştırma gerçekleştirilene bir işlem gerçekleştirin.
CompressionLevel.Optimal Sıkıştırmanın tamamlanması daha uzun sürerse bile yanıtlar en iyi şekilde sıkıştırılır.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<GzipCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

Özel sağlayıcılar

ile özel sıkıştırma uygulamaları ICompressionProvider oluşturun. , EncodingName bunun ürettiği içerik kodlamasını temsil ICompressionProvider eder. Ara yazılım, isteğin üst bilgisinde belirtilen listeye göre sağlayıcıyı seçmek Accept-Encoding için bu bilgileri kullanır.

İstemci, örnek uygulamayı kullanarak üst bilgiyle bir istek Accept-Encoding: mycustomcompression göndertir. Ara yazılım özel sıkıştırma uygulamasını kullanır ve yanıtı bir üst bilgiyle Content-Encoding: mycustomcompression döndürür. Özel bir sıkıştırma uygulamasının çalışması için istemcinin özel kodlamayı sıkıştırmasını ala çalışması gerekir.

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public class CustomCompressionProvider : ICompressionProvider
{
    public string EncodingName => "mycustomcompression";
    public bool SupportsFlush => true;

    public Stream CreateStream(Stream outputStream)
    {
        // Create a custom compression stream wrapper here
        return outputStream;
    }
}

Üst bilgi ile örnek uygulamaya bir istek Accept-Encoding: mycustomcompression gönderin ve yanıt üst bilgilerini gözlemler. yanıtta Vary Content-Encoding ve üst bilgileri mevcuttur. Yanıt gövdesi (gösterilmez) örnek tarafından sıkıştırılır. Örneğin sınıfında bir sıkıştırma CustomCompressionProvider uygulaması yok. Ancak örnek, bu tür bir sıkıştırma algoritmasını nerede uygulayan bir örnek olduğunu gösterir.

Accept-Encoding üst bilgisine ve mycustomcompression değerine sahip istek sonucu gösteren Fiddler penceresi. Yanıta Vary ve Content-Encoding üst bilgileri eklenir.

MIME türleri

Ara yazılım sıkıştırma için varsayılan bir MIME türleri kümesi belirtir:

  • application/javascript
  • application/json
  • application/xml
  • text/css
  • text/html
  • text/json
  • text/plain
  • text/xml

MIME türlerini Yanıt Sıkıştırma Ara Yazılımı seçenekleriyle değiştirin veya ekin. gibi joker karakter MIME türlerinin text/* desteklenemey olduğunu unutmayın. Örnek uygulama için bir MIME türü ekler ve sıkıştırır ve ASP.NET Core image/svg+xml görüntüsünü (banner.svg) görüntüler.

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

Güvenli protokol ile sıkıştırma

Güvenli bağlantılar üzerinden sıkıştırılmış yanıtlar seçeneğiyle EnableForHttps denetlenerek varsayılan olarak devre dışı bırakılır. Dinamik olarak oluşturulan sayfalarla sıkıştırma kullanmak, CRIME ve BREACH saldırıları gibi güvenlik sorunlarına yol açabilir.

Vary üst bilgisi ekleme

Yanıtları üst bilgiye göre sıkıştırırken, yanıtın birden çok sıkıştırılmış sürümü Accept-Encoding ve sıkıştırılmamış bir sürümü olabilir. İstemci ve ara sunucu önbelleklerine birden çok sürümün mevcut olduğunu ve depolanmış olması gerektiğinin talimatı için üst Vary bilgisi bir değerle Accept-Encoding eklenir. 2.0 veya ASP.NET Core ara yazılım, yanıt sıkıştırılırken Vary üst bilgiyi otomatik olarak ekler.

Nginx ters ara sunucusunun arkasında ara yazılım sorunu

Bir istek Nginx tarafından yükseltilğinde Accept-Encoding üst bilgi kaldırılır. Üst Accept-Encoding bilginin kaldırılması ara yazılımın yanıtı sıkıştırmasını önler. Daha fazla bilgi için bkz. NGINX: Sıkıştırma ve Sıkıştırmayı Sıkıştırma. Bu sorun Nginx için geçiş sıkıştırması (aspnet/BasicMiware #123) ile izlandı.

IIS dinamik sıkıştırma ile çalışma

Bir uygulama için devre dışı bırakmak istediğiniz sunucu düzeyinde yapılandırılmış etkin bir IIS Dinamik Sıkıştırma Modülü'dür, modülünü devre dışı bırakmak içinweb.config gerekir. Daha fazla bilgi için bkz. IIS modüllerini devre dışı bırakma.

Sorun giderme

İstek üst bilgisini ayarp yanıt üst bilgilerini, boyutunu ve gövdesini incelemeniz için Fiddler, Firefox Browser Developerveya Postmangibi bir Accept-Encoding araç kullanın. Varsayılan olarak, Yanıt Sıkıştırma Ara Yazılımı aşağıdaki koşulları karşılamaya uygun yanıtları sıkıştırır:

  • Üst bilgi, sizin kurduğunız bir özel sıkıştırma sağlayıcısıyla eşleşen , , veya özel kodlama Accept-Encoding br gzip * değeriyle birlikte mevcuttur. Değerin kalite değeri identity (qvalue, ) q ayarı 0 (sıfır) olmalıdır veya olmalıdır.
  • MIME türü ( Content-Type ) ayar olmalı ve üzerinde yapılandırılmış bir MIME türüyle eşleşmeli. ResponseCompressionOptions
  • İstek üst bilgi Content-Range içermeli.
  • Yanıt Sıkıştırma Ara Yazılımı seçeneklerinde güvenli protokol (https) yapılandırılmadıkça isteğin güvenli olmayan protokolü (http) kullanması gerekir. Güvenli içerik sıkıştırmayı etkinleştirerek yukarıda açıklanan tehlikeyi unutmayın.

Ek kaynaklar

Ağ bant genişliği sınırlı bir kaynaktır. Yanıtın boyutunun azaltılması genellikle bir uygulamanın yanıt hızını önemli ölçüde artırır. Yük boyutlarını azaltmanın bir yolu, bir uygulamanın yanıtlarını sıkıştırmaktır.

Örnek kodu görüntüleme veya indirme ( nasılindir)

Yanıt Sıkıştırma Ara Yazılımı ne zaman kullanılır?

IIS, Apache veya Nginx'te sunucu tabanlı yanıt sıkıştırma teknolojilerini kullanın. Ara yazılımların performansı büyük olasılıkla sunucu modüllerinin performansıyla eşleşmez. HTTP.sys sunucu ve Kestrel sunucu şu anda yerleşik sıkıştırma desteği sunmaz.

Aşağıdakiler için Yanıt Sıkıştırma Ara Yazılımı kullanın:

Yanıt sıkıştırma

Genellikle, yerel olarak sıkıştırılan tüm yanıtlar yanıt sıkıştırmadan yararlanabilir. Yerel olarak sıkıştırılan yanıtlar genellikle şunları içerir: CSS, JavaScript, HTML, XML ve JSON. PNG dosyaları gibi yerel olarak sıkıştırılmış varlıkları sıkıştırmama gerekir. Yerel olarak sıkıştırılmış bir yanıtı daha fazla sıkıştırmayı denersanız, sıkıştırmanın işlemesi için geçen süre büyük olasılıkla boyut ve iletim süresinde küçük bir ek azalmaya gölgeılır. Yaklaşık 150-1000 bayttan küçük dosyaları sıkıştırmayın (dosyanın içeriğine ve sıkıştırma verimliliğine bağlı olarak). Küçük dosyaları sıkıştırma yükü sıkıştırılmamış dosyadan daha büyük sıkıştırılmış bir dosya üretebilir.

Bir istemci sıkıştırılmış içeriği işleyene zaman, istemcinin istekle birlikte üst bilgi göndererek Accept-Encoding sunucuya özelliklerini bildirmesi gerekir. Bir sunucu sıkıştırılmış içerik gönderdiğinde, sıkıştırılmış yanıtın nasıl Content-Encoding kodlanmasıyla ilgili bilgileri üst bilgiye dahil etmek gerekir. Ara yazılım tarafından desteklenen içerik kodlaması atamaları aşağıdaki tabloda gösterilmiştir.

Accept-Encoding üst bilgi değerleri Desteklenen Ara Yazılım Açıklama
br Hayır Brotli sıkıştırılmış veri biçimi
deflate No DEFLATE sıkıştırılmış veri biçimi
exi No W3C Verimli XML Değişim
gzip Evet (varsayılan) Gzip dosya biçimi
identity Yes "Kodlama yok" tanımlayıcısı: Yanıt kodlanmamış olmalıdır.
pack200-gzip No Java Arşivleri için Ağ Aktarım Biçimi
* Yes Açıkça istenen kullanılabilir içerik kodlaması

Daha fazla bilgi için bkz. IANA Resmi İçerik Kodlama Listesi.

Ara yazılım, özel üst bilgi değerleri için ek sıkıştırma sağlayıcıları Accept-Encoding eklemenize olanak sağlar. Daha fazla bilgi için aşağıdaki Özel Sağlayıcılar'a bakın.

Ara yazılım, sıkıştırma düzenlerini önceliklendirmek için istemci tarafından gönderilen kalite değerine (qvalue, ) ağırlık verme q özelliğine sahiptir. Daha fazla bilgi için bkz. RFC 7231: Accept-Encoding.

Sıkıştırma algoritmaları, sıkıştırma hızı ile sıkıştırmanın etkinliği arasında bir takasa tabi olur. Bu bağlamdaki etkililik, sıkıştırma sonrasında çıkışın boyutunu ifade eder. En küçük boyut, en uygun sıkıştırma ile elde edilir.

Sıkıştırılmış içerik isteğinde, göndermede, önbelleğe almada ve almada yer alan üst bilgiler aşağıdaki tabloda açıklanmıştır.

Üst bilgi Rol
Accept-Encoding İstemci tarafından kabul edilebilir içerik kodlama düzenlerini belirtmek için istemciden sunucuya gönderilir.
Content-Encoding Yükteki içeriğin kodlamasını göstermek için sunucudan istemciye gönderilir.
Content-Length Sıkıştırma oluştuğunda, Content-Length yanıt sıkıştırılırken gövde içeriği değiştiklerinden üst bilgi kaldırılır.
Content-MD5 Sıkıştırma gerçekleştiğinde, Content-MD5 gövde içeriği değiştiğinden ve karma artık geçerli olmadığından başlık kaldırılır.
Content-Type İçeriğin MIME türünü belirtir. Her yanıt, değerini belirtmelidir Content-Type . Ara yazılım, yanıtın sıkıştırılıp sıkıştırılmadığını belirlemede bu değeri denetler. Ara yazılım, kodlayamadığı bir dizi varsayılan MIME türünü belirtir, ancak MIME türlerini değiştirebilir veya ekleyebilirsiniz.
Vary Sunucu tarafından Accept-Encoding istemciler ve proxy 'ler için bir değere sahip olduğunda, Vary üst bilgi, isteğin üst bilgisinin değerine göre önbelleğe alma (değişiklik) gereken yanıtı istemciye veya proxy 'ye bildirir Accept-Encoding . Üst bilgiyle içerik döndürmesinin sonucu, Vary: Accept-Encoding hem sıkıştırılmış hem de sıkıştırılmamış yanıtların ayrı olarak önbelleğe alınma sonucudur.

Örnek uygulamaylayanıt sıkıştırma ara yazılımı 'nın özelliklerini gezin. Örnek şunu gösterir:

  • Gzip ve özel sıkıştırma sağlayıcıları kullanılarak uygulama yanıtlarının sıkıştırılması.
  • Sıkıştırma için varsayılan MIME türleri listesine MIME türü ekleme.

Paket

Ara yazılımı bir projeye dahil etmek için, Microsoft. AspNetCore. ResponseCompression paketini içeren Microsoft.AspNetCore.app metapackageöğesine bir başvuru ekleyin.

Yapılandırma

Aşağıdaki kod, varsayılan MIME türleri ve gzip sıkıştırma sağlayıcısıIçin yanıt sıkıştırma ara yazılımını nasıl etkinleştireceğinizi göstermektedir:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddResponseCompression();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseResponseCompression();
    }
}

Notlar:

  • app.UseResponseCompression yanıtları sıkıştıran herhangi bir ara yazılım önce çağrılmalıdır. Daha fazla bilgi için bkz. ASP.NET Core Middleware.
  • İstek üst bilgisini ayarlamak ve yanıt üst bilgilerini, boyutunu ve gövdesini incelemek için Fiddler, Firefox tarayıcı geliştiricisiveya Postman gibi bir araç kullanın Accept-Encoding .

Üstbilgi olmadan örnek uygulamaya bir istek gönderir Accept-Encoding ve yanıtın sıkıştırılmamış olduğunu gözlemleyin. Content-EncodingVe Vary başlıkları yanıtta yok.

Accept-Encoding üstbilgisi olmayan bir isteğin sonucunu gösteren Fiddler penceresi. Yanıt sıkıştırılmaz.

Üstbilgi ile örnek uygulamaya bir istek gönderir Accept-Encoding: gzip ve yanıtın sıkıştırıldığını gözlemleyin. Content-EncodingVe Vary üstbilgileri yanıtta mevcuttur.

Accept-Encoding üst bilgisi ve gzip değeri olan bir isteğin sonucunu gösteren Fiddler penceresi. Değişiklik ve Içerik kodlama üstbilgileri yanıta eklenir. Yanıt sıkıştırıldı.

Sağlayıcılar

Gzip sıkıştırma sağlayıcısı

GzipCompressionProvider Gzip dosya biçimiyleyanıtları sıkıştırmak için öğesini kullanın.

Hiçbir sıkıştırma sağlayıcısı açıkça öğesine eklenmemişse CompressionProviderCollection :

  • Gzip sıkıştırma sağlayıcısı, varsayılan olarak sıkıştırma sağlayıcılarının dizisine eklenir.
  • İstemci gzip sıkıştırmasını destekliyorsa, sıkıştırma varsayılan olarak gzip olur.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Herhangi bir sıkıştırma sağlayıcısı açık olarak eklendiğinde gzip sıkıştırma sağlayıcısının eklenmesi gerekir:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

Sıkıştırma düzeyini ile ayarlayın GzipCompressionProviderOptions . Gzip sıkıştırma sağlayıcısı, en hızlı sıkıştırma düzeyine (CompressionLevel. en hızlı) göre varsayılan olarak en verimli sıkıştırmayı oluşturmayabilir. En verimli sıkıştırma isteniyorsa, ara yazılımı en uygun sıkıştırma için yapılandırın.

Sıkıştırma düzeyi Description
CompressionLevel. en hızlı Elde edilen çıktı en iyi şekilde sıkıştırısa bile, sıkıştırma mümkün olduğunca hızlı tamamlanır.
CompressionLevel. NoCompression Sıkıştırma gerçekleştirilmemelidir.
CompressionLevel. optimum Sıkıştırmanın tamamlanmasının daha uzun sürse bile yanıtlar en iyi şekilde sıkıştırılır.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<GzipCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

Özel sağlayıcılar

İle özel sıkıştırma uygulamaları oluşturun ICompressionProvider . , EncodingName Bunun ürettiği içerik kodlamasını temsil eder ICompressionProvider . Ara yazılım bu bilgileri, isteğin üstbilgisinde belirtilen listeye göre sağlayıcıyı seçmek için kullanır Accept-Encoding .

İstemci, örnek uygulamayı kullanarak üst bilgiyle bir istek gönderir Accept-Encoding: mycustomcompression . Ara yazılım özel sıkıştırma uygulamasını kullanır ve bir üst bilgiyle yanıtı döndürür Content-Encoding: mycustomcompression . Özel bir sıkıştırma uygulamasının çalışması için istemcinin özel kodlamayı açıp açabilmesi gerekir.

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public class CustomCompressionProvider : ICompressionProvider
{
    public string EncodingName => "mycustomcompression";
    public bool SupportsFlush => true;

    public Stream CreateStream(Stream outputStream)
    {
        // Create a custom compression stream wrapper here
        return outputStream;
    }
}

Üstbilgi ile örnek uygulamaya bir istek gönderir Accept-Encoding: mycustomcompression ve yanıt üst bilgilerini gözlemleyin. VaryVe Content-Encoding üstbilgileri yanıtta mevcuttur. Yanıt gövdesi (gösterilmez) örnek tarafından sıkıştırılmaz. Örnek sınıfında bir sıkıştırma uygulamanız yok CustomCompressionProvider . Ancak örnek, bu tür bir sıkıştırma algoritmasını nerede uygulayacağınızı gösterir.

Accept-Encoding üst bilgisi ve mycustomcompression değeri ile bir isteğin sonucunu gösteren Fiddler penceresi. Değişiklik ve Içerik kodlama üstbilgileri yanıta eklenir.

MIME türleri

Ara yazılım, sıkıştırma için varsayılan bir MIME türleri kümesi belirtir:

  • application/javascript
  • application/json
  • application/xml
  • text/css
  • text/html
  • text/json
  • text/plain
  • text/xml

MIME türlerini, yanıt sıkıştırma ara yazılım seçenekleriyle değiştirin veya ekleyin. Gibi joker karakter MIME türlerinin text/* desteklenmediğini unutmayın. örnek uygulama, için bir mıme türü ekler image/svg+xml ve ASP.NET Core başlık görüntüsünü (banner. svg) sıkıştırır ve sunar.

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

Güvenli protokolle sıkıştırma

Güvenli bağlantılar üzerinden sıkıştırılan yanıtlar, EnableForHttps Varsayılan olarak devre dışı bırakılan seçeneğiyle denetlenebilir. Dinamik olarak oluşturulan sayfalarla sıkıştırma kullanmak, SUA ve ihlal saldırıları gibi güvenlik sorunlarına neden olabilir.

Vary üst bilgisi ekleniyor

Üstbilgileri temel alarak yanıtları sıkıştırırken Accept-Encoding , büyük olasılıkla birden çok sıkıştırılmış yanıt ve sıkıştırılmamış bir sürüm vardır. İstemci ve proxy 'nin birden çok sürümün var olduğunu ve depolanması gerektiğini bildirmek için, Vary üst bilgi bir Accept-Encoding değerle eklenir. ASP.NET Core 2,0 veya sonraki bir sürümde, Vary yanıt sıkıştırıldığında ara yazılım üstbilgiyi otomatik olarak ekler.

NGINX ters proxy 'nin arkasında ara yazılım sorunu

Bir istek NGINX tarafından proxy oluşturulduğunda, Accept-Encoding üst bilgi kaldırılır. Accept-EncodingÜstbilgiyi kaldırmak, ara yazılımın yanıtı sıkıştırmasını önler. Daha fazla bilgi için bkz. NGINX: sıkıştırma ve açma. Bu sorun, NGINX için doğrudan sıkıştırma (ASPNET/Basicara yazılım #123)ile izlenebilir.

IIS dinamik sıkıştırma ile çalışma

Bir uygulama için devre dışı bırakmak istediğiniz sunucu düzeyinde yapılandırılmış etkin bir IIS dinamik sıkıştırma modülünüzün varsa, web.config dosyasına ekleme modülünü devre dışı bırakın. Daha fazla bilgi için bkz. IIS modüllerini devre dışı bırakma.

Sorun giderme

Fiddler, Firefox tarayıcı geliştiricisiveya Postmangibi bir araç kullanarak Accept-Encoding istek üst bilgisini ayarlamanıza ve yanıt üst bilgilerini, boyutunu ve gövdesini incelemeye olanak tanır. Varsayılan olarak, yanıt sıkıştırma ara yazılımı aşağıdaki koşullara uyan yanıtları sıkıştırır:

  • Accept-EncodingÜst bilgi, gzip veya oluşturduğunuz * özel bir sıkıştırma sağlayıcısıyla eşleşen özel bir kodlama değeriyle birlikte bulunur. Değer, identity 0 (sıfır) olarak bir kalite değeri (qvalue, q ) ayarı içermemelidir.
  • MIME türü ( Content-Type ) ayarlanmalıdır ve üzerinde yapılandırılmış BIR MIME türüyle eşleşmelidir ResponseCompressionOptions .
  • İstek Content-Range üstbilgiyi içermemelidir.
  • Yanıt sıkıştırma ara yazılımı seçeneklerinde güvenli Protokolü (https) yapılandırılmadığı takdirde istek güvenli olmayan protokol (http) kullanmalıdır. Güvenli içerik sıkıştırması etkinleştirildiğinde yukarıda açıklanan tehlikede göz önünde yer.

Ek kaynaklar