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:
- Aşağıdaki sunucu tabanlı sıkıştırma teknolojileri kullanılamaz:
- Doğrudan barındırma:
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'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, 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-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 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:
- ayarı
EnableForHttps
true
bir güvenlik riskidir. Daha fazla bilgi için bu makaledeki HTTPS ile sıkıştırma bölümüne bakın. app.UseResponseCompression
yanıtları sıkıştıran herhangi bir ara yazılımdan önce çağrılmalıdır. Daha fazla bilgi için, bkz. ASP.NET Core Ara Yazılımı.- İstek üst bilgisini ayarlamak
Accept-Encoding
ve yanıt üst bilgilerini, boyutunu ve gövdesini incelemek için Firefox Browser Developer gibi bir araç kullanın.
Ü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, br
none
değ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.MimeTypes
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 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-Encoding
gö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ğeriylebr
birlikte bulunur. Değerin 0 (sıfır) kalite değeri (qvalue,q
) ayarı olmamalıdıridentity
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:
- Aşağıdaki sunucu tabanlı sıkıştırma teknolojileri kullanılamaz:
- Doğrudan barındırma:
- HTTP.sys sunucusu (eski adıyla WebListener)
- Kestrel sunucu
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. 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-Type belirtmelidir. 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:
app.UseResponseCompression
yanıtları sıkıştıran herhangi bir ara yazılımdan önce çağrılmalıdır. Daha fazla bilgi için, bkz. ASP.NET Core Ara Yazılımı.- İstek üst bilgisini ayarlamak
Accept-Encoding
ve yanıt üst bilgilerini, boyutunu ve gövdesini incelemek için Fiddler, Firefox Browser Developer gibi bir araç kullanın.
Ü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.
Ü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.
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.
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ğeriylebr
birlikte bulunur. Değerin 0 (sıfır) kalite değeri (qvalue,q
) ayarı olmamalıdıridentity
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
ASP.NET Core