GZIP in .net core not working Unable to resolve service for type 'Microsoft.AspNetCore.ResponseCompression.IResponseCompressionProvider'

2022-11-25 11:03:52.057 +08:00 [FTL] Application startup exception
System.InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.ResponseCompression.IResponseCompressionProvider' while attempting to activate 'Microsoft.AspNetCore.ResponseCompression.ResponseCompressionMiddleware'.
   at Microsoft.Extensions.Internal.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
   at Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
   at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.<>c__DisplayClass5_0.<UseMiddleware>b__0(RequestDelegate next)
   at Microsoft.AspNetCore.Builder.ApplicationBuilder.Build()
   at Microsoft.AspNetCore.Builder.WebApplicationBuilder.<ConfigureApplication>b__27_0(RequestDelegate next)
   at Microsoft.AspNetCore.Builder.ApplicationBuilder.Build()
   at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

 

GZIP in .net core not working

回答1

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;
  });

}

 

回答2

 

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.

 

 

posted @ 2022-11-25 11:34  ChuckLu  阅读(201)  评论(0编辑  收藏  举报