Не работает GZIP в .net

Я пытаюсь добавить промежуточное ПО Gzip в основное приложение ASP.net.

Я добавил следующий пакет:

"Microsoft.AspNetCore.ResponseCompression": "1.0.0"

В моем startup.cs для метода Configure Services у меня есть следующее:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<GzipCompressionProviderOptions>(options => options.Level = CompressionLevel.Fastest);
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<GzipCompressionProvider>();
    });

    services.AddMvc();
}

В моем методе Configure у меня есть следующее:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.UseResponseCompression();
    app.UseMvc();
}

Однако, когда я пытаюсь загрузить страницу, она не проходит через сжатие Gzip. Я использовал как строковый ответ, так и вывод. Заголовки ответов в хроме выглядят так:

введите описание изображения здесь

Я нахожусь на оконной машине, развивающейся в визуальной студии. При запуске приложения я попытался запустить только из Visual Studio (через F5), а также с помощью команды "dotnet run" из командной строки. Не выводится сжатие GZip.

Ответ 1

Включение GZIP в ядре.net 2. *
1. Установите Install-Package Microsoft.AspNetCore.ResponseCompression Microsoft.AspNetCore.ResponseCompression с помощью Install-Package Microsoft.AspNetCore.ResponseCompression Команда Install-Package Microsoft.AspNetCore.ResponseCompression или менеджер пакетов nuget.
2. Добавьте следующий код в Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{

  app.UseResponseCompression();
  app.UseMvc();

}

public void ConfigureServices(IServiceCollection services)
{

  // Configure Compression level
  services.Configure<GzipCompressionProviderOptions>(options => options.Level = CompressionLevel.Fastest);

  // Add Response compression services
  services.AddResponseCompression(options =>
  {
      options.Providers.Add<GzipCompressionProvider>();
      options.EnableForHttps = true;
  });

}

Ответ 2

Эта проблема была решена путем добавления свойства опции сжатия ответа "EnableForHttps", как показано ниже:

services.AddResponseCompression(opt =>
        {
            opt.Providers.Add<GzipCompressionProvider>();
            opt.EnableForHttps = true;
        });
 services.Configure<GzipCompressionProviderOptions>(options => options.Level = 
 CompressionLevel.Fastest);

Ответ 3

Мне удалось включить Middleware Middleware при использовании IIS Express, удалив

<httpCompression ...> 
...
</httpCompression> 

в .vs\config\applicationhost.config

Ответ 4

Ответ от Мохаммеда Даяна отлично подходит для сжатия тела HTML. Если вы хотите сжать также статические клиентские файлы, такие как CSS или JS, метод Startup.Configure должен выглядеть следующим образом:

app.UseResponseCompression();
app.UseStaticFiles();

Важно разместить app.UseResponseCompression() перед app.UseStaticFiles(). В противном случае обработчик статического файла отправляет ресурс клиенту без применения какого-либо сжатия.

Вы также можете добавить черный/или белый список для типов пантомимы для сжатия в AddResponseCompression:

services.Configure<GzipCompressionProviderOptions>(options => options.Level = CompressionLevel.Fastest);
services.AddResponseCompression(options => {
    options.MimeTypes = new string[]{
        "text/html",
        "text/css",
        "application/javascript",
        "text/javascript"
        // ...
    };

    options.Providers.Add<GzipCompressionProvider>();
});

Исключение определенных типов пантомимы также возможно благодаря свойству options.ExcludedMimeTypes.

Да, есть хорошие аргументы, чтобы отделить такие вещи от сервера приложений и использовать некоторый обратный прокси для таких вещей, как сжатие. это также позволяет использовать более эффективный алгоритм Бротли в ASP.NET Core 2.1 LTS, который официально доступен только для нового выпуска 2.2 (за исключением пользовательских промежуточных программ, использующих сторонние библиотеки).

Это была также моя первая идея, но похоже, что nginx 1.17.3 в настоящее время не очень хорошо работает с gzip и ASP.NET Core 2.1. После включения gzip я получаю случайные исключения FormatException: Invalid ETag name. Поэтому мне кажется подходящим обходным путем, позволяющим .NET Core выполнять эту работу.

Ответ 5

Поместив UseResponseCompression дважды друг под друга, мне удалось заставить его работать. Я понятия не имею, как это заставило его работать. Я все еще ищу приемлемое решение.

Ответ 6

Решил это, поставив

app.UseResponseCompression();

Перед

app.UseMvc();

в Startup.Configure, т.е.

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

        app.UseResponseCompression(); // <--
        app.UseHttpsRedirection();
        app.UseMvc(); // <--
    }