Как использовать сжатие ответов в ASP.NET Core

автор vadim


Будучи совершенно современной веб-платформой, ASP.NET Core имеет встроенную поддержку сжатия ответов, что позволяет уменьшить размер ответов и сократить время ответа. В этой статье мы рассмотрим, как работает сжатие ответов и как мы можем использовать промежуточное ПО для сжатия ответов в ASP.NET Core.

Сжатие — это простой способ уменьшить сетевой трафик и увеличить скорость связи между ресурсами веб-сервера и клиентами или потребителями. Популярные алгоритмы, доступные для достижения этого сжатия, включают Brotli, Gzip и Deflate, и большинство современных веб-браузеров поддерживают сжатие ответов. ПО промежуточного слоя для сжатия ответов ASP.NET Core по умолчанию использует сжатие Brotli или Gzip, в зависимости от того, какое из них поддерживается клиентом.

Здесь мы реализуем сжатие ответов с помощью промежуточного программного обеспечения. Обратите внимание, что если ваше приложение ASP.NET Core развертывается на веб-сервере IIS, Apache или Nginx, вместо этого следует использовать встроенное сжатие, предоставляемое веб-сервером, для повышения производительности. Используйте ПО промежуточного слоя для сжатия ответов, только если вы не можете использовать сжатие веб-сервера или если ваше приложение размещается на веб-сервере, на котором отсутствует встроенное сжатие, например Kestrel.

Обратите внимание, что конвейер приложений в ASP.NET Core содержит ряд делегатов запросов, которые вызываются последовательно. Мы воспользуемся преимуществами одного из этих компонентов промежуточного программного обеспечения для реализации сжатия запросов. Конвейер ПО промежуточного слоя настраивается в файле Program.cs. Здесь вы можете объединить конвейер ASP.NET Core. Мы обсудим это далее в следующих разделах.

Создайте минимальный проект веб-API ASP.NET Core в Visual Studio 2022.

Прежде всего, давайте создадим минимальный проект веб-API ASP.NET Core 7 в Visual Studio 2022. Выполните следующие действия:

  1. Запустите интегрированную среду разработки Visual Studio 2022.
  2. Нажмите «Создать новый проект».
  3. В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
  4. Нажмите “Далее.
  5. В окне «Настроить новый проект» укажите имя и расположение нового проекта.
  6. При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
  7. Нажмите “Далее.
  8. В окне «Дополнительная информация», показанном далее, выберите «NET 7.0 (Current)» в качестве платформы и снимите флажок «Использовать контроллеры…». В этом примере мы будем использовать минимальное количество API. Оставьте для параметра «Тип аутентификации» значение «Нет» (по умолчанию).
  9. Убедитесь, что все флажки «Включить Docker», «Настроить для HTTPS» и «Включить поддержку Open API» сняты. Мы не будем использовать ни одну из этих функций здесь.
  10. Щелкните Создать.

Затем установите пакет Microsoft ResponseCompression с помощью диспетчера пакетов NuGet в только что созданном минимальном проекте веб-API ASP.NET Core. На момент написания этой статьи последняя стабильная версия пакета ResponseCompression — 2.2.0.

> Install-Package Microsoft.AspNetCore.ResponseCompression -Version 2.2.0

Мы будем использовать этот минимальный проект веб-API ASP.NET Core 7 для реализации сжатия ответов в следующих разделах.

Настройка сжатия ответов в ASP.NET Core

Вы можете включить сжатие ответов в файле Program.cs, используя следующий код.

builder.Services.AddResponseCompression();

Приведенный выше фрагмент кода добавит в контейнер службы сжатия ответов. Если вы хотите включить сжатие ответа для HTTPS, вы должны ввести следующий фрагмент кода в файл Program.cs:

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

Чтобы добавить промежуточное ПО для сжатия ответов в конвейер обработки запросов, чтобы динамически сжимать ответы, вы должны настроить конвейер HTTP-запросов, используя следующий фрагмент кода.

app.UseResponseCompression();

Настройка поставщиков сжатия для оптимальной производительности

Обратите внимание, что после добавления поставщика сжатия никакие другие поставщики сжатия добавляться автоматически не будут. Вам нужно будет написать свой собственный код, чтобы добавить их по мере необходимости.

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

Вы можете настроить поставщиков сжатия Brotli и Gzip для оптимальной производительности (что означает более быстрое сжатие, но большую полезную нагрузку), как показано во фрагменте кода, приведенном ниже.

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

Полный исходный код файла Program.cs

Вот полный исходный код файла Program.cs для справки.

using Microsoft.AspNetCore.ResponseCompression;
using System.IO.Compression;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
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.Optimal;
});
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseResponseCompression();
app.MapGet("https://www.infoworld.com/", () => "Hello World!");
app.Run();

Создание собственного поставщика сжатия в ASP.NET Core.

Вы также можете создавать свои собственные поставщики сжатия и распаковки в минимальных API-интерфейсах ASP.NET Core.

Чтобы создать собственный поставщик сжатия, сначала создайте класс, реализующий интерфейс ICompressionProvider, как показано ниже.

public class CustomCompressionProvider : ICompressionProvider
{
    public Stream CreateStream(Stream outputStream)
    {
        // Write your code here to compress
        return outputStream;
    }
}

Затем зарегистрируйте и настройте пользовательский поставщик сжатия в Program.cs, используя приведенный ниже код.

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("https://www.infoworld.com/", () => "Hello World!");
app.Run();

Реализовать контроллер в ASP.NET Core

Теперь, когда в проекте установлено и настроено сжатие ответов, давайте реализуем контроллер для демонстрации сжатия ответов. Для этого выберите папку решения Controllers вашего проекта и нажмите Add -> Controller. Выберите шаблон «Контроллер API — пустой» из списка шаблонов, отображаемых в окне «Добавить шаблон», и введите имя. для контроллера при появлении запроса. Затем замените код по умолчанию следующим.

[Produces("application/json")]
    [Route("api/Default")]
    public class DefaultController : Controller
    {
        // GET: api/Default
        [HttpGet]
        public List<Message> Get()
        {
            List<Message> lst = new List<Message>();
            for(int index=0; index <100; index++)
            {
                Message message = new Message();
                message.Text = “This is a text message.”;
                lst.Add(message);
            }
            return lst;
        }
    }

Класс Message содержит только одно строковое свойство.

public class Message
    {
        public string Text { get; set; }
    }

Когда я выполнил этот метод контроллера, я увидел, что размер сжатого ответа составляет 0,091 КБ. Когда сжатие было отключено, размер ответа составлял 3,419 КБ. Чтобы отключить сжатие ответа, вы можете просто закомментировать соответствующие строки в файле Program.cs.

//builder.Services.AddResponseCompression();
//app.UseResponseCompression();

Чтобы сжатие ответа работало, клиент должен сообщить серверу о своих возможностях, отправив заголовок Accept-Encoding вместе с запросом. Сервер, в свою очередь, должен включить этот заголовок в сжатый ответ, чтобы сообщить клиенту, что ответ был сжат.

Обратите внимание, что хотя сжатие ответов в ASP.NET Core является гибким, простым в настройке и использовании, оно медленнее, чем сжатие IIS. Вы захотите полагаться на сжатие, предоставляемое IIS и другими веб-серверами, когда это возможно. Вы можете узнать больше о сжатии ответов в ASP.NET Core из документации Microsoft ASP.NET Core.

Использование сжатия HTTPS

Обратите внимание, что сжатие через HTTPS может подвергнуть конфиденциальные данные атакам CRIME и BREACH. Злоумышленник может перехватить сжатый трафик HTTPS, чтобы украсть учетные данные или файлы cookie сеанса, что ставит под угрозу безопасность приложения. Вы можете предотвратить такие атаки, настроив веб-сервер на использование TLS вместо сжатия HTTPS.

Сжатие TLS сжимает данные на более высоком уровне, чем HTTPS, что затрудняет их использование злоумышленниками. В отличие от традиционных методов сжатия, которые сжимают содержимое на прикладном уровне, сжатие TLS сжимает данные на транспортном уровне.

Related Posts

Оставить комментарий