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 boyutlarını azaltmanın bir yolu, bir uygulamanın yanıtlarını sıkıştırmaktır.

HTTPS ile sıkıştırma

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ırma kullanılması, uygulamayı ve BREACH saldırılarını CRIME kullanıma açabilir. 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 bilgi için bkz.http://www.breachattack.com/

Uygulamada devre dışı bırakıldığında EnableForHttps bile IIS, IIS Express ve Azure Uygulaması Hizmeti IIS web sunucusuna gzip uygulayabilir. Yanıt üst bilgilerini gözden geçirirken Sunucu değerini not alın. Beklenmeyen content-encoding bir 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ı ne zaman kullanılır?

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şmeyecektir. HTTP.sys sunucu ve Kestrel sunucu ş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ı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 CSS, JavaScript, HTML, XML ve JSON'dır. 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, boyut ve iletim süresindeki küçük ek azalmalar, sıkıştırmayı işlemek için gereken süreye göre gölgelenecektir. Dosyanın içeriğine ve sıkıştırmanın verimliliğine bağlı olarak, yaklaşık 150-1000 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 üst bilgiyi istekle birlikte göndererek sunucuya Accept-Encoding özelliklerini 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. Yanıt sıkıştırma ara yazılımı tarafından desteklenen içerik kodlama gösterimleri aşağıdaki tabloda gösterilmiştir.

Accept-Encoding üst bilgi değerleri Desteklenen Ara Yazılım Açıklama
br Evet (varsayılan) Brotli sıkıştırılmış veri biçimi
deflate Hayır DEFLATE sıkıştırılmış veri biçimi
exi Hayır 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 Hayır Java Arşivleri için Ağ Aktarım Biçimi
* Yes Açıkça istenmeyen kullanılabilir içerik kodlamaları

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

Yanıt sıkıştırma ara yazılımı, özel Accept-Encoding üst bilgi değerleri için ek sıkıştırma sağlayıcıları eklenmesine olanak tanır. Daha fazla bilgi için bu makaledeki Ö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: 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.

Üst bilgi 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 Content-Length , yanıt sıkıştırıldığında gövde içeriği değiştiğinden ü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 üst bilgi kaldırılır.
Content-Type İçeriğin MIME türünü belirtir. Her yanıt kendi değerini Content-Typebelirtmelidir. 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 bir dizi varsayılan MIME türünü belirtir ve yatakları değiştirilebilir veya eklenebilir.
Vary Sunucu tarafından değeri Accept-Encoding istemcilere ve ara sunuculara gönderildiğinde, üst bilgi istemciye Vary veya ara sunucuya isteğin üst bilgisinin Accept-Encoding değerine göre yanıtları önbelleğe alması (değişiklik yapması) gerektiğini belirtir. Ü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.
  • Özel yanıt sıkıştırma sağlayıcısı ekleme.

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:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCompression(options =>
{
    options.EnableForHttps = true;
});

var app = builder.Build();

app.UseResponseCompression();

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

app.Run();

Notlar:

Üst bilgi olmadan Accept-Encoding örnek uygulamaya bir istek gönderin ve yanıtın sıkıştırılmadığını gözlemleyin. Üst Content-Encoding bilgi Yanıt Üst Bilgileri koleksiyonunda değil.

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

  • Ağ sekmesini seçin.
  • Ağ isteği listesinde isteğe sağ tıklayın ve Düzenle ve yeniden gönder'i seçin
  • olarak gzip, deflate, brnonedeğiştirinAccept-Encoding:.
  • 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

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

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

Sıkıştırma sağlayıcıları açıkça öğesine CompressionProviderCollectioneklenmediyse:

  • Brotli sıkıştırma sağlayıcısı ve Gzip sıkıştırma sağlayıcısı varsayılan olarak 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.

Not

.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ün etiketini seçmek için Dalları veya etiketleri değiştir açılan listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).

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.

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();

ve GzipCompressionProviderOptionsile BrotliCompressionProviderOptions sıkıştırma düzeyini ayarlayın. Brotli ve Gzip sıkıştırma sağlayıcıları varsayılan olarak en hızlı sıkıştırma düzeyi olan CompressionLevel.Fastest'e ayarlıdır ve 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 vurgulamadığını gösteren değerler için bkz . CompressionLevel Enum .

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();

Ö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. 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.

Üst bilgi içeren örnek uygulamaya yapılan Accept-Encoding: mycustomcompression istekler üst bilgi içeren bir Content-Encoding: mycustomcompression 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 kodla, yanıt gövdesi örnek tarafından sıkıştırılamaz. Ancak örnek, özel sıkıştırma algoritmasının uygulanacağı yeri gösterir.

MIME türleri

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 koduna bakın.

Not

.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ün etiketini seçmek için Dalları veya etiketleri değiştir açılan 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 ile ResponseCompressionOptions.MimeTypesdeğiştirin veya ekler. Gibi text/* joker karakter MIME türlerinin desteklenmediğini unutmayın. Örnek uygulama için image/svg+xml bir MIME türü ekler ve ASP.NET Core başlık görüntüsünü banner.svg sıkıştırır ve gösterir.

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 ekleme

yanıtları istek üst bilgisine Accept-Encodinggöre sıkıştırırken, sıkıştırılmamış ve yanıtın 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 üst bilgiyi otomatik olarak eklerVary.

Not

.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ün etiketini seçmek için Dalları veya etiketleri değiştir açılan 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 ara sunucusunun arkasında ara yazılım sorunu

bir istek Nginx tarafından proksied olduğunda üst Accept-Encoding bilgi kaldırılır. Üst bilginin 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 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ını 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 ayarlamaya Accept-Encoding ve yanıt üst bilgilerini, boyutunu ve gövdesini incelemeye olanak tanıyan Firefox Browser Developer 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:

  • Üst Accept-Encoding bilgi, özel sıkıştırma sağlayıcısıyla eşleşen , gzip, *veya özel kodlama değeriyle brbirlikte bulunur. Değerin 0 (sıfır) kalite değeri (qvalue, q) ayarı olmamalıdır identity veya olmamalıdır.
  • MIME türü (Content-Type) ayarlanmalıdır ve üzerinde yapılandırılmış bir MIME türüyle ResponseCompressionOptionseşleşmelidir.
  • İstek üst bilgi içermemelidir Content-Range .
  • 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.

Azure tarafından dağıtılan örnek

Azure'a dağıtılan örnek uygulamada aşağıdaki Program.cs dosya 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();

Ek kaynaklar

Not

.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ün etiketini seçmek için Dalları veya etiketleri değiştir açılan 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ğ 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 şunları içerir: 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. Yerel olarak sıkıştırılmış bir yanıtı daha fazla sıkıştırmaya çalışırsanız, boyutu ve iletim süresindeki küçük bir ek azalma, sıkıştırmayı işlemek için geçen süreye göre gölgelenir. 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 üst bilgiyi istekle birlikte göndererek sunucuya Accept-Encoding özelliklerini 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 üst bilgi değerleri Desteklenen Ara Yazılım Açıklama
br Evet (varsayılan) Brotli sıkıştırılmış veri biçimi
deflate Hayır DEFLATE sıkıştırılmış veri biçimi
exi Hayır 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 Hayır Java Arşivleri için Ağ Aktarım Biçimi
* Yes Açıkça istenmeyen kullanılabilir 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.

Üst bilgi 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 Content-Length , yanıt sıkıştırıldığında gövde içeriği değiştiğinden ü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 üst bilgi kaldırılır.
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 Sunucu tarafından değeri Accept-Encoding istemcilere ve ara sunuculara gönderildiğinde, üst bilgi istemciye Vary veya ara sunucuya isteğin üst bilgisinin Accept-Encoding değerine göre yanıtları önbelleğe alması (değişiklik yapması) gerektiğini belirtir. Ü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.

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:

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

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

Notlar:

Üst bilgi olmadan 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.

Fiddler window showing result of a request without the Accept-Encoding header. The response isn't compressed.

Üst bilgi (Brotli sıkıştırma) ile Accept-Encoding: br ö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.

Fiddler window showing result of a request with the Accept-Encoding header and a value of br. The Vary and Content-Encoding headers are added to the response. The response is compressed.

Sağlayıcılar

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

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

Sıkıştırma sağlayıcıları açıkça öğesine CompressionProviderCollectioneklenmediyse:

  • 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 Açıklama
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ı

Gzip dosya biçimiyle yanıtları sıkıştırmak için kullanınGzipCompressionProvider.

Sıkıştırma sağlayıcıları açıkça öğesine CompressionProviderCollectioneklenmediyse:

  • 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 Açıklama
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 üst bilgiyle Accept-Encoding: mycustomcompression 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;
    }
}

Üst bilgiyle Accept-Encoding: mycustomcompression örnek uygulamaya bir istek gönderin ve yanıt üst bilgilerini inceleyin. yanıtta Vary ve Content-Encoding üst bilgileri bulunur. Yanıt gövdesi (gösterilmiyor) örnek tarafından sıkıştırılmaz. Örneğin sınıfında sıkıştırma uygulaması CustomCompressionProvider yoktur. Ancak örnek, böyle bir sıkıştırma algoritmasını nereye uygulayabileceğinizi gösterir.

Fiddler window showing result of a request with the Accept-Encoding header and a value of mycustomcompression. The Vary and Content-Encoding headers are added to the response.

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 ekler. Gibi text/* joker karakter MIME türlerinin desteklenmediğini unutmayın. Örnek uygulama için image/svg+xml bir MIME türü ekler ve ASP.NET Core başlık görüntüsünü (banner.svg) sıkıştırır ve hizmet eder.

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ı ve BREACH saldırıları gibi güvenlik sorunlarına CRIME yol açabilir.

Vary üst bilgisini ekleme

Yanıtları üst bilgi temelinde sıkıştırırken, yanıtın Accept-Encoding 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 için üst Vary bilgi bir Accept-Encoding değerle eklenir. ASP.NET Core 2.0 veya sonraki sürümlerinde, ara yazılım yanıt sıkıştırıldığında üst bilgiyi otomatik olarak ekler Vary .

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

bir istek Nginx tarafından proksied olduğunda üst Accept-Encoding bilgi 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.

Sorun giderme

fiddler veya Firefox Browser Developer gibi bir araç kullanarak istek üst bilgisini ayarlayabilir Accept-Encoding ve yanıt üst bilgilerini, boyutunu 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 Accept-Encoding bilgi, oluşturduğunuz özel sıkıştırma sağlayıcısıyla eşleşen , gzip, *veya özel kodlama değeriyle brbirlikte bulunur. Değerin 0 (sıfır) kalite değeri (qvalue, q) ayarı olmamalıdır identity veya olmamalıdır.
  • MIME türü (Content-Type) ayarlanmalıdır ve üzerinde yapılandırılmış bir MIME türüyle ResponseCompressionOptionseşleşmelidir.
  • İstek üst bilgi içermemelidir Content-Range .
  • 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