Воспользуйтесь преимуществами компонента промежуточной обработки для сжатия ответов (Response Compression Middleware) в ASP.Net Core, чтобы снизить требования к пропускной способности и повысить оперативность ваших приложений.

ASP.Net Core — это открытая, кросс-платформенная и модульная среда для создания высокопроизводительных веб-приложений. Вы можете запускать приложения ASP.Net Core в Windows, Linux и даже MacOS. Полностью современная веб-инфраструктура, ASP.Net Core имеет встроенную поддержку сжатия ответов, позволяя уменьшить размер ответов и сократить время отклика. В этой статье мы рассмотрим, как работает сжатие ответов и как мы можем использовать компонент промежуточной обработки для сжатия ответов в ASP.Net Core.

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

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

Создание приложения ASP.Net Core


Предполагая, что вы используете Visual Studio Community Edition 2017 и .Net Core уже установлен, выполните следующие действия, чтобы создать первое приложение ASP.Net Core в Visual Studio.

  1. В Visual Studio IDE, нажмите File -> New -> Project.
  2. Выберите «ASP.Net Core Web Application (.Net Core)» из списка шаблонов.
  3. Выберите Web Application.
  4. Введите имя приложения и нажмите OK.
  5. В окне «New ASP.NET Core Web Application» — выберите ".Net Core and ASP.Net Core 2.0."
  6. Затем выберите шаблон «Web API», снимите галочку «Enable Docker Support», и нажмите OK.

Теперь, когда вы создали проект ASP.Net Core, установите пакет ResponseCompression через диспетчер пакетов NuGet, чтобы включить сжатие Gzip в только что созданном проекте ASP.Net Core.

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

На момент написания этой статьи последняя стабильная версия этого пакета — 2.0.1.

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


После установки пакета ResponseCompression следующий шаг — настроить его. Для этого вам нужно будет отредактировать файл Startup.cs и включить сжатие с помощью методов ConfigureServices и Configure. Метод ConfigureServices используется для добавления сервисов в контейнер, а метод Configure используется для настройки конвейера HTTP-запросов. Обратите внимание, что оба метода автоматически запускаются во время выполнения.

Вот как сделать добавление сжатия ответа в методе ConfigureServices файла Startup.cs.

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

Следующий фрагмент кода иллюстрирует метод Configure. Здесь мы добавили промежуточную обработку для сжатия к конвейеру перед другой обработкой.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseResponseCompression();
            app.UseMvc();
        }

Внедрение контроллера в ASP.Net Core


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

[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 содержит только одно свойство string.

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

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

В методе ConfigureServices:

//services.AddResponseCompression();

В методе Configure:

//app.UseResponseCompression();

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

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

Комментарии (4)


  1. sombik
    27.02.2018 13:30

    Вы указали только использование. Но ведь реальных ситуаций использование данного сжатия — массы. Мне, например, понадобилось нечто большее, чем просто сжатие.

     services.AddResponseCompression(
                    options =>
                    {
                        options.Providers.Add<GzipCompressionProvider>();
                        // if u need custom comression provider -> https://docs.microsoft.com/en-us/aspnet/core/performance/response-compression
                        //options.Providers.Add<CustomCompressionProvider>();
                        options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] { "application/font-woff2", "application/font-woff", "application/font", "font/opentype" });
                    }
                );

    Можете добавить свой провайдет сжатия или указать ему необходимые настройки. Также и пример работы со сжатием шрифтов и прочего.


    1. afrikyan Автор
      27.02.2018 13:31

      Согласен. Простор для применения огромен


  1. sergeyZ
    27.02.2018 14:41

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

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


    1. afrikyan Автор
      27.02.2018 14:51

      Это базовая вводная статья. Все нюансы про HTTPS,CompressionLevel,MIME types и прочее —

      Больше о сжатии ответа в ASP.Net Core в документации Microsoft ASP.NET Core.
      :)