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.
作者:Chuck Lu GitHub |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2017-11-25 使用fiddler模拟http get
2017-11-25 SSL/TLS协议运行机制的概述
2017-11-25 风暴英雄 http 302重定向 正在等待游戏模式下载完成
2016-11-25 LabelControl文本居中显示
2015-11-25 军校退学