Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
Aşağıdaki sunucu tabanlı sıkıştırma teknolojileri kullanılamaz:
Doğrudan barındırma:
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
EnableForHttpsolaraktrueayarlanması 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-Encodinggibi 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:
- Ağ sekmesini seçin.
- Ağ isteği listesinde isteğe sağ tıklayın ve Düzenle ve yeniden gönder'i seçin.
-
Accept-Encoding:değerinigzip, deflate, br'dennone'ye değiştirin. - 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,gzipveya*(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-Encodingbaş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();
İlgili içerik
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. 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:
-
app.UseResponseCompressionyanı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ı. - Bir araç olarak Fiddler veya Firefox Tarayıcı Geliştiricisi kullanarak istek üst bilgisini ayarlayın ve yanıt üst bilgilerini, boyutunu ve metnini inceleyin.
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: 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.
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.
MIME türleri
Ara yazılım sıkıştırma için varsayılan bir MIME türleri kümesi belirtir:
application/javascriptapplication/jsonapplication/xmltext/csstext/htmltext/jsontext/plaintext/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ğeridentityolmamalı 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
ASP.NET Core