События
Чемпионат мира Power BI DataViz
14 февр., 16 - 31 мар., 16
С 4 шансами войти, вы можете выиграть пакет конференции и сделать его в LIVE Grand Finale в Лас-Вегасе
ПодробнееЭтот браузер больше не поддерживается.
Выполните обновление до Microsoft Edge, чтобы воспользоваться новейшими функциями, обновлениями для системы безопасности и технической поддержкой.
Пропускная способность сети — это ограниченный ресурс. Уменьшение размера ответа обычно увеличивает скорость реагирования приложения, часто резко. Одним из способов уменьшения размера полезных данных является сжатие ответов приложения.
Сжатые ответы по защищенным подключениям можно контролировать с EnableForHttps помощью параметра, который по умолчанию отключен из-за риска безопасности. Использование сжатия с динамически созданными страницами может предоставлять приложению CRIME доступ к атакам и BREACH атакам. CRIME и BREACH атаки можно устранить в ASP.NET Core с помощью маркеров защиты от подделки. Дополнительные сведения см. на странице Предотвращение атак с использованием подделки межсайтовых запросов (XSRF/CSRF) в ASP.NET Core. Сведения об устранении рисков см. в статье об устранении BREACH рисковhttp://www.breachattack.com/
Даже если EnableForHttps
приложение отключено, IIS, IIS Express и служба приложение Azure могут применять gzip на веб-сервере IIS. При просмотре заголовков ответов обратите внимание на значение сервера . Непредвиденное content-encoding
значение заголовка ответа может быть результатом веб-сервера, а не конфигурацией ASP.NET Core.
Используйте серверные технологии сжатия ответов в IIS, Apache или Nginx. Производительность ПО промежуточного слоя сжатия ответа, вероятно, не будет соответствовать производительности модулей сервера. HTTP.sys сервере и Kestrel сервере в настоящее время не предоставляют встроенную поддержку сжатия.
Используйте ПО промежуточного слоя сжатия ответов, если это приложение:
Как правило, любой ответ, не сжатый в собственном коде, может воспользоваться сжатием отклика. Ответы, не сжатые в собственном коде, обычно включают CSS, JavaScript, HTML, XML и JSON. Не сжимайте собственные сжатые ресурсы, такие как PNG-файлы. При попытке дальнейшего сжатия собственно сжатого отклика любое небольшое дополнительное уменьшение размера и времени передачи, скорее всего, затмевает время обработки сжатия. Не сжимайте файлы меньше 150–1000 байт, в зависимости от содержимого файла и эффективности сжатия. Накладные расходы на сжатие небольших файлов могут создать сжатый файл больше, чем несжатый файл.
Когда клиент может обрабатывать сжатое содержимое, клиент должен сообщить серверу о своих возможностях, отправив Accept-Encoding
заголовок с запросом. Когда сервер отправляет сжатое содержимое, он должен содержать сведения в заголовке Content-Encoding
о кодировании сжатого ответа. Обозначения кодировки содержимого, поддерживаемые ПО промежуточного слоя сжатия ответов, показаны в следующей таблице.
Значения заголовков Accept-Encoding |
Поддерживаемые ПО промежуточного слоя | Description |
---|---|---|
br |
Да (по умолчанию) | Формат сжатых данных Brotli |
deflate |
No | Формат сжатых данных Deflate |
exi |
No | Эффективный обмен XML W3C |
gzip |
Да | Формат файлов gzip |
identity |
Да | Идентификатор "Нет кодирования": ответ не должен быть закодирован. |
pack200-gzip |
No | Формат сетевой передачи для архивов Java |
* |
Да | Любая доступная кодировка содержимого не запрашивается явным образом |
Дополнительные сведения см. в списке кодирования официального содержимого IANA.
ПО промежуточного слоя сжатия ответа позволяет добавлять дополнительные поставщики сжатия для пользовательских Accept-Encoding
значений заголовков. Дополнительные сведения см . в разделе "Пользовательские поставщики " в этой статье.
ПО промежуточного слоя сжатия ответа может реагировать на значение качества (qvalue, q
) вес при отправке клиентом, чтобы определить приоритеты схем сжатия. Дополнительные сведения см. в статье RFC 9110: Accept-Encoding.
Алгоритмы сжатия подвергаются компромиссу между скоростью сжатия и эффективностью сжатия. Эффективность в этом контексте относится к размеру выходных данных после сжатия. Наименьший размер достигается оптимальным сжатием.
Заголовки, участвующие в запросе, отправке, кэшировании и получении сжатого содержимого, описаны в следующей таблице.
Верхний колонтитул | Роль |
---|---|
Accept-Encoding |
Отправляется от клиента на сервер, чтобы указать схемы кодирования содержимого, приемлемые для клиента. |
Content-Encoding |
Отправляется с сервера на клиент, чтобы указать кодировку содержимого в полезных данных. |
Content-Length |
При сжатии заголовок удаляется, Content-Length так как содержимое тела изменяется при сжатии ответа. |
Content-MD5 |
При сжатии заголовок удаляется, Content-MD5 так как содержимое тела изменилось, и хэш больше не действителен. |
Content-Type |
Указывает тип MIME содержимого. Каждый ответ должен указывать его Content-Type . ПО промежуточного слоя сжатия ответа проверяет это значение, чтобы определить, следует ли сжать ответ. ПО промежуточного слоя сжатия ответа указывает набор типов MIME по умолчанию, которые он может кодировать, и они могут заменить или добавить кровать. |
Vary |
При отправке сервером со значением Accept-Encoding клиентов и прокси-серверов Vary заголовок указывает клиенту или прокси-серверу, что он должен кэшировать (изменять) ответы в зависимости от значения Accept-Encoding заголовка запроса. Результат возврата содержимого с Vary: Accept-Encoding заголовком заключается в том, что сжатые и несжатые ответы кэшируются отдельно. |
Ознакомьтесь с функциями ПО промежуточного слоя сжатия ответов с помощью примера приложения. Пример иллюстрирует следующее:
В следующем коде показано, как включить ПО промежуточного слоя сжатия ответа для типов MIME по умолчанию и поставщиков сжатия (Brotli и Gzip):
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
});
var app = builder.Build();
app.UseResponseCompression();
app.MapGet("/", () => "Hello World!");
app.Run();
Примечания:
true
Параметром EnableForHttps
является риск безопасности. Дополнительные сведения см. в разделе "Сжатие с помощью HTTPS " в этой статье.app.UseResponseCompression
необходимо вызвать перед любым ПО промежуточного слоя, которое сжимает ответы. Дополнительные сведения см. в статье ПО промежуточного слоя ASP.NET Core.Accept-Encoding
заголовок запроса и проверить заголовки ответа, размер и текст.Отправьте запрос в пример приложения без заголовка Accept-Encoding
и обратите внимание, что ответ не сжат. Заголовок Content-Encoding
не содержится в коллекции заголовков ответа.
Например, в Firefox Developer:
Accept-Encoding:
с gzip, deflate, br
none
.Отправьте запрос в пример приложения с браузером с помощью средств разработчика и обратите внимание, что ответ сжимается. В Content-Encoding
ответе присутствуют заголовки Vary
.
BrotliCompressionProvider Используйте для сжатия ответов с форматом сжатых данных Brotli.
Если поставщики сжатия явно не добавляются в :CompressionProviderCollection
Примечание
По ссылкам в документации на справочные материалы по .NET обычно загружается ветвь репозитория по умолчанию, которая представляет текущую разработку для следующего выпуска .NET. Чтобы выбрать тег для определенного выпуска, используйте раскрывающийся список Switch branches or tags (Переключение ветвей или тегов). Дополнительные сведения см. в статье Выбор тега версии исходного кода ASP.NET Core (dotnet/AspNetCore.Docs #26205).
При добавлении поставщика сжатия другие поставщики не добавляются. Например, если поставщик сжатия Gzip является единственным поставщиком явно добавлен, другие поставщики сжатия не добавляются.
Следующий код:
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();
Задайте уровень сжатия с BrotliCompressionProviderOptions помощью и GzipCompressionProviderOptions. Поставщики сжатия Brotli и Gzip по умолчанию по умолчанию являются самым быстрым уровнем сжатия, CompressionLevel.Fastest, что может не производить наиболее эффективное сжатие. Если необходимо максимально эффективное сжатие, настройте ПО промежуточного слоя сжатия отклика для оптимального сжатия.
См . перечисление CompressionLevel для значений, указывающих, подчеркивает ли операция сжатия скорость или размер сжатия.
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();
Создание пользовательских реализаций сжатия с ICompressionProviderпомощью . Представляет EncodingName кодировку содержимого, которая производится ICompressionProvider
. ПО промежуточного слоя сжатия ответа использует эти сведения для выбора поставщика на основе списка, указанного в Accept-Encoding
заголовке запроса.
Запросы к примеру приложения с Accept-Encoding: mycustomcompression
заголовком возвращают ответ с заголовком Content-Encoding: mycustomcompression
. Клиент должен иметь возможность распаковывать настраиваемую кодировку для работы пользовательской реализации сжатия.
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;
}
}
В приведенном выше коде текст ответа не сжимается примером. Однако в примере показано, где реализовать пользовательский алгоритм сжатия.
ПО промежуточного слоя сжатия ответа указывает набор типов MIME по умолчанию для сжатия. Полный список поддерживаемых типов MIME см. в исходном коде.
Примечание
По ссылкам в документации на справочные материалы по .NET обычно загружается ветвь репозитория по умолчанию, которая представляет текущую разработку для следующего выпуска .NET. Чтобы выбрать тег для определенного выпуска, используйте раскрывающийся список Switch branches or tags (Переключение ветвей или тегов). Дополнительные сведения см. в статье Выбор тега версии исходного кода ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Замените или добавьте типы MIME на ResponseCompressionOptions.MimeTypes
. Обратите внимание, что типы MIME с подстановочными знаками, такие как text/*
не поддерживаются. Пример приложения добавляет тип MIME для image/svg+xml
и сжимает и служит ASP.NET образ баннера Core banner.svg.
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();
При сжатие ответов на основе заголовка Accept-Encoding
запроса могут быть несжаты и несколько сжатых версий ответа. Чтобы указать клиентским и прокси-кэшам, которые существуют и должны храниться несколько версий, Vary
заголовок добавляется со значением Accept-Encoding
. ПО промежуточного Vary
слоя ответа автоматически добавляет заголовок при сжатии ответа.
Примечание
По ссылкам в документации на справочные материалы по .NET обычно загружается ветвь репозитория по умолчанию, которая представляет текущую разработку для следующего выпуска .NET. Чтобы выбрать тег для определенного выпуска, используйте раскрывающийся список Switch branches or tags (Переключение ветвей или тегов). Дополнительные сведения см. в статье Выбор тега версии исходного кода ASP.NET Core (dotnet/AspNetCore.Docs #26205).
При использовании запроса nginx Accept-Encoding
заголовок удаляется. Удаление заголовка предотвращает сжатие отклика ПО промежуточного Accept-Encoding
слоя сжатия ответа от сжатия ответа. Дополнительные сведения см. в разделе NGINX: Сжатие и декомпрессия. Эта проблема отслеживается путем определения сквозного сжатия для Nginx (dotnet/aspnetcore#5989).
Чтобы отключить модуль динамического сжатия IIS, настроенный на уровне сервера, см. раздел "Отключение модулей IIS".
Используйте средство, например Firefox Browser Developer, которое позволяет задавать Accept-Encoding
заголовок запроса и изучать заголовки ответа, размер и текст. По умолчанию ПО промежуточного слоя сжатия ответа сжимает ответы, соответствующие следующим условиям:
Accept-Encoding
присутствует со значением br
, gzip
*
или пользовательской кодировкой, которая соответствует пользовательскому поставщику сжатия. Значение не должно быть identity
или иметь значение качества (qvalue, q
) значение 0 (ноль).Content-Type
) должен быть задан и должен соответствовать типу MIME, настроенного для него ResponseCompressionOptions.Content-Range
заголовок.Пример приложения, развернутого в Azure, имеет следующий Program.cs
файл:
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();
Примечание
По ссылкам в документации на справочные материалы по .NET обычно загружается ветвь репозитория по умолчанию, которая представляет текущую разработку для следующего выпуска .NET. Чтобы выбрать тег для определенного выпуска, используйте раскрывающийся список Switch branches or tags (Переключение ветвей или тегов). Дополнительные сведения см. в статье Выбор тега версии исходного кода ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Пропускная способность сети — это ограниченный ресурс. Уменьшение размера ответа обычно увеличивает скорость реагирования приложения, часто резко. Одним из способов уменьшения размера полезных данных является сжатие ответов приложения.
Просмотреть или скачать образец кода (описание загрузки)
Используйте серверные технологии сжатия ответов в IIS, Apache или Nginx. Производительность по промежуточного слоя, вероятно, не будет соответствовать производительности модулей сервера. HTTP.sys сервере и Kestrel сервере в настоящее время не предоставляют встроенную поддержку сжатия.
Используйте ПО промежуточного слоя сжатия ответов, если вы:
Как правило, любой ответ, не сжатый в собственном коде, может воспользоваться сжатием отклика. Ответы, не сжатые в собственном коде, обычно включают: CSS, JavaScript, HTML, XML и JSON. Не следует сжимать собственные сжатые ресурсы, такие как PNG-файлы. Если вы пытаетесь дополнительно сжать собственный сжатый ответ, любое небольшое дополнительное уменьшение размера и времени передачи, скорее всего, затмевает время, задавленное для обработки сжатия. Не сжимайте файлы меньше 150–1000 байт (в зависимости от содержимого файла и эффективности сжатия). Накладные расходы на сжатие небольших файлов могут создать сжатый файл больше, чем несжатый файл.
Когда клиент может обрабатывать сжатое содержимое, клиент должен сообщить серверу о своих возможностях, отправив Accept-Encoding
заголовок с запросом. Когда сервер отправляет сжатое содержимое, он должен содержать сведения в заголовке Content-Encoding
о кодировании сжатого ответа. Обозначения кодировки содержимого, поддерживаемые ПО промежуточного слоя, показаны в следующей таблице.
Значения заголовков Accept-Encoding |
Поддерживаемые ПО промежуточного слоя | Description |
---|---|---|
br |
Да (по умолчанию) | Формат сжатых данных Brotli |
deflate |
No | Формат сжатых данных Deflate |
exi |
No | Эффективный обмен XML W3C |
gzip |
Да | Формат файлов gzip |
identity |
Да | Идентификатор "Нет кодирования": ответ не должен быть закодирован. |
pack200-gzip |
No | Формат сетевой передачи для архивов Java |
* |
Да | Любая доступная кодировка содержимого не запрашивается явным образом |
Дополнительные сведения см. в списке кодирования официального содержимого IANA.
ПО промежуточного слоя позволяет добавлять дополнительные поставщики сжатия для пользовательских Accept-Encoding
значений заголовков. Дополнительные сведения см. в разделе "Настраиваемые поставщики " ниже.
ПО промежуточного слоя может реагировать на значение качества (qvalue, q
) вес при отправке клиентом для определения приоритетов схем сжатия. Дополнительные сведения см. в статье RFC 9110: Accept-Encoding.
Алгоритмы сжатия подвергаются компромиссу между скоростью сжатия и эффективностью сжатия. Эффективность в этом контексте относится к размеру выходных данных после сжатия. Наименьший размер достигается наиболее оптимальным сжатием.
Заголовки, связанные с запросом, отправкой, кэшированием и получением сжатого содержимого, описаны в таблице ниже.
Верхний колонтитул | Роль |
---|---|
Accept-Encoding |
Отправляется от клиента на сервер, чтобы указать схемы кодирования содержимого, приемлемые для клиента. |
Content-Encoding |
Отправляется с сервера на клиент, чтобы указать кодировку содержимого в полезных данных. |
Content-Length |
При сжатии заголовок удаляется, Content-Length так как содержимое тела изменяется при сжатии ответа. |
Content-MD5 |
При сжатии заголовок удаляется, Content-MD5 так как содержимое тела изменилось, и хэш больше не действителен. |
Content-Type |
Указывает тип MIME содержимого. Каждый ответ должен указывать его Content-Type . По промежуточному слоя проверяет это значение, чтобы определить, следует ли сжать ответ. ПО промежуточного слоя задает набор типов MIME по умолчанию, которые он может кодировать, но можно заменить или добавить типы MIME. |
Vary |
При отправке сервером со значением Accept-Encoding клиентов и прокси-серверов Vary заголовок указывает клиенту или прокси-серверу, что он должен кэшировать (изменять) ответы в зависимости от значения Accept-Encoding заголовка запроса. Результат возврата содержимого с Vary: Accept-Encoding заголовком заключается в том, что сжатые и несжатые ответы кэшируются отдельно. |
Ознакомьтесь с функциями ПО промежуточного слоя сжатия ответов с помощью примера приложения. Пример иллюстрирует следующее:
В следующем коде показано, как включить ПО промежуточного слоя сжатия ответа для типов MIME по умолчанию и поставщиков сжатия (Brotli и Gzip):
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseResponseCompression();
}
}
Примечания:
app.UseResponseCompression
необходимо вызвать перед любым ПО промежуточного слоя, которое сжимает ответы. Дополнительные сведения см. в статье ПО промежуточного слоя ASP.NET Core.Accept-Encoding
заголовок запроса и исследовать заголовки ответа, размер и текст.Отправьте запрос в пример приложения без заголовка Accept-Encoding
и обратите внимание, что ответ не сжат. Заголовки Content-Encoding
и Vary
заголовки не присутствуют в ответе.
Отправьте запрос в пример приложения с заголовком Accept-Encoding: br
(сжатие Brotli) и обратите внимание, что ответ сжимается. В Content-Encoding
ответе присутствуют заголовки Vary
.
BrotliCompressionProvider Используйте для сжатия ответов с форматом сжатых данных Brotli.
Если поставщики сжатия явно не добавляются в :CompressionProviderCollection
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression();
}
Поставщик сжатия Brotli должен быть добавлен при явном добавлении любых поставщиков сжатия:
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" });
});
}
Задайте для уровня сжатия значение BrotliCompressionProviderOptions. Поставщик сжатия Brotli по умолчанию использует самый быстрый уровень сжатия (CompressionLevel.Fastest), который может не производить наиболее эффективное сжатие. Если необходимо максимально эффективное сжатие, настройте ПО промежуточного слоя для оптимального сжатия.
Compression Level | Description |
---|---|
CompressionLevel.Fastest | Сжатие должно выполняться как можно быстрее, даже если результирующий результат не является оптимальным сжатием. |
CompressionLevel.NoCompression | Сжатие не должно выполняться. |
CompressionLevel.Optimal | Ответы должны быть оптимально сжаты, даже если сжатие занимает больше времени. |
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression();
services.Configure<BrotliCompressionProviderOptions>(options =>
{
options.Level = CompressionLevel.Fastest;
});
}
Используйте для GzipCompressionProvider сжатия ответов с форматом файла Gzip.
Если поставщики сжатия явно не добавляются в :CompressionProviderCollection
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression();
}
Поставщик сжатия Gzip должен быть добавлен при явном добавлении любых поставщиков сжатия:
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" });
});
}
Задайте для уровня сжатия значение GzipCompressionProviderOptions. Поставщик сжатия Gzip по умолчанию использует самый быстрый уровень сжатия (CompressionLevel.Fastest), который может не производить наиболее эффективное сжатие. Если необходимо максимально эффективное сжатие, настройте ПО промежуточного слоя для оптимального сжатия.
Compression Level | Description |
---|---|
CompressionLevel.Fastest | Сжатие должно выполняться как можно быстрее, даже если результирующий результат не является оптимальным сжатием. |
CompressionLevel.NoCompression | Сжатие не должно выполняться. |
CompressionLevel.Optimal | Ответы должны быть оптимально сжаты, даже если сжатие занимает больше времени. |
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression();
services.Configure<GzipCompressionProviderOptions>(options =>
{
options.Level = CompressionLevel.Fastest;
});
}
Создание пользовательских реализаций сжатия с ICompressionProviderпомощью . Представляет EncodingName кодировку содержимого, которая производится ICompressionProvider
. По промежуточному слоям эти сведения используются для выбора поставщика на основе списка, указанного в Accept-Encoding
заголовке запроса.
С помощью примера приложения клиент отправляет запрос с заголовком Accept-Encoding: mycustomcompression
. ПО промежуточного слоя использует пользовательскую реализацию сжатия и возвращает ответ с заголовком Content-Encoding: mycustomcompression
. Клиент должен иметь возможность распаковывать настраиваемую кодировку для работы пользовательской реализации сжатия.
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;
}
}
Отправьте запрос в пример приложения с заголовком Accept-Encoding: mycustomcompression
и просмотрите заголовки ответа. В Vary
ответе присутствуют заголовки Content-Encoding
. Текст ответа (не показан) не сжимается образцом. В классе примера отсутствует реализация CustomCompressionProvider
сжатия. Однако в примере показано, где будет реализован такой алгоритм сжатия.
ПО промежуточного слоя задает набор типов MIME по умолчанию для сжатия:
application/javascript
application/json
application/xml
text/css
text/html
text/json
text/plain
text/xml
Замените или добавьте типы MIME с параметрами по промежуточного слоя сжатия ответа. Обратите внимание, что типы MIME с подстановочными знаками, такие как text/*
не поддерживаются. Пример приложения добавляет тип MIME для image/svg+xml
и сжимает и обслуживает образ баннера ASP.NET Core (banner.svg).
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" });
});
}
Сжатые ответы по защищенным подключениям можно контролировать с EnableForHttps
помощью параметра, который по умолчанию отключен. Использование сжатия с динамически созданными страницами может привести к проблемам безопасности, таким как CRIME атаки и BREACH атаки.
При сжатие ответов на Accept-Encoding
основе заголовка могут быть несколько сжатых версий ответа и несжатой версии. Чтобы указать клиентским и прокси-кэшам, которые существуют и должны храниться несколько версий, Vary
заголовок добавляется со значением Accept-Encoding
. В ASP.NET Core 2.0 или более поздней версии ПО промежуточного слоя автоматически добавляет Vary
заголовок при сжатии ответа.
При использовании запроса nginx Accept-Encoding
заголовок удаляется. Удаление заголовка предотвращает сжатие ответа ПО промежуточного Accept-Encoding
слоя. Дополнительные сведения см. в разделе NGINX: Сжатие и декомпрессия. Эта проблема отслеживается путем определения сквозного сжатия для Nginx (dotnet/aspnetcore#5989).
Если у вас есть активный модуль динамического сжатия IIS, настроенный на уровне сервера, который вы хотите отключить для приложения, отключите модуль с добавлением к файлу web.config . Дополнительные сведения см. в разделе Отключение модулей IIS.
Используйте средство, например Fiddler или Firefox Browser Developer, которое позволяет задавать Accept-Encoding
заголовок запроса и изучать заголовки ответа, размер и текст. По умолчанию ПО промежуточного слоя сжатия ответа сжимает ответы, соответствующие следующим условиям:
Accept-Encoding
присутствует со значением br
, gzip
*
или пользовательской кодировкой, которая соответствует установленному поставщику пользовательского сжатия. Значение не должно быть identity
или иметь значение качества (qvalue, q
) значение 0 (ноль).Content-Type
) должен быть задан и должен соответствовать типу MIME, настроенного для него ResponseCompressionOptions.Content-Range
заголовок.Отзыв о ASP.NET Core
ASP.NET Core — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
События
Чемпионат мира Power BI DataViz
14 февр., 16 - 31 мар., 16
С 4 шансами войти, вы можете выиграть пакет конференции и сделать его в LIVE Grand Finale в Лас-Вегасе
Подробнее