ASP.NET Core'da yanıt sıkıştırma

Ağ bant genişliği sınırlı bir kaynaktır. Yanıtın boyutunu azaltmak genellikle bir uygulamanın yanıt hızını önemli ölçüde artırır. Yük boyutunu azaltmanın bir yolu, bir uygulamadan gelen yanıtları sıkıştırmaktır. Bu makalede, ASP.NET Core'de Yanıt Sıkıştırma Ara Yazılımını kullanarak uygulamalarınız için yanıt sıkıştırmanın nasıl uygulandığı açıklanır.

HTTPS ile sıkıştırmayı keşfetme

Güvenli bağlantılar üzerinden sıkıştırılmış yanıtlar, güvenlik riski nedeniyle varsayılan olarak devre dışı bırakılan seçeneğiyle EnableForHttps denetlenebilir. Dinamik olarak oluşturulan sayfalarla sıkıştırmanın kullanılması, uygulamayı CRIME ve BREACH saldırılarına karşı savunmasız hale getirebilir. CRIME ve BREACH saldırılar ASP.NET Core'da antiforgery belirteçleriyle azaltılabilir. Daha fazla bilgi için, bkz. ASP.NET Core'da Siteler Arası İstek Sahteciliği (XSRF/CSRF) saldırılarını önleme. Saldırıları azaltma BREACH hakkında daha fazla bilgi için adresinden Azaltmalar bölümüne bakın http://www.breachattack.com/.

Uygulama EnableForHttps özelliğini (false), Internet Information Services (IIS), IIS Express ve Azure App Service devre dışı bıraksa bile> IIS web sunucusuna Gzip uygulayabilir. Yanıt üst bilgilerini gözden geçirirken Sunucu üst bilgisi değerini not alın. Beklenmeyen bir content-encoding yanıt üst bilgisi değeri, ASP.NET Core uygulama yapılandırmasının değil web sunucusunun sonucu olabilir.

Yanıt Sıkıştırma Ara Yazılımının ne zaman kullanılacağını belirleme

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

Uygulama şu durumdayken Yanıt Sıkıştırma Ara Yazılımını kullanın:

Yanıt sıkıştırmayı keşfetme

Genellikle, yerel olarak sıkıştırılmayan tüm yanıtlar yanıt sıkıştırmasından yararlanabilir. Yerel olarak sıkıştırılmayan yanıtlar genellikle CSS, JavaScript, HTML, XML ve JSON'dur. PNG dosyaları gibi yerel olarak sıkıştırılmış varlıkları sıkıştırmayın. Yerel olarak sıkıştırılmış bir yanıtı daha fazla sıkıştırmaya çalışırken, boyutta ve iletim süresinde olabilecek ufak bir ek azalmanın etkisi, sıkıştırmayı işlemek için geçen sürenin gölgesinde kalabilir. Dosyanın içeriğine ve sıkıştırma verimliliğine bağlı olarak yaklaşık 150 - 1.000 bayttan küçük dosyaları sıkıştırmayın. Küçük dosyaları sıkıştırmanın yükü sıkıştırılmamış dosyadan daha büyük bir sıkıştırılmış dosyaya neden olabilir.

bir istemci sıkıştırılmış içeriği işleyebildiğinde, istemcinin istekle Birlikte Accept-Encoding üst bilgisini göndererek sunucuya özelliklerini bildirmesi gerekir. Bir sunucu sıkıştırılmış içerik gönderdiğinde, content-Encoding üst bilgisinde sıkıştırılmış yanıtın nasıl kodlandığına ilişkin bilgiler içermelidir.

Aşağıdaki tabloda, başlık için Accept-Encoding kodlama belirlemeleri gösterilir ve yanıt sıkıştırma ara yazılımının atamayı destekleyip desteklemediği belirtilir.

Hedef Middleware Format Details
br Evet (varsayılan) Brotli Sıkıştırılmış Veri Biçimi RFC 7932
deflate No DEFLATE Sıkıştırılmış Veri Biçimi RFC 1951
exi No Verimli XML Değişimi (EXI) W3C Önerisi
gzip Yes Gzip dosya biçimi RFC 1952
identity Yes "Kodlama yok" - yanıt kodlanmamalıdır Yanıt sıkıştırma sorunlarını giderme
pack200-gzip No Java arşivleri için Ağ Aktarım Biçimi JSR 200
* (yıldız) Yes "Joker" - açıkça talep edilmeyen kullanılabilir herhangi bir içerik kodlaması Yanıt sıkıştırma sorunlarını giderme
Hedef Middleware Format Details
br Evet (varsayılan) Brotli Sıkıştırılmış Veri Biçimi RFC 7932
deflate No DEFLATE Sıkıştırılmış Veri Biçimi RFC 1951
exi No Verimli XML Değişimi (EXI) W3C Önerisi
gzip Yes Gzip dosya biçimi RFC 1952
identity Yes "Kodlama yok" - yanıt kodlanmamalıdır Yanıt sıkıştırma sorunlarını giderme
pack200-gzip No Java arşivleri için Ağ Aktarım Biçimi JSR 200
zstd Evet (varsayılan) Zstandard Sıkıştırılmış Veri Biçimi RFC 8878
* (yıldız) Yes "Joker" - açıkça talep edilmeyen kullanılabilir herhangi bir içerik kodlaması Yanıt sıkıştırma sorunlarını giderme

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

Yanıt sıkıştırma ara yazılımı, özel Accept-Encoding üst bilgi değerleri için diğer sıkıştırma sağlayıcılarının eklenmesine olanak tanır. Daha fazla bilgi için bu makalenin devamında yer alan Özel Sağlayıcılar bölümüne bakın.

Yanıt sıkıştırma ara yazılımı, istemci tarafından sıkıştırma şemalarının önceliğini belirlemesi için gönderildiğinde kalite değerine (qvalue, q) yanıt verme yeteneğine sahiptir. Daha fazla bilgi için bkz . RFC 9110: HTTP Semantiği (Bölüm 12.5.3 Accept-Encoding).

Sıkıştırma algoritmaları, sıkıştırma hızı ile sıkıştırmanın etkinliği arasında bir dengeye tabidir. Bu bağlamdaki etkinlik , sıkıştırmadan sonra çı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 isteme, gönderme, önbelleğe alma ve alma ile ilgili üst bilgiler aşağıdaki tabloda açıklanmıştır.

Header Role Details
Accept-Encoding İstemci tarafından kabul edilebilir içerik kodlama düzenlerini belirtmek için istemciden sunucuya gönderilir. Accept-Encoding üst bilgisi
Content-Encoding Yükteki içeriğin kodlamasını belirtmek için sunucudan istemciye gönderilir. İçerik Kodlama üst bilgisi
Content-Length Sıkıştırma gerçekleştiğinde Content-Length üst bilgi, yanıt sıkıştırıldığında gövde içeriği değiştiğinden kaldırılır. İçerik Uzunluğu başlığı
Content-MD5 Sıkıştırma gerçekleştiğinde, Content-MD5 üst bilgisi kaldırılır çünkü gövde içeriği değişmiş ve karma artık geçerli değildir. RFC 1864: Content-MD5 Başlık Alanı
Content-Type İçeriğin MIME türünü belirtir. Her yanıt değerini Content-Type belirtmelidir. Yanıt sıkıştırma ara yazılımı, yanıtın sıkıştırılıp sıkıştırılmaması gerektiğini belirlemek için bu değeri denetler. Yanıt sıkıştırma ara yazılımı, kodlanabileceği varsayılan MIME türleri kümesini belirtir ve bunlar değiştirilebilir veya eklenebilir. İçerik Türü üst bilgisi
Vary Server tarafından Accept-Encoding değeriyle istemcilere ve ara sunuculara gönderildiğinde, Vary başlığı, istemciye veya ara sunucuya isteğin Accept-Encoding başlığına göre yanıtları önbelleğe alması gerektiğini gösterir. Üst bilgiyle Vary: Accept-Encoding içerik döndürmenin sonucu, hem sıkıştırılmış hem de sıkıştırılmamış yanıtların ayrı olarak önbelleğe alınmış olmasıdır. Üst bilgiyi değiştir

Örnek uygulamayla Yanıt Sıkıştırma Ara Yazılımının özelliklerini keşfedin. Örnek aşağıdakileri gösterir:

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

Yanıt Sıkıştırma Ara Yazılımını Yapılandırma

Aşağıdaki kodda, 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ın nasıl etkinleştirileceği gösterilmektedir:

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

Yanıt Sıkıştırma Ara Yazılımı hakkında notlar

Yanıt Sıkıştırma Ara Yazılımı ile çalışırken aşağıdaki noktaları aklınızda bulundurun:

  • özelliğinin EnableForHttps olarak true ayarlanması bir güvenlik riskidir. Daha fazla bilgi için bu makalenin önceki bölümlerindeki HTTPS ile sıkıştırma bölümüne bakın.
  • UseResponseCompression yöntemi, yanıtları sıkıştıran herhangi bir orta yazılımdan önce çağrılmalıdır. Daha fazla bilgi için bkz. ASP.NET Core Ara Yazılım > Ara Yazılım siparişi.
  • İstek üst bilgisini ayarlamak ve yanıt üst bilgilerini, boyutunu ve gövdesini incelemek için Accept-Encoding gibi bir araç kullanın.

Başlık içermeyen Accept-Encoding örnek uygulamaya bir istek gönderin ve yanıtın sıkıştırılmadığını gözlemleyin. Başlık Content-Encoding Yanıt Başlıkları koleksiyonunda değil.

Örneğin, Firefox Geliştiricisi'nde:

  1. Ağ sekmesini seçin.
  2. Ağ isteği listesinde isteğe sağ tıklayın ve Düzenle ve yeniden gönder'i seçin.
  3. Accept-Encoding: değerini gzip, deflate, br'den none'ye değiştirin.
  4. Gönder'i seçin.

Geliştirici araçlarını kullanarak bir tarayıcıyla örnek uygulamaya bir istek gönderin ve yanıtın sıkıştırıldığını gözlemleyin. yanıtta Content-Encoding ve Vary üst bilgileri bulunur.

Sağlayıcıları gözden geçirme

Bu bölümde Brotli, Gzip ve özel sağlayıcılar gibi sıkıştırma sağlayıcıları hakkında ayrıntılar sağlanır.

Bu bölümde Brotli, Gzip, Zstandard ve özel sağlayıcılar gibi sıkıştırma sağlayıcıları hakkında ayrıntılar sağlanır.

Brotli ve Gzip sıkıştırma sağlayıcıları

BrotliCompressionProvider RFC 7932: Brotli Sıkıştırılmış Veri Biçimi ile yanıtları sıkıştırmak için sınıfını kullanın.

Sınıfına CompressionProviderCollection:

  • Varsayılan olarak, Brotli ve Gzip sıkıştırma sağlayıcıları sıkıştırma sağlayıcıları dizisine eklenir.
  • İstemci Brotli sıkıştırılmış veri biçimini desteklediğinde, sıkıştırma varsayılan olarak Brotli sıkıştırması olarak kabul edilir.
  • İstemci Brotli'yi desteklemiyorsa, istemci Gzip sıkıştırmasını desteklediğinde sıkıştırma varsayılan olarak Gzip olur.
  • Varsayılan olarak, Brotli, Gzip ve Zstandard sıkıştırma sağlayıcıları sıkıştırma sağlayıcıları dizisine eklenir.
  • İstemci Zstandard sıkıştırılmış veri biçimini desteklediğinde, sıkıştırma varsayılan olarak Zstandard sıkıştırması olarak kabul edilir.
  • İstemci Zstandard'ı desteklemiyor ancak Brotli'yi destekliyorsa, sıkıştırma varsayılan olarak Brotli sıkıştırması olarak değiştirilir.
  • İstemci Zstandard veya Brotli'yi desteklemiyorsa, istemci Gzip sıkıştırmasını desteklediğinde sıkıştırma varsayılan olarak Gzip olur.

Sıkıştırma sağlayıcısı eklendiğinde, diğer sağlayıcılar eklenmez. Örneğin, açıkça eklenen tek sağlayıcı Gzip sıkıştırma sağlayıcısıysa, başka sıkıştırma sağlayıcısı eklenmez.

Note

.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürüm için etiket seçmek adına Dallar veya etiketler açılır listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).

Aşağıdaki kod:

  • HTTPS istekleri için yanıt sıkıştırmayı etkinleştirir.
  • Brotli ve Gzip yanıt sıkıştırma sağlayıcılarını ekler.
using System.IO.Compression;
using Microsoft.AspNetCore.ResponseCompression;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
    options.Providers.Add<BrotliCompressionProvider>();
    options.Providers.Add<GzipCompressionProvider>();
});

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

builder.Services.Configure<GzipCompressionProviderOptions>(options =>
{
    options.Level = CompressionLevel.SmallestSize;
});

var app = builder.Build();

app.UseResponseCompression();

app.MapGet("/", () => "Hello World!");

app.Run();

Sıkıştırma düzeyini BrotliCompressionProviderOptions sınıfı ve GzipCompressionProviderOptions sınıfıyla ayarlayın. Brotli ve Gzip sıkıştırma sağlayıcıları, CompressionLevel.Fastest sabit listesi tarafından belirlenen en hızlı sıkıştırma düzeyine varsayılan olarak sahiptir. Ancak bu yaklaşım en verimli sıkıştırmayı üretmeyebilir. En verimli sıkıştırma isteniyorsa, en iyi sıkıştırma için yanıt sıkıştırma ara yazılımını yapılandırın.

Sıkıştırma işleminin hız veya sıkıştırma boyutunu vurgulayıp vurgulamayacağını gösteren değerler için bkz. CompressionLevel Sabit Listesi.

using System.IO.Compression;
using Microsoft.AspNetCore.ResponseCompression;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
    options.Providers.Add<BrotliCompressionProvider>();
    options.Providers.Add<GzipCompressionProvider>();
});

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

builder.Services.Configure<GzipCompressionProviderOptions>(options =>
{
    options.Level = CompressionLevel.SmallestSize;
});

var app = builder.Build();

app.UseResponseCompression();

app.MapGet("/", () => "Hello World!");

app.Run();

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

ZstandardCompressionProvider RFC 8878: HTTP için Zstandard Compression ile yanıtları sıkıştırmak için sınıfını kullanın.

sınıfıyla ZstandardCompressionProviderOptions sıkıştırma kalitesini ayarlayın. Zstandard kalite düzeyi 1 ile 22 arasında değişir ve daha yüksek değerler daha iyi sıkıştırma ama daha düşük hızlar üretir. Aşağıdaki örnek, Zstandard sıkıştırma kalitesini ayarlar:

builder.Services.Configure<ZstandardCompressionProviderOptions>(options =>
{
    options.CompressionOptions = new ZstandardCompressionOptions
    {
        Quality = 6 // 1 to 22, higher = better compression, slower
    };
});

Özel sağlayıcılar

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

Accept-Encoding: mycustomcompression üst bilgi içeren istekler, örnek uygulamaya yapıldığında, Content-Encoding: mycustomcompression üst bilgi içeren bir yanıt döndürür. Özel sıkıştırma uygulamasının çalışması için istemcinin özel kodlamanın sıkıştırmasını kaldırabilmesi gerekir.

using Microsoft.AspNetCore.ResponseCompression;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCompression(options =>
{
    options.Providers.Add<BrotliCompressionProvider>();
    options.Providers.Add<GzipCompressionProvider>();
    options.Providers.Add<CustomCompressionProvider>();
});

var app = builder.Build();

app.UseResponseCompression();

app.MapGet("/", () => "Hello World!");

app.Run();
using Microsoft.AspNetCore.ResponseCompression;

public class CustomCompressionProvider : ICompressionProvider
{
    public string EncodingName => "mycustomcompression";
    public bool SupportsFlush => true;

    public Stream CreateStream(Stream outputStream)
    {
        // Replace with a custom compression stream wrapper.
        return outputStream;
    }
}

Yukarıdaki kodda örnek yanıt gövdesini sıkıştırmaz. Ancak örnek, özel sıkıştırma algoritmasının uygulanacağı yeri gösterir.

MIME türlerini gözden geçirme

Yanıt sıkıştırma ara yazılımı, sıkıştırma için varsayılan bir MIME türleri kümesi belirtir. Desteklenen MIME türlerinin tam listesi için kaynak kodu gözden geçirin.

Note

.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürüm için etiket seçmek adına Dallar veya etiketler açılır listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).

MIME türlerini ResponseCompressionOptions.MimeTypes özelliğiyle değiştirin veya ekleme. gibi text/* joker karakter MIME türleri desteklenmez. Örnek uygulama image/svg+xml için bir MIME türü ekler, ASP.NET Core banner görüntüsü banner.svg'yi sıkıştırır ve sunar.

using Microsoft.AspNetCore.ResponseCompression;
using ResponseCompressionSample;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
    options.Providers.Add<BrotliCompressionProvider>();
    options.Providers.Add<GzipCompressionProvider>();
    options.Providers.Add<CustomCompressionProvider>();
    options.MimeTypes =
    ResponseCompressionDefaults.MimeTypes.Concat(
        new[] { "image/svg+xml" });
});

var app = builder.Build();

app.UseResponseCompression();

Vary üst bilgisini ekle

Yanıtlar Accept-Encoding isteği üst bilgisine göre sıkıştırıldığında, yanıtın sıkıştırılmamış ve birden çok sıkıştırılmış sürümü olabilir. İstemci ve ara sunucu önbelleklerine birden çok sürümün mevcut olduğunu ve depolanması gerektiğini bildirmek için üst Vary bilgi bir Accept-Encoding değerle eklenir. Yanıt ara yazılımı, yanıt sıkıştırıldığında ResponseCompressionBody.cs dosyasına otomatik olarak 'Vary' üst bilgisini ekler.

Note

.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürüm için etiket seçmek adına Dallar veya etiketler açılır listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).

Nginx ters proxy ile ilgili sorunlar

Nginx isteği proxy olarak ilettiğinde Accept-Encoding başlık kaldırılır. Yanıt başlığının Accept-Encoding kaldırılması, yanıt sıkıştırma ara yazılımının yanıtı sıkıştırmasını engeller. Daha fazla bilgi için bkz. Nginx: Sıkıştırma ve açma. Bu sorun GitHub dotnet/aspnetcore sorunu #5989 - Nginx için geçiş sıkıştırmasını yapılandırma bölümünde izlenir.

IIS dinamik sıkıştırmayı devre dışı bırakma

Sunucu düzeyinde yapılandırılmış IIS Dinamik Sıkıştırma Modülünü devre dışı bırakmak için bkz . IIS modüllerini devre dışı bırakma.

Yanıt sıkıştırma sorunlarını giderme

İstek üst bilgisini ayarlamanıza ve yanıt üst bilgilerini, boyutunu ve gövdesini incelemenize olanak tanıyan Accept-Encoding gibi bir araç kullanın. Varsayılan olarak, Yanıt Sıkıştırma Ara Yazılımı aşağıdaki koşulları karşılayan yanıtları sıkıştırır:

  • Başlık Accept-Encoding, br, gzip veya * (yıldız işareti) değeriyle ya da özel sıkıştırma sağlayıcısına uygun özel bir kodlamayla bulunur. Değer, identity (kodlamasız) veya kalite değeri (qvalue, q) ayarı 0 (sıfır) olmamalıdır.
  • Accept-Encoding başlığı, br, gzip, zstd, * (yıldız) veya özel bir sıkıştırma sağlayıcısıyla eşleşen özel bir kodlama değerine sahip olarak bulunur. Değer, identity (kodlamasız) veya kalite değeri (qvalue, q) ayarı 0 (sıfır) olmamalıdır.
  • MIME türü (Content-Type) ayarlanmalı ve ResponseCompressionOptions sınıfında yapılandırılmış bir MIME türüyle eşleşmelidir.

  • İstek İçerik Aralığı üst bilgisini içermemelidir.

  • Güvenli köprü metni protokolü (https) Yanıt Sıkıştırma Ara Yazılımı seçeneklerinde yapılandırılmadığı sürece istek güvenli olmayan köprü metni protokollerini (http) kullanmalıdır.

    Important

    Bu makalenin önceki bölümlerinde HTTPS ile sıkıştırma bölümünde açıklandığı gibi güvenli içerik sıkıştırmayı etkinleştirmeyle ilgili riskleri gözden geçirin.

Dağıtılan Azure örneğini gözden geçirin

Azure'a dağıtılan örnek uygulamada aşağıdaki Program.cs dosyası vardır:

using Microsoft.AspNetCore.ResponseCompression;
using ResponseCompressionSample;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
    options.Providers.Add<BrotliCompressionProvider>();
    options.Providers.Add<GzipCompressionProvider>();
    options.Providers.Add<CustomCompressionProvider>();
    options.MimeTypes =
    ResponseCompressionDefaults.MimeTypes.Concat(
        new[] { "image/svg+xml" });
});

var app = builder.Build();

app.UseResponseCompression();

app.Map("/trickle", async (HttpResponse httpResponse) =>
{
    httpResponse.ContentType = "text/plain;charset=utf-8";

    for (int i = 0; i < 20; i++)
    {
        await httpResponse.WriteAsync("a");
        await httpResponse.Body.FlushAsync();
        await Task.Delay(TimeSpan.FromMilliseconds(50));
    }
});

app.Map("/testfile1kb.txt", () => Results.File(
    app.Environment.ContentRootFileProvider.GetFileInfo("testfile1kb.txt").PhysicalPath,
    "text/plain;charset=utf-8"));

app.Map("/banner.svg", () => Results.File(
    app.Environment.ContentRootFileProvider.GetFileInfo("banner.svg").PhysicalPath,
    "image/svg+xml;charset=utf-8"));

app.MapFallback(() => LoremIpsum.Text);

app.Run();

Ağ bant genişliği sınırlı bir kaynaktır. Yanıtın boyutunu azaltmak 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 (indirme)

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şmeyecektir. HTTP.sys sunucu ve Kestrel sunucu şu anda yerleşik sıkıştırma desteği sunmaz.

Aşağıdaki 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ılmayan tüm yanıtlar yanıt sıkıştırmasından yararlanabilir. Yerel olarak sıkıştırılmayan yanıtlar genellikle şunlardır: CSS, JavaScript, HTML, XML ve JSON. PNG dosyaları gibi yerel olarak sıkıştırılmış varlıkları sıkıştırmamalısınız. Doğal olarak sıkıştırılmış bir yanıtı daha fazla sıkıştırmaya çalışırsanız, boyut ve iletim süresindeki küçük bir ek azalma, sıkıştırmanın işlenmesi için geçen sürenin altında kalma ihtimali yüksektir. 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ırmanın yükü, sıkıştırılmamış dosyadan daha büyük bir sıkıştırılmış dosyaya neden olabilir.

Bir istemci sıkıştırılmış içeriği işleyebildiğinde, istemcinin Accept-Encoding başlığını istekle birlikte göndererek sunucuya yeteneklerini bildirmesi gerekir. Bir sunucu sıkıştırılmış içerik gönderdiğinde, üst bilgide sıkıştırılmış yanıtın Content-Encoding nasıl kodlandığına ilişkin bilgiler içermelidir. Ara yazılım tarafından desteklenen içerik kodlama gösterimleri aşağıdaki tabloda gösterilmiştir.

Accept-Encoding header 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şimi
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 Açıkça talep edilmeyen mevcut içerik kodlamaları

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

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

Ara yazılım, istemci tarafından sıkıştırma düzenlerine öncelik vermek üzere gönderildiğinde kalite değerine (qvalue, q) tepki verebilme özelliğine sahiptir. Daha fazla bilgi için bkz. RFC 9110: Accept-Encoding.

Sıkıştırma algoritmaları, sıkıştırma hızı ile sıkıştırmanın etkinliği arasında bir dengeye tabidir. Bu bağlamdaki etkinlik , sıkıştırmadan sonra çı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 isteme, gönderme, önbelleğe alma ve alma ile ilgili üst bilgiler aşağıdaki tabloda açıklanmıştır.

Header Role
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ı belirtmek için sunucudan istemciye gönderilir.
Content-Length Sıkıştırma gerçekleştiğinde, yanıt sıkıştırıldığında gövde içeriği değiştiği için Content-Length üst bilgisi kaldırılır.
Content-MD5 Sıkıştırma gerçekleştiğinde, Content-MD5 başlık kaldırılır; çünkü gövde içeriği değiştiği için karma artık geçerli değildir.
Content-Type İçeriğin MIME türünü belirtir. Her yanıt kendi değerini Content-Typebelirtmelidir. Ara yazılım, yanıtın sıkıştırılıp sıkıştırılmaması gerektiğini belirlemek için bu değeri denetler. Ara yazılım, kodlanabileceği varsayılan MIME türleri kümesini belirtir, ancak MIME türlerini değiştirebilir veya ekleyebilirsiniz.
Vary Server tarafından Accept-Encoding değeriyle istemcilere ve ara sunuculara gönderildiğinde, Vary başlığı, istemciye veya ara sunucuya isteğin Accept-Encoding başlığına göre yanıtları önbelleğe alması gerektiğini gösterir. Üst bilgiyle Vary: Accept-Encoding içerik döndürmenin sonucu, hem sıkıştırılmış hem de sıkıştırılmamış yanıtların ayrı olarak önbelleğe alınmış olmasıdır.

Örnek uygulamayla Yanıt Sıkıştırma Ara Yazılımının özelliklerini keşfedin. Örnek aşağıdakileri gösterir:

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

Configuration

Aşağıdaki kodda, 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ın nasıl etkinleştirileceği gösterilmektedir:

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

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

Notes:

Başlık içermeyen Accept-Encoding örnek uygulamaya bir istek gönderin ve yanıtın sıkıştırılmadığını gözlemleyin. yanıtta Content-Encoding ve Vary üst bilgileri yoktur.

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

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

Accept-Encoding üst bilgisine ve br değerine sahip bir isteğin sonucunu gösteren Fiddler penceresi. Vary ve Content-Encoding üst bilgileri yanıta eklenir. Yanıt sıkıştırılır.

Providers

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.

Eğer sıkıştırma sağlayıcıları CompressionProviderCollection'ye açıkça eklenmediyse:

  • Brotli Sıkıştırma Sağlayıcısı varsayılan olarak Gzip sıkıştırma sağlayıcısıyla birlikte sıkıştırma sağlayıcıları dizisine eklenir.
  • Brotli sıkıştırılmış veri biçimi istemci tarafından desteklendiğinde sıkıştırma varsayılan olarak Brotli sıkıştırması olarak ayarlanır. Brotli istemci tarafından desteklenmiyorsa, istemci Gzip sıkıştırmasını desteklediğinde 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ç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" });
    });
}

ile BrotliCompressionProviderOptionssıkıştırma düzeyini ayarlayın. Brotli Sıkıştırma Sağlayıcısı varsayılan olarak en hızlı sıkıştırma düzeyine (CompressionLevel.Fastest) sahiptir ve en verimli sıkıştırmayı üretmeyebilir. En verimli sıkıştırma isteniyorsa ara yazılımı en iyi 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ıyor olsa bile sıkıştırma mümkün olan en kısa sürede tamamlanmalıdır.
CompressionLevel.NoCompression Sıkıştırma yapılmamalıdır.
CompressionLevel.Optimal Sıkıştırmanın tamamlanması daha uzun sürse bile yanıtlar en iyi şekilde sıkıştırılmalıdı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 kullanarak Gzip dosya formatıyla sıkıştırın.

Eğer sıkıştırma sağlayıcıları CompressionProviderCollection'ye açıkça eklenmediyse:

  • Gzip Sıkıştırma Sağlayıcısı, Brotli Sıkıştırma Sağlayıcısı ile birlikte sıkıştırma sağlayıcıları dizisine varsayılan olarak eklenir.
  • Brotli sıkıştırılmış veri biçimi istemci tarafından desteklendiğinde sıkıştırma varsayılan olarak Brotli sıkıştırması olarak ayarlanır. Brotli istemci tarafından desteklenmiyorsa, istemci Gzip sıkıştırmasını desteklediğinde 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ça eklendiğinde Gzip 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" });
    });
}

ile GzipCompressionProviderOptionssıkıştırma düzeyini ayarlayın. Gzip Sıkıştırma Sağlayıcısı varsayılan olarak en hızlı sıkıştırma düzeyine (CompressionLevel.Fastest) sahiptir ve en verimli sıkıştırmayı üretmeyebilir. En verimli sıkıştırma isteniyorsa ara yazılımı en iyi 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ıyor olsa bile sıkıştırma mümkün olan en kısa sürede tamamlanmalıdır.
CompressionLevel.NoCompression Sıkıştırma yapılmamalıdır.
CompressionLevel.Optimal Sıkıştırmanın tamamlanması daha uzun sürse bile yanıtlar en iyi şekilde sıkıştırılmalıdır.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

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

Özel sağlayıcılar

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

İstemci, örnek uygulamayı kullanarak Accept-Encoding: mycustomcompression üst bilgisi üzerinden bir istek gönderir. Ara yazılım, özel sıkıştırma uygulamasını kullanır ve yanıtı üst Content-Encoding: mycustomcompression bilgiyle döndürür. Özel sıkıştırma uygulamasının çalışması için istemcinin özel kodlamanın sıkıştırmasını kaldırabilmesi 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;
    }
}

Başlık olarak Accept-Encoding: mycustomcompression ile örnek uygulamaya bir istek gönderin ve yanıtın başlıklarını gözlemleyin. yanıtta Vary ve Content-Encoding üst bilgileri bulunur. Yanıt gövdesi (gösterilmiyor) örnek tarafından sıkıştırılmaz. Örnek class'ında CustomCompressionProvider sıkıştırma uygulaması yoktur. Ancak örnek, böyle bir sıkıştırma algoritmasını nereye uygulayabileceğinizi gösterir.

Accept-Encoding üst bilgisine ve mycustomcompression değerine sahip bir isteğin sonucunu gösteren Fiddler penceresi. Vary ve Content-Encoding üst bilgileri 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 Response Compression Middleware seçenekleriyle değiştirin veya ekleyin. Gibi text/* joker karakter MIME türlerinin desteklenmediğini unutmayın. Örnek uygulama, image/svg+xml için bir MIME türü ekler ve ASP.NET Core banner 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ılmış yanıtlar, varsayılan olarak devre dışı bırakılan seçenekle EnableForHttps denetlenebilir. Dinamik olarak oluşturulan sayfalarla sıkıştırmanın kullanılması, CRIME ve BREACH saldırıları gibi güvenlik sorunlarına yol açabilir.

Vary üst bilgisini ekleme

Yanıtları Accept-Encoding başlığı temelinde sıkıştırırken, yanıtın birden çok sıkıştırılmış sürümü ve sıkıştırılmamış bir sürümü vardır. İstemci ve ara sunucu önbelleklerine birden çok sürümün mevcut olduğunu ve depolanması gerektiğini bildirmek amacıyla Vary üst bilgisi, Accept-Encoding değeri ile eklenir. ASP.NET Core 2.0 veya sonraki sürümlerinde, ara katman yazılımı yanıt sıkıştırıldığında Vary üst bilgisini otomatik olarak ekler.

Nginx ters proxy arkasında orta katman yazılımı sorunu

Bir istek Nginx tarafından proxy olarak iletildiğinde Accept-Encoding başlığı kaldırılır. Üst bilginin Accept-Encoding kaldırılması ara yazılımının yanıtı sıkıştırmasını engeller. Daha fazla bilgi için bkz . NGINX: Sıkıştırma ve Sıkıştırmayı Açma. Bu sorun, Nginx için geçiş sıkıştırmasını (dotnet/aspnetcore#5989) çözerek izlenir.

IIS dinamik sıkıştırması 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ü varsa, web.config dosyasına ek olarak modülü devre dışı bırakın. Daha fazla bilgi için bkz . IIS modüllerini devre dışı bırakma.

Troubleshooting

Fiddler veya Firefox Browser Developer gibi bir araç kullanarak istek başlıklarını ayarlayabilir ve yanıt başlıklarını, boyutu ve gövdesini inceleyebilirsiniz. Varsayılan olarak, Yanıt Sıkıştırma Ara Yazılımı aşağıdaki koşulları karşılayan yanıtları sıkıştırır:

  • Üst bilgi Accept-Encoding, br, gzip, * veya oluşturduğunuz özel sıkıştırma sağlayıcısıyla eşleşen özel kodlama değeriyle bulunur. Değer identity olmamalı veya kalite değeri (qvalue, q) ayarı 0 (sıfır) olmamalıdır.
  • MIME türü (Content-Type) ayarlanmalıdır ve ResponseCompressionOptions üzerinde yapılandırılmış bir MIME türüyle eşleşmelidir.
  • İstek Content-Range üst bilgiyi içermemelidir.
  • Yanıt Sıkıştırma Ara Yazılımı seçeneklerinde güvenli protokol (https) yapılandırılmadığı sürece istek güvenli olmayan protokolü (http) kullanmalıdır. Güvenli içerik sıkıştırmayı etkinleştirirken yukarıda açıklanan tehlikeye dikkat edin.

Ek kaynaklar