35

I'm attempting to add Gzip middleware to my ASP.net core app.

I have added the following package :

"Microsoft.AspNetCore.ResponseCompression": "1.0.0"

In my startup.cs for the Configure Services method I have the following :

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

    services.AddMvc();
}

In my Configure method I have the following :

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

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

However when I try and load a page, it doesn't come through as Gzip compressed. I have used both a string response and outputting a view. The response headers in chrome look like :

enter image description here

I am on a windows machine developing in visual studio. When running the app I have tried just running from Visual Studio (Via F5), and also using the "dotnet run" command from command line. Neither output GZip compression.

7
  • I'm not able to reproduce this. I added the Nuget package and configured it just like you did, and see the Content-Encoding:gzip in the response headers in chrome after I ran it from within VS 2015.
    – Shiva
    Commented Jan 19, 2017 at 1:58
  • @Shiva, Are you able to pastebin your project.json for me. Commented Jan 19, 2017 at 2:26
  • Here you go. The Nuget package should automatically have added ` "Microsoft.AspNetCore.ResponseCompression": "1.0.0"` dependency to your project.json file. Here's mine => pastebin.com/HeXD1GfY
    – Shiva
    Commented Jan 19, 2017 at 2:47
  • 2
    I have to duck out but first thing I notice, I am targeting framework 1.1 not 1.0. Will try it in 1.0. Commented Jan 19, 2017 at 2:54
  • 1
    By default, the compression is disabled on secure connections (https). From my tests, the compression does work with .Net core 1.1. I also blogged about enabling gzip compression with ASP.NET Core.
    – meziantou
    Commented Jan 19, 2017 at 10:08

7 Answers 7

44

To Enable GZIP in .net core 2.*
1. Install Microsoft.AspNetCore.ResponseCompression with Install-Package Microsoft.AspNetCore.ResponseCompression command or nuget package manager.
2. Add the following code into 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;
  });

}
5
  • 4
    I was missing the EnableForHttps. I wonder why the default value is false :'(
    – hoang
    Commented Mar 19, 2019 at 15:05
  • 2
    I guess it's because it mitigates the BREACH attack (en.wikipedia.org/wiki/BREACH).
    – pvasek
    Commented Oct 18, 2019 at 9:54
  • 2
    @pvasek you guessed right: learn.microsoft.com/en-us/aspnet/core/performance/…
    – Lucius
    Commented Oct 22, 2019 at 23:30
  • + EnableForHttps helped and order was important (put all configs on the top) Commented May 1, 2020 at 23:24
  • 1
    This only works in release for me. Net 6
    – async
    Commented Apr 8, 2022 at 7:50
13

The answear from Mohammad Dayyan works great for compressing the HTML body. If you want to compress also static client files like CSS or JS, the Startup.Configure method must look like this:

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

It's important to place app.UseResponseCompression() before app.UseStaticFiles(). Otherwise the static file handler sends the ressource to the client without applying any compression.

You can also add a black/or whitelist for mime types to compress in 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>();
});

Excluding specific mime types is also possible due to the options.ExcludedMimeTypes property.

Yes, there are good arguments to keep such things seperated from the application server and use some reverse proxy for things like compression. This also allows the usage of the more effective Brotli algorithm in ASP.NET Core 2.1 LTS, which is officially only avaliable for the new 2.2 release (except custom middlewares relying on third party libraries).

This was also my first idea, but it seems that nginx 1.17.3 currently doesn't playing well with gzip and ASP.NET Core 2.1. After enabling gzip, I get randomly FormatException: Invalid ETag name exceptions. So it seems a suiteable workaround for me to let .NET Core do this job.

10

Got this issue resolved by adding response compression option property "EnableForHttps" as shown below:

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

Solved it by putting

app.UseResponseCompression();

before

app.UseMvc();

in Startup.Configure, i.e:

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

        app.UseResponseCompression(); // <--
        app.UseHttpsRedirection();
        app.UseMvc(); // <--
    }
1
  • Also before any app.UseEndpoints( ... ) Commented Feb 13 at 9:28
2

I managed to enable the Response Compression Middleware when using IIS Express by removing

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

in .vs\config\applicationhost.config

0

By placing the UseResponseCompression twice under each other I managed to make it work. I have no idea how this made it work. I am still looking for an accepted solution.

1
  • 1
    You sound like the OP, but the account isn't.
    – VMAtm
    Commented Jun 12, 2017 at 20:26
0

Here is my solution:

  1. Make sure your Fiddler's "Decode" function is disabled. And you can see a yellow bar in the response. Disable Decode

  2. Or exit Fillder or other proxy app and have a try.

Not the answer you're looking for? Browse other questions tagged or ask your own question.